C# "Ref" ve "Out" Kullanımı

C# Out Kullanımı:

Örnek bir program üzerinden açıklamaya çalışırsam. Bir hesap makinası programı yazdığmızı düşünelim. Bu program içerisinde iki sayıyı toplayıp döndüren Add metodunu aşağıdaki gibi yazabiliriz.


public int Add(int x, int y)
        {
            return x + y;
        }



Bu metoduda program içerisinde şu şekilde çağırabiliriz:


        public void HesapMakinasi()
        {
            int ans = Add(3, 5);
        }


Bu programı şimdi birde out kullanarak yazalım. Bu sefer yazacağımız Add metodu bir değer döndürmesin değer döndürme işini out keywords ü üzerinden yapalım:


//out ile gönderilen değişkene metod içerisinde atama yapılması gerekmektedir. Yoksa program hata alır.
        public void Add(int x, int y, out int ans)
        {
            ans = x + y;
        }


Metodumuzu yazdıktan sonra şimdi 3 ile 5 i toplayan fonksiyonumuzu düzenlersek.


        public void HesapMakinasi()
        {
            int ans;
            Add(3, 5, out ans);
            Console.WriteLine("3 + 5 = {0}", ans);
        }


Burada görüldüğü gibi int tipinde tanımladığımız ans isimli değişkeni Add metoduna out parametresiyle gönderiyoruz. Add metodu bu sayede ans tipindeki değişkeni alıyor ve onun değerini değiştiriyor.En kısa olarak referans tipi olmayan int değişkeninin bellekteki yeri referans olarak verilerek bu değişken üzerinden metod içerisinde değişiklik yapılması sağlanıyor. Örneğin bu ans değişkeni out parametresi ile gönderilmeseydi Add metodu içerisinde değeri değişse bile bu değişiklik HesapMakinasi metodunun içindeki ans için geçerli olmayacaktı. Out parametresi bize referans tipi olmayan değişkenlerin bellekteki adreslerini göndererek onlar üzerinden referans tipi değişkenmiş gibi işlemler yapmamızı sağlıyor.

Örneğin bu program çalıştırıldığında ekrana : "3 + 5 = 8" yazacaktır.

Önemli Not: Out ile gönderilen değişkene metod içerisinde atama yapılması zorunludur. Yoksa programımız hata alır. Bununla birlikte HesapMakinasi fonksiyonunda gördüğünüz gibi out parametresiyle gönderilen değişkene ilk değer ataması yapılması zorunlu değildir.

C# Ref Kullanımı:

Aslında bunun kullanımı Out ile aynı şekildedir yukarıdaki örnekleri ref ile değiştirebilirsiniz. Out ile aynı işlevi görür. Kullanımm yönünden tek farkı: "Out ile gönderilen değişkene metod içerisinde atama yapılması zorunludur." demiştik ref te böyle bir şey söz konusu değil. ref yazılarak gönderilen değişkene metod içerisinde hiç bir atama yapılmaya bilir. Bu hataya sebep olmaz. Fakat buradaki önemli durum ise ref ile gönderilen değişken metod ile gönderilmeden önce değer ataması yapılması gerekmektedir.

Bununla birlikte örneğin bir metoda bir class (referans tipli nesne) gönderirken ref anahtar sözçüğünü kullanmazsak:

Person obj = new Person("Mel", 23);

SendObjectByValue(obj);

        static void SendObjectByValue (Person p)
        {
            // Change some data of "p".
            p.personAge = 555;

            // yeni ornek olusturuluyor
            p = new Person("Nikki", 999);

        }

bu şekilde 

obj.Name = Mel
obj.personAge = 555

olacaktır. Yani ref kullanmadak value olarak bir referans değişkenine metod içerisinde yeni örnek oluşturulduğunda bu yeni nesnenin bellekteki yerini tutmaz. Bunun için bu metodu şu şekilde yazılması gerekir:


Person obj = new Person("Mel", 23);
SendObjectByReference(obj);
        static void SendObjectByReference(ref Person p)
        {
            // Change some data of "p".
            p.personAge = 555;

            // "p" is now pointing to a new object on the heap!
            p = new Person("Nikki", 999);
        }

Bu durumda:

obj.Name = Nikki
obj.personAge = 999

olacaktır.

0 yorum :

Yorum Gönder