Nesnel programlama büyük ölçüde referans tiplerin üzerine kuruludur.
Referans Tip Çalışma Şekli
Değer tip ve referans tipler bellekte iki ayrı alanda tutulur.
Bu alanlar Stack ve Heap bölümleridir.
Stack: alanında sayısal ifadeler tutulur bunlar değer tiplidir: int,double,decimal,bool(0,1),enum(1,2,3,4,5),stack(sınıflara benzer) tipte yapılar da stack alanında tutulur.
Değer tip sadece tanımlanan sayıda durur.
ÖRN:
int sayi1;
Tanımladığı anda stackte tutulur
sayi1=10;
Stack te sayi1=10 olarak tutulur
int sayi2=sayi1
Stack te sayi2=10 olarak tutulur ve sayi1 deki değişiklik sayi2 yi etkilemez.
Referans Tipler: class, interface,abstract class, string, diziler, int array de olsa dizide olsa referans tiplidir. Referans tipler newlenenlerdir (stack hariç).
EK BİLGİ: Stringler referans tiplidir ancak çalışma şekli değer tip gibidir.
string[] sehirler;
Tanımladığımızda stackte yer tutar.
string[] sehirler = new string[]{"Ankara","İstanbul","İzmir"};
string[] sehirler2 = new string[]{"Adana","Bursa","Bolu"};
İçerisine değer verildiğinde bir numara atanır ve heap bölümünde new string[]{"Ankara","İstanbul","İzmir"};
şeklinde bu numara ile bir referans alanı tutar.
ASIL FARK BU NOKTADA
//bu iki değeri eşitlersek eğer
sehirler2 = sehirler;
bu iki değeri eşitlersek eğer sehirler2 tanımlanırken stackte aldığı numara sehirler dizisinin aldığı değere eşitleniyor ve her ikiside heap bölümünde aynı noktayı referans gösteriyor sehirler2 nin asıl değerine herhangi bir müdahele olmuyor
Bu noktada eğer şehirler 2 de bir alanda değişiklik yaparsak bu şehirler dizisinide etkileyecektir. Çünkü şehirler 2 de artık referans olarak şehirler dizisinin heapteki alanını gösteriyor.
sehirler2[0]= "Eskişehir";
Console.Write(sehirler[0]);
Bu koddan alacağımız sonuç Ankara değil "Eskişehir" olacaktır.
Peki şehirler2 nin başlangıçta gösterdiği referansa ne olacak ?
Garbage Collector dediğimiz nesne
Referansı kalmamış o referansı gösteren hiçbir tanım kalmamışsa
O referansı bellekten silecek yapıdır. Çöpçümüzdür.
Top comments (0)