C# dilinde iki tür veri tipi mevcuttur. Bunlar değer ve referans tipleridir. Değer tipleri; veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türleridir. Bellekte az yer kaplarlar ve hızlı bir şekilde erişilebilirler. Ayrıca belleğin “stack” bölgesinde tutulurlar. Referans türleri ise, bellek bölgesinde veri yerine adresi tutarlar ve o adresin gösterdiği yerde de veri tutulur. Başka bir deyişle, bir ifade referans türleri içeriyorsa nesnenin adresi üzerinden işlem yapılmaktadır. Veri taşınmasını gerektiren işlemlerde nesnenin bütün verisi kopyalanmaz.
Değer tipli yapılar belleğin(Ram) STACK bölümünde tutulurlar. Referans tipliler ise, belleğin(Ram) HEAP denen bölümünde tutulurlar.
C#’da kullanılan değişken türleri
Değer ve Başvuru türlerinin hafıza kullanımları için aşağıdaki örnek açıklayıcı olabilir;
1-int a=5; a isminde int türünde bir değişken tanımlanıyor ve 5 değeri ile hafızada saklanıyor.
2-int b=a; b isminde int türünde bir değişken tanımlanıyor ve a değişkeninin değerini alarak hafızada saklanıyor.
3-ogrenci p1=new ogrenci; p1 isminde ogrenci sınıfından türetilmiş bir değişken üretilip heap bölgesindeki bir adresi referans gösteriyor.
4-ogrenci p2=p1; p2 isiminde ogrenci sınıfından üretilen değişken p1’e eşitleniyor ve ikiside aynı değeri gösteriyor.
Değer türü için aşağıdaki örneği inceleyelim
int a = 5; int b = a; Console.WriteLine("a'nın değeri {0}",a); Console.WriteLine("b'nın değeri {0}", b); a = 21; Console.WriteLine("a'nın değeri {0}", a); Console.WriteLine("b'nın değeri {0}", b);
Ekran çıktısı…
a'nın değeri 5 b'nin değeri 5 a'nın değeri 21 b'nin değeri 5
şeklinde olacaktır ilk olarak a ve b değişkenlerinin değerleri birbirine eşitlenmiş daha sonra a değişkenine yeni atama yapılınca işlem sadece a değişkeni üzerinde etkili olmuştur. b değişkeninin değeri değişmemiştir.
Referans türü için aşağıdaki örneği inceleyelim
class referans { int sonuc=0; public void kare(int sayi1) { sonuc=sayi1*sayi1; } public void sonucyaz() { Console.WriteLine(sonuc); } } static void Main(string[] args) { referans yeni = new referans(); yeni.kare(5); yeni.sonucyaz(); referans enyeni = yeni; enyeni.sonucyaz(); yeni.kare(6); yeni.sonucyaz(); enyeni.sonucyaz(); Console.ReadKey(); }
Ekran çıktısı 25 25 36 36
referans isimli bir sınıf ve buy sınıfın içinde kare ve sonucyaz isimli metot tanımlanış kare metodu kendisine gönderilen değerin karesini alıp işlem sonucunu sonuc isimli değişkende saklamaktadır.
Programda ilk olarak referans sınıfında yeni isimli bir değişken türetilip kare fonksiyonuna 5 değeri gönderilmiş ve işlem sonucu 25 olarak hesaplanıp ekranda görüntülenmiştir. yeni isimli nesnedeki her değişiklik enyeni isimli nesneyide etkileyecektir. Çünkü bunlar değişkenin değerini değil o değeri gösteren adresi referans almaktadırlar.