C# 7.0 – Ref Returns

Merhaba,

.NET çatısı altında yapılan güncellemeler her zaman yeni keyword yahut yapı getirmekten ziyade bilakis genellikle var olanın gelişmesi ve daha pratik bir yapıya bürünmesi üzerine odaklanmaktadır. Şahsen tüm ihtiyaçlara dönük anahtar sözcüklerin var olması ve yeni ihtiyaçların uzun vadede belirlenebiliyor olmasından dolayı bu ihtiyaçlara dönük keywordlerin doğmasına daha uzun zaman olduğunu söyleyebiliriz. Bu dersimizde ise var olan bir keywordün daha pratik kullanılabildiği C# 7.0 ile gelen “ref returns” özelliği üzerine duruyor olacağız. Tabi bu özelliği anlamlandırabilmek için öncelikle ref keywordünün kullanımına hakim olmanız gerekmektedir. Her ne kadar ilgili linkteki makaleyi okuyarak bu hakimiyeti sağlayabileceksenizde, benim burada hafiften konuya değinmem daha veremli olacaktır.

Referans kelimesinin kısaltması olan ref keywordü ile bir metoddun parametresini işaretlersek eğer o parametreye verilen değişkenin değeri değil, bizzat kendisi, referansı ilgili metoda gönderilmiş olacaktır. Haliyle aşağıdaki örnek kod bloğu bu keywordün işlevini oldukça net gözler önüne sermektedir.
C# 7.0 – Ref Returns

Görüldüğü üzere int tipinden “y” isimli değişkenimiz “Metod” isimli metoda parametre olarak ref keywordüyle gönderilmekte ve içerisinde 40 değeri atanmaktadır. ref keywordü sayesinde parametreye direkt olarak “y” değişkeni fiziksel olarak geldiğinden dolayı RAM’de ki Stack kısmında “y” referansına 40 değeri set edilmekte, ee dolayısıyla yazdırdığımızda 40 değerini çıktı olarak bizlere vermektedir.

Yani uzun lafın kısası, “ref” metoda parametre olarak değişkenin değerini değil direkt olarak kendisi göndermektedir.

Nasıl ki, “ref” ile değişkenin kendisini metoda gönderiyorsak C# 7.0 ile gelen Ref Returns özelliğiylede metoddan değişkeni fiziksel olarak return edebiliyoruz. Nasıl mı? Aşağıdaki kod bloğuna bakalım…

C# 7.0 – Ref Returns

Siz yukarıdaki kod yapısını incelerken ben burada dönen mevzuyu anlatmaya başlıyorum. “Metod” isimli metodumuz gördüğünüz gibi “ref” keywordüyle işaretlenmiş parametre almakta ve bu parametreden gelen değişkeni direkt olarak “return ref” komutu ile geriye döndürmektedir. Tabi ki de burada daha kompleks işlemler gerçekleştirebilir ve en sonunda “return ref” komutunu kullanabilirsiniz. Ben daha sade bir tablo üzerinden konumuzu anlatmaya çalıştığımdan dolayı metodumuzun içeriğini bu şekilde boş olarak ayarladım. Her neyse, burada “return ref x” komutu sayesinde metodumuz geriye ilgili “x” değişkeninin refere ettiği değişkenin değerini değil ta kendisini fiziksel olarak geriye döndürecektir.

“Main” metodu içerisinde ise tanımlanmış olan int tipinden “y” isimli değişkenimiz “Metod” isimli metodumuza parametre olarak gönderilmekte ve geriye gelen değeri tekrardan “ref int x” değişkeniyle elde etmekteyiz. Tabi burada yazmış olduğumuz komutun gramerine daha çok değinmemiz gerekeceğinden dolayı bu satırı özellikle aşağıya alıp, inceleyelim.

            ref int x = ref Metod(ref y);

Burada yapmış olduğumuz işlem, assing operatörünün sol tarafından tanımladığımız değişken tipi bir değerden çok fiziksel bir değişkeni refere edeceğinden dolayı tekrardan “ref” anahtar sözcüğüyle işaretlenmektedir. Aynı mantıkla assing operatörünün sağ taraftaki kısmında ise metotdan gelecek olan değişkenin değer değil fiziksel olarak bellekteki adresi olduğunu belirtebilmek içinde yine “ref” anahtar sözcüğüyle işaretlendirme yapılmıştır.

