C# temeli Değer tipleri ve Referans tipleri - Stack,Heap
 
C# da veri tipleri 2 ana baslik altinda toplanir. Bu basliklar Deger tipleri ve Referans tipleridir.
C# diline baslayacak veya baslamis olan her kisinin en basta bilmesi gereken en önemli konudur deger tipleri ve referans tipleri.
 
C# dilinde kullanilan veri tiplerine hepimiz asina olmusuzdur.

Bu tipler  "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum", "string", "object", "class", "interface", "array", "delegate", "pointer" olarak siralanabilir.
 
Bunlarin hepsi 2 ana veri tipinin türleridir aslinda ama biz integer içinde veri tipi diyoruz bu noktada tip ve tür kelimeleri birbirine girmis olabilir çok takilacak bir konu degildir.
 
Peki neden Referans tipi ile Deger tipi olarak 2 ana basliga ayrilmislardir?
 
Burada referans tipi ile deger tipinde bir degisken yaptigimizda ve deger atadigimizda bellekte farkli bölgelerde farkli kayitlar olusturmaktadir. 
Bu fark sadece bellekte degil degiskenin c# tarafinda kullanimina da yansimaktadir.
 
Bellekte 2 bölge vardir. Bunlar "Stack" ve "Heap" bölgeleridir. Stack bölgesindeki veriye ulasmak, heap bölgesindeki veriye ulasmaktan daha hizlidir.
 
Deger tipindeki veri tiplerinde(türlerinde) bir degisken tanimlandiginda degiskenin degeri bellegin stack bölgesinde tutulur.
 
Referans tipinde veri tiplerinde(türlerinde) bir degisken tanimlandiginda degiskenin degeri bellegin heap bölgesinde tutulur. Stack bölgesinde ise degiskenin heap bölgesindeki adresi tutulur. Referans tipindeki degisken olusturulup alan ayirmak istenildiginde "new" anahtar kelimesi ile yer ayrilarak olusturulur.
 
Örnek: Class1 adli clasimiz olsun. Bu class'dan bir nesne olusturmak istredigimizde
Class1 cls1 = new Class1(); 
seklinde olustururuz.
 
 
Asagidaki resimde referans tipinde ve deger tipinde olusturulan degiskenler ve bellegin stack ve heap bölgelerinde olusturulan kayitlari gösterilmektedir.
 
 
 
 
Deger tipi ile Referans tipinin C# tarafinda kullanima yansima farkliliklari nedir?
 
Iki deger tipi degiskenimiz olsun. Bunlar int a ve int b olsun.
 
Biz a = b dedigimizde b degiskeninin stackdeki degeri  a degiskenine atanir. Bu atama bir klonlamadir. Daha sonra herhangi birinin degerini degistirmek, digerini etkilemez. 
 
Örn: 
int a,b = 2;
a = b;
b = 3;
Islem sonucunda b; 3 degerini, a ise 2 degerini gösterecektir. 
 
Gelelim Referans tipine
 
Iki referans tipi birbirine esitlendiginde yine bellegin stackdeki degeri diger degiskene atanir. Fakat referans tiplerinde bellegin stack bölgesinde içerdigi deger aslinda referans tipinn heap bölgesinde adresidir. Bu durumda birbirlerine esitleme yaptigimizda 2 degiskende ayni adresi gösterecektir. Daha sonra degiskenlerden birinde degiskenin degerini degistirdigimizde heap bölgesinde adresin gösterdigi deger degisecektir. Diger degiskende ayni adresteki degiskene baktigindan artik onunda degeri degismis olacaktir.
 
Örnek:
public class Deneme
{
public int sayi1 { get; set; }  
}

Deneme c = new Deneme();
Deneme d = new Deneme();

c = d;

//c nesnesnin sayi1 özelliginin degerini 5 yaptik.
c.sayi1 = 5;

//d nesnesinin sayi1 degerini int a degiskenine atiyoruz
int a = d.sayi1;
Sonuç:
a'nin degeri de 5 olacaktir. Yukarida Sinif(Class) tipi bir referans tipi oldugundan ve c ile d bu referans tiplerinin örnekleri oldugundan, c = d yapildiginda artik c ve d ayni adresi gösteren degiskeni kullanmis oldular. Bu durumda herhangi birinin bir porperty'sinde degisken degeri degistirdigimizde digeride ayni degeri gösterecektir.
 
Önemli not1:
Deneme adli class'in içinde int tipinde olan sayi1 proeperty'si eklenmisti. Burada int tipi deger tipidir fakat onu kapsayan tip ise referans tipi olan class'dir. Bu durumda class kapsayiciliginda dolayi class içerisindeki property'lerin degerleri referans tipine uygun olarak kullanilir.
 
Önemli not2:
Bir referans türü olan string ile ilgili bu konuda önemli bir istisna vardir. String referans türü olmasina ragmen metodlara geçirilirken deger tipiymis gibi kopyalanirlar. Yani 
string a = "selam";
string b = a;
b = "Merhaba";
burada a yine "Selam" degerini gösterir. Referans tipi olan string için böyle bir istisna bulunmaktadir.
 
Iste c# tarafinda bu sekilde kullanim farkliliginda dolayi bu tipler birbirinde ayrilmaktadir. C# a yeni basalyan herkesin en basta bilmesini gerektigi düsündügüm bir kavramdir.
 
 

Author: Engin ATALAY
Date: 03.09.2016 11:15:32
View Count: 7677
 
 

COMMENTS
 
Resim Yüklenemedi
Muhammet
29 Haziran 2019 21:38
elinize saglik memory'deki yerlesimleri anlasilir bir sekilde sunulmus.
 
 
 
 
 
Resim Yüklenemedi
Eren
19 Haziran 2019 15:20
Çok kisa ve güzel bir üslüpla bilinmesi gereken herseyi anlatmissiniz . Tesekkür ederim internette okudugum en yararli bilgiydi deger ve referans tipleriyle alakali. Elinize saglik.
 
 
 
 
 
Resim Yüklenemedi
Büşra
15 Ocak 2019 09:56
Çok kisa ve öz anlatmissiniz tesekkürler.
 
 
 
 
 
 
 
 
 
 
 
 
WRITE COMMENT
 
 
Your Name :
 
 
 
E-mail :
 
 
 
Your Message :
 
 
 
 
 
 
 
This project : ASP.NET MVC , RAZOR, Entity Framework , CSS , HTML , JQUERY(2.0.2) , AJAX the C# side-tier architecture was developed with logic.
 
Yukarı Çık