Kurumsal ve Kişisel ASP.NET C# SQL Eğitiminde Ankara'da Zirve

Referans ve Değer Tipleri

Değer tipleri ve referans tipleri arasındaki fark çoğu zaman tam olarak anlaşılamamaktadır. İki yapı arasındaki en büyük fark, değer tiplerinin bellekte veriyi tutarken, referans tiplerin bellek bölgesinde adres tutuyor olmasıdır. Adresin gösterdiği yerde ise (Manage Heap) veri tutulmaktadır. Prosedür ve fonksiyon tanımlamalarında “ref” olarak gönderilmesini talep ettiğiniz parametre değerleri, metodu kullanacak yerden gönderildiğinde, parametreye değerini değil adres bilgisini göndermektedir. Bu basit tipli bir değişken için bile mümkün hale getirilmiştir. Bir de bu bildirgeyi yapmadan kendiliğinden referans tipli yapılar vardır. Bunlar .Net içerisinde bizim en sık kullandığımız “dizi değişkenler” ve “sınıf” lardan tanımlanan nesnelerdir. Şimdi değer tipli ve referans tipli yapılar arasındaki bu örnekler ile detaylandıralım.

Örneklerimizi yaparken görsel açıdan destek olması sebebiyle Excel sayfası kullanılacaktır. Bu Excel sayfası belleği temsil edecektir. Bellek değişkenleri tam olarak aynı şekilde tutuyor olmasa da, gösterilen şekilde düşünmenizde bir yanlışlık yoktur.

Aşağıda buton1 e tıklandığında ;

private void button1_Click(object sender, EventArgs e)

{
int a = 10, b = 100;

b = a;
b = 123;
MessageBox.Show(a.ToString());
}

Öncelikle “a” değişkeni, ardından da “b” değişkeni tanımlanmaktadır. “a” değişkeninin ilk değeri 10 ve “b” değişkeninin ilk değeri ise “100” dür. Ardından “b” değişkenine “a” değişkeni aktarılmıştır. Üçüncü satırda ise, “b” değişkeninin değeri 123 yapılmıştır. Son olarak “a” değişkeni mesaj olarak verilmektedir. Sanırım buraya kadar bir problem yoktur, “a” nın değeri 10 olarak mesaj ile kullanıcıya belirtilecektir. Bu işlemin nasıl gerçekleştiğini Excel sayfası üzerinde gösterelim.

referans-ve-deger-tipleri-1

referans-ve-deger-tipleri-1

İlk satır çalıştığında bellek bölgesinde iki değişkende tanımlanır. Ardından ikinci satır çalışır ve “a” değişkeni değerini “b” değişkenine aktarır ve “b” değişkeninin değeri 10 olur.

referans-ve-deger-tipleri-2

referans-ve-deger-tipleri-2

Üçüncü satır çalıştığında ise “b” değişkenine 123 değeri atanır.

referans-ve-deger-tipleri-3

referans-ve-deger-tipleri-3

Son olarak “a” değişkeni mesaj olarak verilmek istendiğinde bellek bölgesinde “a” değişkeni bulunur ve ekrana yansıtılır.

referans-ve-deger-tipleri-4

referans-ve-deger-tipleri-4

“a” değişkeninin değeri hiç değiştirilmemiştir. O nedenle verilen mesaj yani 10 değeri çok normaldir. Fakat burada unutulmaması gereken bir durum vardır. O da “int” olarak tanımlanmış bu değişkenler değer tipli yapılardır. Sadece değerlerini aktarırlar.

Şimdi uygulamamızı bir prosedür aracılığı ile genişletelim.

private void button1_Click(object sender, EventArgs e)

{
int a = 10;

calistir(a);
MessageBox.Show(a.ToString());
}

void calistir(int b)

{
b = 123;
}

Yukarıdaki kodlarımızın çalıştırılması sonucunda, biraz önceki örneğimiz ile aynı sonucu alırız. Bunun nedeni “a” değişkenimizin değerini “b” değişkenine aktarıyor olmasıdır. “b” değişkenin değeri prosedür içerisinde değiştirilebilir fakat bu “a” değişkenini ilgilendirmez. Önceki bellek değişimlerinin aynısı burada da gerçekleşmiş olur.

Eğer siz burada prosedür içerisinde istemiş olduğunuz “b” parametresini “ref” olarak isterseniz, sonuç bundan biraz daha farklı olacaktır.

private void button1_Click(object sender, EventArgs e)

{
int a = 10;

calistir(ref a);

MessageBox.Show(a.ToString());
}

void calistir(ref int b)

{
b = 123;
}

Yukarıdaki kodların çalıştırılması sonucunda, ilk olarak “a” değişkeni tanımlanır. Ardından prosedür içerisine gönderilir ve “b” parametresine “a” değişkeninin adresi verilir.

referans-ve-deger-tipleri-5

referans-ve-deger-tipleri-5

O nedenle prosedür içerisinde “b” nin değerinin değiştirilmesi, aslında “a” nın verisinin değişmesi anlamına gelir. Çünkü değiştirilmek istenen “b”, veriyi B5 hücresinde tuttuğunu söyler. Dolayısıyla prosedür bitip butona geri dönüldüğünde “a” değişkeninin değeri değişmiş olur.

Yukarıdaki “ref” ile çağrılıp gönderilen değerlerin adres bilgisi taşıdıklarını sanıyorum ki anladınız. Bu yapılar değer tipli olmasına rağmen, referans tipli yapılar gibi kullanılmıştır.

Kendiliğinden referans tipli olan yapılarda, bu durum her zaman böyledir. Alttaki uygulamada, dizi değişkenlerin referans tipli yapılar olduğuna örnektir.

private void button1_Click(object sender, EventArgs e)

{
int[] sayilar = new int[2];

sayilar[0] = 12;
sayilar[1] = 24;

calistir(sayilar);

for(int i=0;i<=sayilar.GetUpperBound(0);i++) MessageBox.Show(sayilar[i].ToString()); } void calistir(int[] dizi) { //dizi elemanlarının değerleri değişti dizi[0] = 100; dizi[1] = 200; } Yukarıdaki dizi istenirken herhangi bir, “ref” tanımı olmadığına dikkat edin. Fakat prosedür bitip tekrar buton içerisinde değerler mesaj verilirken, dizi değerleri artık 12 ve 24 değildir. Artık bu değerler 100 ve 200 olmuştur. BU FARK dizilerin referans tipli olduğunu gösterir. Bir diğer örnek ise, çok sık kullandığınız bir sınıf olan XXXDataAdapter ‘dür. Bu sınıfın “Fill” metodu içerisinde gönderilen boş tablo, dolu olarak dönmektedir. Buradan da nesnelerin referans tipli olduğunu söyleyebiliriz.

Yorum Yapılmamış

Bir cevap yazın