Alıştırma-başvuru türleri

Tamamlandı

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 new iş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.