Serdar YILMAZ
Bizimkisi Bir “Bug” Hikayesi...
Serdivan/Sakarya

Etiket 'C# ref-out'

C# – Değer ve Referans Parametreleri

dotnet.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.

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