.Net Platformunda kullanmış olduğumuz veri tipleri Değer tipleri ve Referans tipleri olmak üzere ikiye ayrılmaktadır. Değer Tipleri stack bölgesinde tutulurken, Referans Tipleri heap bölgesinde tutulmaktadır.
Değer Tipleri: “int”, “long”, “float”, “double”, “decimal”, “char”, “bool”, “byte”, “short”, “struct”, “enum”
Referans Tipleri: “string”, “object”, “class”, “interface”, “array”, “delegate”, “pointer”
Değer tipleri veriyi tutan değişken türleridir. Referans türleri ise veri yerine verinin bellekteki adresini tutan değişken türleridir.
Bir metoda parametre olarak Değer Tipli bir değişken verildiğinde; bellekte yeni bir alan oluşturulur ve değişkenin taşıdığı verinin kopyası bu alana yerleştirilir. Metot içerisinde yapılan işlemlerde de yeni oluşturulan bellek bölgesinde bulunan veri kullanılır. Bu yüzden metot içerisinde yapılan değişikliklerden ana değişken herhangi bir şekilde etkilenmez.
Bir metoda parametre olarak Referans Tipli bir değişken verildiğinde; bellekte yeni bir alan oluşturulur ve değişkenin bellekteki adresi bu alana yerleştirilir. Metot içerisinde yapılan işlemlerde yeni oluşturulan bellek bölgesinde bulunan adres kullanılır, bu adreste ana değişkeni gösterdiği için metot içerisinde yapılan değişikler doğrudan ana değişkeni etkileyecektir.
Tüm diziler Referans türlüdür çünkü diziler Array sınıfı türünden bir nesnedir. Bu yüzden dizilerin elemanları parametre olarak kopyalanmaz, kopyalanan sadece dizinin bellekteki adresini gösteren referansıdır.
REF ve OUT İfadeleri
Değer Tipli değişkenlerin adreslerini(referanslarını) parametre olarak aktarabilmek için REF veya OUT ifadelerini kullanmaktayız. Parametre olarak değişkenin adresi gönderildiği taktirde tıpkı referans tipli değişkenlerde olduğu gibi metot içerisinde yapılan değişiklikler ana değişkeni doğrudan etkilenecektir.
private static void metot1(int sayi) { sayi = 1000; } private static void metot2(ref int sayi) { sayi = 1000; } static void Main(string[] args) { int deger = 0; // deger değişkeninin kopyası gönderilecektir. // Ekran Çıktısı: metot1() çağrıldıktan sonra:0 metot1(deger); Console.WriteLine("metot1() çağrıldıktan sonra:{0}", deger); // deger değişkeninin adresi gönderilecektir. // Ekran Çıktısı: metot2() çağrıldıktan sonra:1000 metot2(ref deger); Console.WriteLine("metot2() çağrıldıktan sonra:{0}", deger); }
Ref ve Out arasındaki tek fark; Out ile tanımlanmış parametrelere ilk değer verme gibi bir zorunluluk yokken ref ile tanımlanmış parametrelere ilk değer mutlaka verilmelidir. Yukarıdaki örnekte “deger” değişkenine ilk değer olarak “0” verilmiştir. Eğer ilk değer ataması yapılmamış olsaydı, ref ifadesini kullanamazdık. Onun yerine out ifadesini kullanmamız gerekirdi.
Serdar YILMAZ
Çok teşekkürlerr
değer referams tip müthiş anlatmışssınız teşekkürler
Teşekkür ederim. Yazınız çok yararlı oldu.
Dostum paylaşımlarının devamını dilerim. O kadar güzel anlatmışsınki, bloğunu bir başvuru kaynağı olarak tarayıcımın sık kullanılanlarına ekledim. Teşekkürler.