C#’ta Value Type ve Reference Type

Merhabalar,

Bu yazımda kod yazarken sıklıkla kullandığımız değişkenler ve nesnelerin aslında ne olduklarına, nerelerde tutulduklarına ve farklarına değinmek için Value Type ve Reference Type kavramlarını ele alacağım.

C# dilinde veri tipleri, value type ve reference type olmak üzere ikiye ayrılır. Bildiğimiz üzere değişkenler, bellekte tutulan verilerdir. Bir değişkeni kullanırken aslında o değişkenin, bellekte tutulduğu adresindeki veriye ulaşırız. Value type’lar değişkenin değerini direkt olarak bellek bölgesinden alırken, reference type’lar ise başka bir nesneye referans olarak kullanılırlar. Value type’lar stack dediğimiz bellek bölgelerinde oluşturulurlar, reference type’lar ise heap alanında oluşturulan veri türlerinin (nesnelerin) adreslerini saklarlar.

Temel veri tipleri olan int, double, float ve struct gibi veri türleri value type; herhangi bir sınıf türü ise (string, object) reference type’tır.

İki value type nesnesini birbirine eşitlerken değişkenlerde saklanan değerler kopyalanarak eşitlenir ve bu durumda iki yeni bağımsız nesne elde edilmiş olur yani birinin değerini değiştirmek diğerini etkilemez.

Ancak iki reference type’ı birbirlerine eşitlediğimizde bu nesnelerde tutulan veriler kopyalanmaz, işlem yapılan nokta nesnelerin heap bölgesindeki adresleridir, yani iki nesne de aslında heap bellek bölgesinde aynı adresi gösterecekleri için birinde yapılan değişiklik diğerini de etkileyecektir.

C# dilinde önceden tanımlanmış iki tane temel reference type vardır: string ve Object.

Object, C#’ta bütün veri türlerinin türediği bir veri türüdür. Her nesne bir object olduğu için bütün değerler ve nesneler object türünden bir değişkene atanabilir.

string, Unicode karakterlerinden oluşan bir dizi gibi algılanabilir. C ve C++ gibi dillerde string işlemlerini yapabilmek için karakter dizileri tanımlanır ve bunlar string olarak işleme alınırlar. C#’ta ise bu karakter dizilerini tanımlamak yerine string adlı yeni bir tür kullanılır.