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