Değer (Value) ve Referans (Reference) Tipleri
C# dilinde önceden tanımlanmış (C# dilinde varolan tipler) veri tipleri, değer tipleri ve referans tipleri olmak üzere ikiye ayrılır. Bu iki veri tipi arasındaki farkı çok iyi kavramak gerekir. Daha önce dediğimiz gibi değişkenler, bellekte tutulan verilerdir. Aslında bir değişkeni kullanırken o değişkenin bellekte tutulduğu adresteki veriye ulaşıyoruz. Değer tipleri değişkenin değerini direkt bellek bölgesinden alırlat\J£e£crans tipleri ise başka bir nesneye referansjokfak kullanılırlar. Yanfrefaransjıipleri aslında bir çeşit bellek bölgesi olan heap aitıhında yaratılan vektörlerinin (bunlara kısaca nesne de diyebiliriz) adreslerini saklarlar. Değer tipleri yaratıldıklarında stack dediğimiz bellek bölgelerinde oluşturulurlar, referans tipleri ise kullanımı biraz daha sınırlı olan heap dediğimiz bellek bölgesinde saklanırlar.
C ve C++ dillerine aşina olanların tahmin ettiği gibi gösterici (pointer) kavramı ile referans veri tipleri arasında hiçbir fark yoktur. Fakat C++ dilinde kullanıcının direkt olarak kullanabileceği bir gösterici veri türü tanımlaması yoktur. Bunun yerine bazı değişkenler değer tipleri bazıları ise referans tipleri olarak işlem görürler. Peki bunlar nelerdir? Temel veri tipleri olan int, double, float ve yapı nesneleri gibi veri türleri değer tipleri, herhangi bir sınıf türü ise referans tipidir. İki değer tipi 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 referans tipini birbirlerine eşitlediğimizde bu nesnelerde tutulan veriler kopyalanmaz, işlem yapılan nesnelerin heap bölgesindeki adresleridir, yani iki nesnede aslında heap bellek bölgesinde aynı adresi gösterecekleri için birinde yapılan değişiklik diğerini de etkileyecektir. Referans tiplerini tanımlarken herhangi bir adresi göstermediğini belirtmek için null değere atanırlar. Mesela:
y = null;
gibi bir tanımlamada y nesnesi null adrese atanmıştır, null adresler bellekte herhangi bir adrese karşılık gelmez.