Yazdığımız değişkenlerin değerleri sizin de bildiğiniz gibi Ram üzerinde tutulur. Stack ve Heap de ram’in mantıksal bölümleridir. C # ‘da veri tipleri, değerlerini bellekte nasıl sakladıklarına(Stack, Heap) bağlı olarak kategorize edilir.
- Değer Tipler
- Referans Tipler
Integer, bool, byte, enum gibi Struct tipi değişkenler Stack’de tutulur ve değer tiplidir. Bu tiplerdeki veriler için işletim sistemi bellekte bir yer ayırır ve değeri orada tutar. Stack de veriler üst üst tutulur ve “Last In First Out”(LIFO) mantığında çalışır.
String, array gibi Class tipi değişkenler Heap’de tutulur ve referans tiplidir. Aslında bu tip değişkenlerin referansları Stack’de kendisi ise Heap’de tutulur.
Yukarıdaki şemadan da anlayabileceğiniz gibi int tipli bir değişken değeriyle beraber tutuluyor fakat referans tipli bir değişkenin sadece referansı(Heap’deki adresi) tutuluyor.
Değer tipli bir değişkeni kullandıktan sonra otomatik olarak bellekten temizlenir fakat referans tipli değişken Heap’de durmaya devam eder. Bunu Garbage Collector temizler veya biz kendimiz temizleriz.
Yukarıdaki şekilde int tipinde değişken tanımlanmış ve içerisine 5 atandıktan sonra başka bir değişkene atanmış. Değer tipli bu değişkenlerin içeriği aynı olsa Heap’de 2 ayrı yerde tutulurlar. Fakat Referans tipli değişkenler böyle değildir. Şekilde de göreceğiniz gibi int tipli değişkenler için yapılan işlemin aynısı Person tipinde değişkenler için yapılmış ve ikisi de Stack’deki aynı referansı göstermişlerdir.
* Hatırlanması Gereken Noktalar :
- Değer tipi değişkenler, değeri kendi bellek alanında saklar; referans tipi değişkenler ise depolandığı değerin adresini saklar.
- Primitif tipler ‘Değer’ tipli, Sınıf objeleri, stringler, diziler, delegeler referans tiplidir.
- Stack daha hızlıdır ve LIFO mantığında çalışır.