C# dilinde kodlama yaparken, genelde bir çok geliştirici bellek yönetimi konusunda bilgi sahibi değildir.Bütün C# kitaplarının ilk sayfaları int ya da byte tipi bellekte kaç byte yer kaplar ve hangi aralıkta değerler alır konusunu işlemesine rağmen, günümüzde de yüksek donanım özelliklerine sahip bilgisayarların kullanılması sebebiyle bu değerlere çok fazla dikkat etmiyoruz. C#’ta kullanılan veri tiplerini 2 başlığa ayırabiliriz.Bu tipler referans tipleri ve değer tipleridir.Değer tipleri int, byte gibi bellekte kaplayacağı alan belli tiplerdir.Referans tipleri ise object,sınıf örneği gibi tiplerdir ve bu tiplerin bellekte kaplayacağı alan belli olmadığı için bellekte tutuldukları alanda, veri tipinin adresi bulunur.Bu bellek alanı, verinin bellekteki veri olarak tutulduğu alanı işaret etmektedir. (İlerleyen günlerde bu konu ile ilgili de daha detaylı bir yazı yazacağım.)

Bazı durumlarda metot kullanımlarında geriye birden çok değer döndürmek isteyebiliriz ya da metotlara referans tipi geçmek isteyebiliriz.Bu durumlarda C# bize ref ve out adında iki önemli anahtar kelime sunmaktadır.

Peki ref ve out anahtar kelimeleri nedir ? Farkları nelerdir ?

Genel kullanım olarak aynı amaca hizmet etmelerine rağmen kullanım açısından ufak tefek farklılıkları bulunmaktadır.Aşağıdaki örnekte Main metot’u içinde a ve b isminde 2 adet değişken tanımlanmış ve Metot sınıfının fonksiyonları içinde bu değişkenlere değer ataması yapılmıştır.

static void Main(string[] args)
        {
            int a = 0;
            int b = 0;

            Metot m = new Metot();

            m.Ref_Kullanarak_Hesapla(ref a, ref b);
            Console.WriteLine("Ref_Kullanarak_Hesapla() fonksiyonu için değişken değerleri : a = " + a + " b = " + b);
            Console.WriteLine();

            m.Out_Kullanarak_Hesapla(out a, out b);
            Console.WriteLine("Out_Kullanarak_Hesapla() fonksiyonu için değişken değerleri : a = " + a + " b = " + b);
            Console.WriteLine();

            m.Parametresiz_Hesapla(a, b);
            Console.WriteLine("Parametresiz_Hesapla() fonksiyonu için değişken değerleri : a = " + a + " b = " + b);
            Console.WriteLine();

            Console.ReadLine();
        }
public class Metot
    {
        public void Parametresiz_Hesapla(int a, int b)
        {
            a = 1;
            b = 2;
        }

        public void Ref_Kullanarak_Hesapla(ref int a, ref int b)
        {
            a = 3;
            b = 4;
        }

        public void Out_Kullanarak_Hesapla(out int a, out int b)
        {
            a = 5;
            b = 6;
        }
    }

Parametresiz_Hesapla fonksiyonu için bu değişkenleri değer tipinden metot’a parametre olarak geçiyoruz.Bellek üzerinde bu değişkenlerin kopyası oluşturuldu ve değer atamaları bu kopyalar üzerinde yapıldı. a ve b değişkenlerini ekrana yazdırdığımızda varsayılan değerleri ekrana gelecek ve 0 değerlerini koruyacaklardır.

Ref_Kullanarak_Hesapla fonksiyonu için a ve b değişkenleri metot’a referans tipinde parametre olarak geçilmiş, a ve b değişkenlerinin işaret ettiği adreste bulunan verilere değer ataması yapıldğından dolayı bu değişkenlerin değerleri 3 ve 4 olarak değişmiştir.Ref anahtar sözcüğü kullanırken referans olarak gösterilen değişkenlere varsayılan değer ataması önceden yapılmak zorundadır.Out anahtar sözcüğü kullanırken varsayılan değer atamanıza gerek yoktur.Değer atamadığınızda derleme esnasında aşağıdaki hatayı alıyoruz.

ref_error

Out_Kullanarak_Hesapla fonksiyonunun Ref_Kullanarak_Hesapla fonksiyonundan farkı metot’a parametre geçerken out anahtar sözcüğünün kullanılmasıdır.Bu şekilde metot’a geçilen parametre yine referans tipinde olmaktadır.Out anahtar sözcüğünün ref’den farkı, varsayılan değer ataması zorunlu olmamasına rağmen parametre olarak geçilen fonksiyon içinde değişken’e değer atama zorunluluğudur. Out_Kullanarak_Hesapla fonksiyonu içinde a ve b değişkenlerine değer atamadığımızda ise derleme esnasında aşağıdaki hatayı alıyoruz.

out_error

Ref ve Out aslında benzer amaç için kullanılır.Temel farkları ise;

  • Ref kullanırken varsayılan değer ataması zorunludur, Out için bu zorunluluk yoktur.
  • Metot’a out anahtar sözcüğü ile geçilen değişkenin aynı metot içinde değer ataması yapılması zorunlu iken, Ref için böyle bir zorunluluk yoktur.

Örnek kodları buradan indirebilirsiniz.Başka bir yazıda görüşmek üzere…

Bu Yazıyı Başkalarıyla Paylaş... Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestShare on TumblrEmail this to someone

Yorum Yapın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>