Değer ve Referance Tipleri

1 ) Değer ve Referance Tipleri (Stack Nedir Heap Nedir  ? ) 
Bellekte veri tutmak için 2 alan vardır bunlar stack ve heap'tir. int,double,bool,enum,decimal değer tiplidir (sayısal ifadeler enum da aslında 1,2,3.. şeklinde gider, bool ise 0 1 şeklindedir.) Değer tipleri stack te tanımlanır ve değeride stack te atanır. Değer tip üzerinde yapılan değişiklik anında etkisini stack te gösterir ve sadece o tanımı etkiler.
Heap ' te olaya referans tipleri girmektedir. diziler,abstract,interface,string,object,class referans tiplerdir.

Kodumuz işletim sisteminde bir yer kaplar. Bu yerin boyutu kimi zaman belli yani değişmez iken kimi zaman ise kullanıcının program esnasında gireceği verilere göre değişebilecek durumdadır. Temel olarak bu farklılıktan dolayı iki farklı yöntemimiz var. Eğer program esnasında boyutları bildirilmiş değişmez bir değer kullanıyorsak stack, değişebilir bir değer kullanıyorsak heap bizim için uygun olacaktır. Stack ve heap kullanımları farklı ve dikkat edilmesi gereken bir konudur. Stack kullanılır ve işi bittikten sonra kendini otomatik olarak bellekten yok eder. Fakat heap‘te bu işi siz yapmalısınız.
 * Stack:  Kullanımı kolaydır. Bilgisayarda RAM’de tutulur. Tıpkı Heap gibi. Oluşturulan değişkinler stack kapsamından çıkınca otomatik olarak yok edilir. Ulaşılması heap‘e göre oldukça hızlıdır. Stack üzerinde kullanım fazla olduğunda alan yeterli olmayabilir. Mesela 20 boyutlu bir diziye 21 eleman atamak gibi… Oluşturulan değişkenler pointer olmadan kullanılabilir. Derleme zamanında oluşturulur. Kullanacağınız yerin boyutunu tam olarak biliyorsanız Stack‘i kullanmak sizin için uygun olacaktır. Stack LIFO mantığında çalışır. Yani son gelen ilk olarak çıkar.Struct tipindeki değişkenler değer tipleridir ve Stack içerisinde saklanır.
  * Heap: Bilgisayarda RAM’de tutulur.Tıpkı Stack gibi. Bir blok içerisinde oluşturulan heap değişkenler, bloğun dışına çıktığında otomatik olarak yok edilemez, bunun manuel olarak yapılması gerekir. Stack ile karşılaştırıldığında oldukça yavaştır. Doğru kullanılmaması durumunda bellek sorunları yaratır. Değişkenler pointer ile kullanılır. Çalışma zamanında oluşturulur. İhtiyacınız olan boyutu tam olarak bilmiyorsanız Heap kullanımı sizin için biçilmiş kaftandır.Class tipindeki değişkenler ise referans tipleridir, referansları Stack’de kendisi ise Heap’de saklanır.

daha iyi anlamamız için bir örnek yapalım.

static void Main(string[] args)
        {
            // int,double,decimal,bool,enum   deger tipleridir aşağıda örneği verilmiştir
            int sayi1 = 15;
            int sayi2 = 20;
            sayi2 = sayi1;
            sayi1 = 72;
            Console.WriteLine(" Sayi 1 = " + sayi1 + " Sayi 2 = " + sayi2);
            Console.WriteLine("\n********************************************");
            // diziler ,object,interface,class,abstract referans tiplidir. aşağıda örneği verilmiştir
            // burada string[] dizi1 stackte adres no  tutulur ama değer heap te yer ayır new string[]{ "Hakkari", "İstanbul","Antalya" }; 
            // yani adresin göstermiş olduğu yer heaptedir. 
            //örnegin dizi1 101 inci adresteyse dizi2 102 ise dizi2=dizi1 olduğunda dizi2 adresi 101 i referans alır ve 102 . adresi kullanmayacaktır
            //dizi1 veya dizi2 nin değişmesi 101. adresi değiştireceüinden dizi1 ve dizi2 daima aynı kalır 
            string[] dizi1 = new string[]{ "Adana", "İstanbul","Antalya" };
            string[] dizi2 = new string[] { "Kayseri", "Ankara", "Bolu" };
            dizi2 = dizi1;
            dizi2[0] = "Batman";
            dizi1[1] = "Düzce";
            Console.WriteLine("Dizi1 ilk elemanı "+ dizi1[0]+ " Dizi2 ilk elemanı " + dizi2[0]);
            Console.WriteLine("Dizi1 ikinci elemanı " + dizi1[1] + " Dizi2 ikinci elemanı " + dizi2[1]);
            Console.WriteLine("Dizi1 üçüncü elemanı " + dizi1[2] + " Dizi2 üçüncü elemanı " + dizi2[2]);
            Console.ReadLine();
        }





Hiç yorum yok:

Yorum Gönder