İçeriğe geç

Ref ve Out Anahtar Kelimeleri

Pointer! Bu kelimeyi eminim daha öncesinde duydunuz, özellikle C/C++ dilleri ile çalıştıysanız kesinikle kullanmışsınızdır. Bu yazımızda C# dilinde metotlara parametre olarak değişkenlerin saklanmış olduğu adresleri nasıl yollayacağımızı göreceğiz. İyi okumalar...

İlk olarak aşağıdaki koda bakalım.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int yil = 1905;
            Console.WriteLine(yil);
            Degistir(yil);
            Console.WriteLine(yil);

        }
        static void Degistir(int yil)
        {
            yil = 1997;
        }
    }
}

Ekran çıktısı aşağıda verilmiştir.

1905
1905
Press any key to continue . . .

1905 sonuçlarını görmemizin sebebi Degistir metodu içerisindeki yil değişkeninin scope alanı ile Main metodunun scope alanlarının farklı olmasından kaynaklanmaktadır. Ayrıca Degistir metodu ile işimiz kalmadığında Garbage Collector devreye girerek orada bulunan local değişkenleride silecektir. Ancak bazı durumlarda değişkenlerin bellekteki adreslerine metotlara geçirmek isteyebiliriz ve bu adres üzerinde kayıtlı olan değişken değeri ile işlem yapacağımızdan aslında scope kavramının dışına çıkmış olacağız. Ne demek istiyorum aşağıdaki koda bakalım ve ref anahtar kelimesini nasıl kullandığımızı görelim.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int yil = 1905;
            Console.WriteLine(yil);
            Degistir(ref yil);
            Console.WriteLine(yil);

        }
        static void Degistir(ref int yil)
        {
            yil = 1997;
        }
    }
}

Ekran çıktısı:

1905
1997
Press any key to continue . . .

Bir şeyler yanlış mı gitti? Hayır, aslında aynı adres ile çalıştığımızdan dolayı tek bir değişken üzerinde işlem gerçekleştirdik.

Not: Eğer değişkeninize bir değer atamadan, bir metoda adresini göndermek isterseniz ref anahtar kelimesi derleyici zamanında hata verecektir. Aşağıdaki kodun doğru çalışabileceğini düşünüyor olabilirsiniz, ancak çalışmayacaktır.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int yil;
            Degistir(ref yil);
            Console.WriteLine(yil);

        }
        static void Degistir(ref int yil)
        {
            yil = 1997;
        }
    }
}

Bu kodun doğru çalışması için 2 seçeneğimiz var. Birincisi yil değişkenine bir değer atamak, ikincisi ref anahtar kelimesi yerine out anahtar kelimesini kullanamak olacaktır. Yani aşağıdaki kodumuz doğru bir şekilde çalışacaktır.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int yil;
            Degistir(out yil);
            Console.WriteLine(yil);

        }
        static void Degistir(out int yil)
        {
            yil = 1997;
        }
    }
}

Ekran çıktısı:

1997
Press any key to continue . . .

Umarım konu anlaşılmıştır. Sonraki yazılarda görüşmek üzere.

Kategori:C Sharp

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir