Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# 7.2 – Ref Readonly Returns

Merhaba,

Farkında mısınız bilmem ama her .NET yeniliklerinde metotların dönüş tiplerine ve parametrelerine bir müdahalede bulunulmakta ve özellikle referanslar aracılığıyla yapılan işlemlere büyük titizlik gösterilmektedir. Bu değerlendirmeye istinaden en son .NET güncellemesi ile sunulan C# 7.2 sürümüyle birlikte ref readonly returns özelliği gelmiş bulunmaktadır. Şimdi gelin, bu yeni özelliğin ne getirisi olduğuyla birlikte genel gidişatın nereye doğru olduğu üzerine sizlerle istişarede bulunalım.

Her yazılımcı bilir ki; metot içerisine dışarıdan gönderilen değişkenin sadece değerini değil, referansını göndermek istiyor ve içeride yapılan işlemler neticesinde değişken üzerindeki son değişikliği görmeyi amaçlıyorsak eğer ref parametresini kullanmaktayız.

Yok eğer metot içerisindeki bir değeri, metodun tetiklediği ilgili satırda bir değişken tarafından metot içerisinden çıkarıp elde etmek istiyorsak out keywordünü kullanmaktayız.

Bir başka durum ise, metot içerisinde parametrelerin değerini sabitlemek istiyorsak eğer In parametreisini kullanmamız yeterli olacaktır.

Bunca kontrolü sağlayabiliyorken, Ref Readonly Returns özelliği nedir? Neden bu özelliğe ihtiyaç duyulmuştur? İşte cevaplandırmaya çalıştığımız soru budur.

Yukarıdaki tüm anlatılanlar bir metot ile ilişkili değişken ya da parametreler için geçerlidir. Ref Readonly Returns özelliği ise metot yapılarından çıkarak sınıf yapılarında işlevsel bir yapı sunmaktadır.

Ref Readonly Returns, bir sınıf içerisindeki değişkeni sınıfın nesnesi ya da tipi üzerinden referansıyla döndürmemizi sağlar ve bir yandan da bu referansı döndürülen değişkenin değerini sadece okunabilir yapar.

Eğer ki aşağıdaki kod bloğunu incelerseniz “ConnectionProvider” sınıfı içerisindeki “Provider” isimli prototipe erişebilmek için her seferinde bu sınıftan bir örnek oluşturacağımdan dolayı dolaylı yoldan her seferinde bir “Provider” oluşturmuş oluyoruz.

    class ConnectionProvider
    {
        public string Provider { get; set; } = "Server=...;Database...;Trus...";
    }

Eee RAM’in Stack bölgesinde birden fazla string tipte “Provider” oluşturmaktansa bu özelliği ref readonly ile işaretleyerek sadece referansını gönderebiliriz ve bu şekilde sade ve sadece bir tane “Provider” özelliği üzeriden tüm çalışmamızı gerçekleştirebiliriz.

    class ConnectionProvider
    {
        string _provider = "Server=...;Database...;Trus...";
        public ref readonly string Provider => ref _provider;
    }

Gördüğünüz üzere “Provider” ref readonly ile işaretlenmiştir. Bu şekilde kullanımı ise aşağıdaki gibidir;
C# 7.2 - Ref Readonly Returns
Dikkat ederseniz eğer “Provider” değişkenine referans üzerinden erişildiği için tek bir “Provider” üzerinde çalışma gerçekleştirilecektir. Bunun dışında readonly sayesinde herhangi bir değersel müdahale söz konusu değildir.

Tabi burada ilgili sınıfın nesnesi üzerinden konuyu ele almış bulunmaktayız. Daha kolay ve pratik çalışmak için aşağıdaki gibi static yapılanma üzerinde de inşa söz konusu olabilir.

    class ConnectionProvider
    {
        static string _provider = "Server=...;Database...;Trus...";
        static public ref readonly string Provider => ref _provider;
    }

Nihayetinde .NET mimarisinin referans tipli(reference type) değişkenlerde olduğu gibi değer tipli(value type) değişkenlerde de referans yönetimini önemsediğini ve bizlerin bu yaklaşım ve üslupta kodlarımızı inşa etmemizi istediğini bu son yeniliklerinden anlıyoruz. Şahsen; bir değişkenin, yazılımın yaşam döngüsü boyunca kullanımı, referans yönetimi ve transferi ile daha verimli ve performans açısından kat be kat olumlu sonuçlar doğuracaktır. Haliyle .NET’te yazılımlardaki performans yönetimine bu tarz syntaxlarla katkıda bulunmakta ve mantığını yaymaya çalışmaktadır. İşte bu sebepten geleceğin programlama çatısı olma şerefini taşımaktadır.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Yunus Emre Atik dedi ki:

    Hocam öncelikle emeğinize sağlık çok yararlı bilgiler paylaşıyorsunuz. Benim merak ettiğim bir konu

    class ConnectionProvider
    {
        static string _provider = "Server=...;Database...;Trus...";
        static public ref readonly string Provider => ref _provider;
    }
    

    tanımladığımızda

    class Program
    {
        static void Main(string[] args)
        {    
           string p= ConnectionProvider.Provider;
           p = p + " Neden değer atayabiliyorum? :D";
           Console.WriteLine(p);    
        }
    }
    

    Provider değeri neden readonly olmaktan çıkıyor ve değer atanabilyor? Kolay gelsin.

Bir cevap yazın

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