Kısaca sol tarafta bir değer tipi değil bir değişken referansı tutulacağı ve sağ tarafta da bir değer değil değişkenin ta kendisi yani bellekteki adresi atanacağı belirtilmiştir. İşte bu şekilde yapılan tanımlama neticesinde “x” ile “y” referansları arka planda aşağıdaki şemada olduğu gibi aynı fiziksel değişkeni işaret – refere etmektedirler.

C# 7.0 – Ref Returns

Haliyle “x” yahut “y” değişkenlerinden herhangi birinin değeri değişsin fark etmeksizin diğerinide etkileyecektir. Aşağıda konuya geniş açıdan bakabilmeniz için farklı bir örnek daha veriyorum.
C# 7.0 – Ref Returns
Gördüğünüz gibi “x” değişkenine verilen değere “y” değişkeninden, “y” değişkenine verilen değere ise “x” değişkeninden erişebilmekteyiz. Çünkü aslında bu ikisi aynı değişkendir.

Evet, her ne kadar Ref Returns özelliği geriye değişkenin bellek adresini göndermek amaçlı bir yenilik olsada aslında değer tipli bir değişkeni iki farklı referans ile refere etmeyide gerçekleştirmeyi sağlamakta ve bir kuşla iki taş vurmaktadır…

Umarım okurken hem eğlenir hem de bol bol faydalanırsınız…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. Adil dedi ki:

    Salam. Belə gözəl yazılar paylaşıb bizə öyrənməyə kömək olduğuna görə təşəkkür edirəm, hər yerdə tapmaq olmur belə yazılar 🙂 . Amma bu mövzunu başa düşə bilmedim :
    – Ref Returns özelliğiylede metoddan değişkeni fiziksel olarak return edebiliyoruz. Nasıl mı?
    Burada fiziksəl deyərkən nəyi nəzərdə tutursan?, əvvəlcədən təşəkkürlər.

    • Gençay dedi ki:

      Merhaba Adil,

              public static int X(int a) => a;
      

      Yukarıdaki X metodu geriye a parametresinden gelen değeri döndürmektedir.

              static void Main(string[] args)
              {
                  int a = 3;
                  int b = X(a);
                  b = 4;
                  Console.WriteLine(a); // 3
                  Console.WriteLine(b); // 4
              }
      

      Haliyle bu şekilde kullandığımız vakit yukarıdaki yazan değerleri ekrana yazdıracaktır.

      Bu şekilde bir kullanımda değişkenlerin değerleri üzerinden çalışmış oluyoruz. Eğer ki Ref Returns yapısını kullanırsak değişkenlerin değerleri yerine bizzat kendileri, yani bellekteki adresleri taşınmış olunacaktır.

      public static ref int X(ref int a) => ref a;
      

      Yukarıdaki X metodu parametreden almış olduğu değişkenin referansını yani bellek adresini “ref a” diyerek geriye gönderecektir. Yani bu sefer geriye a parametresine verilen değişkenin değerini değil, verilen değişkenin direkt fiziksel olarak ta kendisini gönderecektir.

              static void Main(string[] args)
              {
                  int a = 3;
                  ref int b = ref X(ref a);
                  b = 4;
                  Console.WriteLine(a); // 4
                  Console.WriteLine(b); // 4
              }
      

      Haliyle bu şekilde kullandığımızda da yukarıdaki yazan değerleri ekrana yazdıracaktır. Çünkü a değişkeninin referansı X metoduna parametre olarak verilmektedir ve bu metot içerisinde a değişkenini fiziksel olarak döndürmektedir. b değişkeni ile a değişkeninin bellek adresini tekrardan işaretlemiş oluyoruz. Haliyle her iki değişkenden birinde yapılan değişiklik bir diğeri tarafından yansıtılmaktadır.

      Genel anlamda tüm olay bundan ibarettir.

      Sevgiler.

  2. okan dedi ki:

    Merak ile beklediğim bir konuydu teşekkürler , devamını merakla bekliyoruz . .

Bir cevap yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.