C# temeli Değer tipleri ve Referans tipleri - Stack,Heap
 
C# da veri tipleri 2 ana başlık altında toplanır. Bu başlıklar Değer tipleri ve Referans tipleridir.
C# diline başlayacak veya başlamış olan her kişinin en başta bilmesi gereken en önemli konudur değer tipleri ve referans tipleri.
 
C# dilinde kullanılan veri tiplerine hepimiz aşina olmuşuzdur.

Bu tipler  "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum", "string", "object", "class", "interface", "array", "delegate", "pointer" olarak sıralanabilir.
 
Bunların hepsi 2 ana veri tipinin türleridir aslında ama biz integer içinde veri tipi diyoruz bu noktada tip ve tür kelimeleri birbirine girmiş olabilir çok takılacak bir konu değildir.
 
Peki neden Referans tipi ile Değer tipi olarak 2 ana başlığa ayrılmışlardır?
 
Burada referans tipi ile değer tipinde bir değişken yaptığımızda ve değer atadığımızda bellekte farklı bölgelerde farklı kayıtlar oluşturmaktadır. 
Bu fark sadece bellekte değil değişkenin c# tarafında kullanımına da yansımaktadır.
 
Bellekte 2 bölge vardır. Bunlar "Stack" ve "Heap" bölgeleridir. Stack bölgesindeki veriye ulaşmak, heap bölgesindeki veriye ulaşmaktan daha hızlıdır.
 
Değer tipindeki veri tiplerinde(türlerinde) bir değişken tanımlandığında değişkenin değeri belleğin stack bölgesinde tutulur.
 
Referans tipinde veri tiplerinde(türlerinde) bir değişken tanımlandığında değişkenin değeri belleğin heap bölgesinde tutulur. Stack bölgesinde ise değişkenin heap bölgesindeki adresi tutulur. Referans tipindeki değişken oluşturulup alan ayırmak istenildiğinde "new" anahtar kelimesi ile yer ayrılarak oluşturulur.
 
Örnek: Class1 adlı clasımız olsun. Bu class'dan bir nesne oluşturmak istrediğimizde
Class1 cls1 = new Class1(); 
şeklinde oluştururuz.
 
 
Aşağıdaki resimde referans tipinde ve değer tipinde oluşturulan değişkenler ve belleğin stack ve heap bölgelerinde oluşturulan kayıtları gösterilmektedir.
 
 
 
 
Değer tipi ile Referans tipinin C# tarafında kullanıma yansıma farklılıkları nedir?
 
İki değer tipi değişkenimiz olsun. Bunlar int a ve int b olsun.
 
Biz a = b dediğimizde b değişkeninin stackdeki değeri  a değişkenine atanır. Bu atama bir klonlamadır. Daha sonra herhangi birinin değerini değiştirmek, diğerini etkilemez. 
 
Örn: 
int a,b = 2;
a = b;
b = 3;
İşlem sonucunda b; 3 değerini, a ise 2 değerini gösterecektir. 
 
Gelelim Referans tipine
 
İki referans tipi birbirine eşitlendiğinde yine belleğin stackdeki değeri diğer değişkene atanır. Fakat referans tiplerinde belleğin stack bölgesinde içerdiği değer aslında referans tipinn heap bölgesinde adresidir. Bu durumda birbirlerine eşitleme yaptığımızda 2 değişkende aynı adresi gösterecektir. Daha sonra değişkenlerden birinde değişkenin değerini değiştirdiğimizde heap bölgesinde adresin gösterdiği değer değişecektir. Diğer değişkende aynı adresteki değişkene baktığından artık onunda değeri değişmiş olacaktır.
 
Örnek:
public class Deneme
{
public int sayi1 { get; set; }  
}

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

c = d;

//c nesnesnin sayi1 özelliğinin değerini 5 yaptık.
c.sayi1 = 5;

//d nesnesinin sayi1 değerini int a değişkenine atıyoruz
int a = d.sayi1;
Sonuç:
a'nın değeri de 5 olacaktır. Yukarıda Sınıf(Class) tipi bir referans tipi olduğundan ve c ile d bu referans tiplerinin örnekleri olduğundan, c = d yapıldığında artık c ve d aynı adresi gösteren değişkeni kullanmış oldular. Bu durumda herhangi birinin bir porperty'sinde değişken değeri değiştirdiğimizde diğeride aynı değeri gösterecektir.
 
Önemli not1:
Deneme adlı class'ın içinde int tipinde olan sayi1 proeperty'si eklenmişti. Burada int tipi değer tipidir fakat onu kapsayan tip ise referans tipi olan class'dır. Bu durumda class kapsayıcılığında dolayı class içerisindeki property'lerin değerleri referans tipine uygun olarak kullanılır.
 
Önemli not2:
Bir referans türü olan string ile ilgili bu konuda önemli bir istisna vardır. String referans türü olmasına rağmen metodlara geçirilirken değer tipiymiş gibi kopyalanırlar. Yani 
string a = "selam";
string b = a;
b = "Merhaba";
burada a yine "Selam" değerini gösterir. Referans tipi olan string için böyle bir istisna bulunmaktadır.
 
İşte c# tarafında bu şekilde kullanım farklılığında dolayı bu tipler birbirinde ayrılmaktadır. C# a yeni başalyan herkesin en başta bilmesini gerektiği düşündüğüm bir kavramdır.
 
 

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

COMMENTS
 
No comments yet. Be the first to comment who you are.
 
 
 
 
 
 
 
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