.NET ortamında yazmış olduğumuz programlarda kullandığımız değişken türleri ikiye ayrılmaktadır. Bunlar değer türleri (value types) ve referans türleri (reference types) dir.
Değer Türleri (Value Types) : Doğrudan veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türüdür. Değer türleri bellekte az yer kaplar ve kendilerine hızlı bir şekilde erişilir. Değer türleri belleğin stack dediğimiz kısmında saklanır.
Referans Türleri (Reference Types): Referans türlerinde aynen değer türlerinde olduğu gibi veri ram üzerinde stack alanında saklanır. Ayrıca ram üzerindeki heap denilen bölgede de verinin (nesnenin) adresini tutar. Burada daha fazla bellek kullanılır ve erişim daha zordur.
Aşağıda değer ve referans türlerine ait temel veri tipleri görülmektedir.

Değer türleri ile Referans türleri arasındaki en önemli fark belleğin farklı alanlarında depolanıyor olmalarıdır. Değer türleri stack, referans türleri ise heap alanında tutulur.
Bu iki tür arasındaki diğer bir fark ise; Değer türündeki bir değişkenin değeri başka bir değişkene atanırsa veri değeri kopyalanmış olunur. Referans türünde ise veri değerleri kopyalanmaz sadece bellekte bulunan adresi kopyalanır.
Bu anlattığımız kopyalanma olayını bir örnek üzerinde inceleyelim. Ben formun tasarımını aşağıdaki gibi yaptım.

Amacımız değer ve referans türünden oluşturulmuş değişkenlerin değerlerinin bir başka değişkene atandığında meydana gelen değişikliğin neler olduğunu anlamaya çalışmak. Kod tarafına geçiyoruz.
Form1.cs
private void buttonValue_Click(object sender, EventArgs e)
{
int x = 50;
int y = x;
y = Convert.ToInt32(textBox1.Text);
label2.Text = x.ToString();
// y değişkeninin değerine x'i atadıkdan sonra. y değişkeninin alacağı değeri textboxdan girilen değere eşitledik. fakat labela y değerini yazdırmak istediğimiz zaman textboxdan girilen değer yerine 50 değerini yazdı.
}
public class Kopyalama
{
int x;
public int X
{
get { return x; }
set { x = value; }
}
} // ufak bir class tanımlaması yaptık
private void buttonReference_Click(object sender, EventArgs e)
{
Kopyalama ref1 = new Kopyalama();
ref1.X = 50;
Kopyalama ref2 = ref1;
ref2.X = Convert.ToInt32(textBox2.Text);
label4.Text = ref1.X.ToString();
// burada ref1 isminde Kopyalama sınıfından yeni bir nesne türettik ve değerini 50 olarak belirledik. Daha sonra Kopyalama sınıfından ref2 isimli yeni bir nesne türettik ve bunu ref1 nesnesine eşitledik. Sonrasında ref2 nesnesinin değerini textboxdan girilecek olan değere eşitledik. Bu sefer ilk verilen değer yerine textboxdan girilen değer gösterildi.
}

Şimdi nerede ne oldu onu anlamaya çalışalım. Biz burada x isimli değişkeni y isimli değişkene kopyaladıktan sonra stack üzerinde y için ayrı bir alan ayrıldı. Böylece her iki değişken birbirini etkilemeyerek farklı bellek adreslerinde tutuldu.
ref1 değişkeni ref2 değişkenine kopyalandığı zaman başvurulan nesnenin kendisi değil adresi ref2'ye kopyalanmış oldu. Böylece stack üzerinde farklı adreslerde bulunan ref1 ve ref2 değişkenleri aynı yeri ve heap üzerinde bulunan aynı adresi (Kopyalama nesnesinin yeri) göstermiş oldu.
Evet arkadaşlar bu yazımda değer ve referans türlerinin ne anlama geldiğini ve ram üzerinde hangi alanlarda saklandıklarını anlatmaya çalıştım.
Hepinize kolay gelsin. İyi çalışmalar.