C# dilinde iki tür veri tipi mevcuttur. Bunlar değer ve referans tipleridir. Değer tipleri; veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türleridir. Bellekte az yer kaplarlar ve hızlı bir şekilde erişilebilirler. Ayrıca belleğin "stack" bölgesinde tutulurlar. Referans türleri ise, bellek bölgesinde veri yerine adresi tutarlar ve o adresin gösterdiği yerde de veri tutulur. Başka bir deyişle, bir ifade referans türleri içeriyorsa nesnenin adresi üzerinden işlem yapılmaktadır. Veri taşınmasını gerektiren işlemlerde nesnenin bütün verisi kopyalanmaz.
Değişken türleri: "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum"
Referans türleri: "string", "object", "class", "interface", "array", "delegate", "pointer"
Bir referans türü olan string ile ilgili bu konuda önemli bir istisna vardır. string referans türü olmasına rağmen metotlara geçirilirken değer tipiymiş gibi kopyalanırlar.
"ref" ve "out" Anahtar Kelimeleri
C# da; "ref" ve "out" kelimelerinin kullanımının iki temel amacı vardır. Bunlar;
- Metodun kendi argümanını değiştirmesine izin vermek.
- Metodun birden fazla değer döndürmesini sağlamaktır.
"ref" anahtar kelimesi
"int", "double" gibi değer tipleri metotlara kopyalanarak geçirilirler. Fakat bazı durumlarda bu değer tipleri de referansları ile metotlara geçirilmek istenebilir. Bu durumda C#' ta bu işlem için "ref" anahtar sözcüğü kullanılır. "ref", değerlerin metodlara referans yoluyla geçirilmesini sağlar. Açıktır ki; "ref" sözcüğünü referans tipler için kullanmak gereksizdir. Fakat yine de kullanımı bir hataya sebep olmamaktadır. Başka bir önemli husus da "ref" sözcüğü metodun bildiriminde kullanıldıysa, metodun çağrımında da kullanılmalıdır. "ref" anahtar sözcüğünün kullanımı aşağıdaki örnekte gösterilmektedir.
//ref anahtar kelimesi değer tipinden önce kullanılmalı.
static void kareAl(ref double d)
{
d = d * d;
}
static void Main(string[] args)
{
double i = 3.45;
Console.WriteLine("Double sayi: {0}", i);
kareAl(ref i); //ref parametresini içeren metod çağırılıyor.
Console.WriteLine("Karesi : {0} ", i);
Console.ReadKey();
}
Unutulmaması gereken önemli bir nokta metot çağrımının da "ref" anahtar sözcüğü ile birlikte yapılması zorunluluğudur. Ayrıca "ref" ile ilgili bilinmesi gereken bir diğer önemli özellik ise, "ref" anahtar sözcüğünü içeren metodu çağırmadan önce "ref" olarak aktarılan argümana mutlaka bir değer atanması gerektiğidir. Bunun nedeni, referans olarak argüman alan bir metodun kendisine gelen referansın başka bir veriyle ilişkili olduğunu varsaymasıdır. Yani "ref" kullanarak bir argümana ilk değer atamak için metot tanımlamak mümkün değildir. Eğer değer verilmemiş bir değişken kullanılırsa "Use of unassigned local variable" hata mesajı ile karşılaşılır.
"out" anahtar kelimesi
"out" anahtar sözcüğünün kullanımı da "ref" anahtar sözcüğünün kullanımından çok farklı değildir. Tek fark; "out" sözcüğü kullanılacak değişkene ilk değer atamak zorunda olunmasıdır. Çünkü; "out" ifadesi her zaman için değer atanmamış olarak kabul edilir ve metot sınırları içerisinde "out" sözcüğü için bir değer metot tarafından atanır.
"out" anahtar sözcüğü bir metottan birden fazla geri dönüş bekleniyorsa kullanılır. "out" anahtar sözcüğünün kullanımıyla ilgili bir örnek aşağıda gösterilmektedir.
namespace Out
{
class Class1
{
static void Main()
{
bool b;
int max = Max(9, 2, out b);
Console.WriteLine(b);
}
static int Max(int x,int y, out bool b)
{
if(x > y)
b = true;
else
b = false;
return Math.Max(x,y);
}
}
}
Yukarıdaki programda iki sayıdan büyüğünü geri dönen bir metot yazılmıştır. Aynı zamanda bu metot iki sayıdan hangisinin büyük olduğuna da karar verebilmektedir. Her metodun tek bir sonuca ulaştığı düşünülerek ilk değer verilmemiş, yeni bir parametre daha Max() isimli metoda gönderilmiştir. Bu parametre metot içinde değiştirilerek çağırıcı metoda iletilmiştir.
"ref" ve "out" anahtar sözcüklerinin kullanımı yalnızca değer parametrelerinin aktarılmasıyla sınırlı değildir. Referans aktarıldığında da kullanılabilirler. Bu şekilde referansın kendisinin referans olarak aktarılması sağlanmış olur. Böylece metodun, referansın ilişkili olduğu nesneleri değiştirmesine imkan verilir.