Alıştırma-başvuru türleri
Başvuru türleri diziler, sınıflar ve dizeler içerir. Başvuru türleri, uygulama yürütülürken değerlerin depolanma yöntemi bakımından değer türlerinden farklı şekilde işleme alınır.
Bu alıştırmada başvuru türlerinin değer türlerinden nasıl farklılık gösterdiğini ve bir değişkeni bilgisayarın belleğindeki bir değerle ilişkilendirmek için
new işlecinin nasıl kullanılacağını öğreneceğiz.
Başvuru türlerinin değer türlerinden farkı
Bir değer türü değişkeni, değerlerini doğrudan stack (yığın) adlı bir depolama alanında depolar. Stack, koda ayrılmış olup o anda CPU üzerinde çalışan bellektir (aynı zamanda yığın çerçevesi veya etkinleştirme çerçevesi olarak bilinir). Yığın çerçevesi yürütmeyi tamamladığında yığındaki değerler kaldırılır.
Bir başvuru türü değişkeni ise değerlerini heap (yığın) adlı ayrı bir bellek bölgesinde depolar. Heap, aynı zamanda işletim sistemi üzerinde çalışan çok sayıda uygulamada paylaşılan bir bellek alanıdır. .NET Çalışma Zamanı hangi bellek adreslerinin kullanılabilir olduğunu belirlemek için işletim sistemiyle iletişim kurar ve değeri depolayabileceği bir adres ister. .NET Çalışma Zamanı değeri depolar ve ardından bellek adresini değişkene döndürür. Kodunuz değişkeni kullandığında .NET Çalışma Zamanı uygunsuz bir şekilde değişkende depolanan adresi arar ve orada depolanmış değeri alır.
Şimdi bu fikirleri daha açık bir şekilde gösteren birkaç kod yazalım.
Adım 1 - Önceki alıştırmalardan kod silme veya açıklama satırı yapma
Önceki alıştırmadan kodu seçin ve geri al ya da
del tuşunu seçin. İsteğe bağlı olarak, önceki kodu .NET Düzenleyicisi’nde açıklama satırı yapın.
Adım 2 - Bir başvuru türü değişkeni tanımlama
Aşağıdaki kod,
int dizi türündeki bir değeri tutabilecek bir değişken tanımlar.
int[] data;
Bu noktada
data yalnızca bir başvuruyu ya da bir değerin bellek adresini yığında (heap) tutabilecek bir değişkendir. Bir bellek adresini işaret etmediği için null başvuru olarak adlandırılır.
Adım 3 -
new anahtar sözcüğünü kullanarak bir
int dizisi örneği oluşturma
Aşağıdaki kodu kullanarak adım 2’deki kodu, yeni bir
int dizisi örneği oluşturup atayacak şekilde değiştirin.
int[] data; data = new int[3];
new anahtar sözcüğü, .NET Çalışma Zamanından bir
int dizisi örneği oluşturmasını ve işletim sistemi ile koordine olarak bellekte depolamasını ister. .NET Çalışma Zamanı yeni
int dizisinin bellek adresini derler ve döndürür. Son olarak, bellek adresi değişken verilerde depolanır.
int dizisinin öğeleri, bir
int türünün varsayılan değeri olduğu için varsayılan olarak
0 değerine sahiptir.
Adım 4 - Kod örneğini her iki işlemi tek bir kod satırında gerçekleştirecek şekilde değiştirin
Adım 3’teki iki kod satırı, hem değişkeni bildirmek hem de yeni bir
int dizisi örneği oluşturmak için genellikle tek kod satırına kısaltılır. Adım 3’teki kodu aşağıdakiyle değiştirin.
int[] data = new int[3];
Gözlemlenecek bir çıktı olmamasına karşın, bu alıştırmanın, C# söz diziminin başvuru türleriyle çalışma işlem adımlarıyla ilgisini biraz daha açıklığa kavuşturduğunu umuyoruz.
C# dizesi veri türü neden farklıdır?
string veri türü de bir başvuru türüdür. Bir dizeyi bildirirken neden
new işlecini kullanmadığımızı merak ediyor olabilirsiniz. Bunun tek nedeni C# tasarımcılarına kolaylık sağlamasıdır.
string veri türü çok sık kullanıldığı için şu biçimi kullanabiliriz:
string shortenedString = "Hello World!"; Console.WriteLine(shortenedString);
Ancak arka planda "Merhaba Dünya!" için yeni bir System.String örneği oluşturulur ve başlatılır.
Not
Dil tasarımcıları basitleştirilmiş bir kısayol oluşturduğunda bazı durumlarda "sentaktik şeker" olarak bilinir. Bu ifadeyi makalelerde ve sunumlarda büyük olasılıkla göreceksiniz.
Özet
- Değer türleri daha küçük değerleri tutabilir ve yığında (stack) depolanır. Başvuru türleri büyük değerleri tutabilir ve
newişleci kullanılarak bir başvuru türünün yeni bir örneği oluşturulur. Başvuru türü değişkenleri, yığında (heap) depolanmış gerçek değerin bir başvurusunu (bellek adresi) tutar.
- Başvuru türleri diziler, dizeler ve sınıfları içerir.