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

C# 9.0 – Init-Only Properties ve Init Accessor

Merhaba,

Bu içeriğimizde C# 9.0 ile gelen özelliklerimizden, herhangi bir nesnenin propertylerine ilk değerlerinin verilmesi ve sonraki süreçte bu değerlerin değiştirilmemesini garanti altına alan Init-Only Properties özelliğini ele alıyor olacağız.

Init-Only Properties, nesnenin sadece ilk yaratılış anında propertylerine değer atamaktadır. Böylece, iş kuralları gereği runtime’da değeri değişmemesi gereken nesneler için ideal bir önlem alınmaktadır.

Init-Only Properties, developer açısından süreç esnasında değiştirilmemesi gereken property değerlerinin -yanlışlıkla- değiştirilmesinin önüne geçmekte ve böylece olası hata ve bug’lardan yazılımı arındırmaktadır.

Yeniliği teknik olarak ele almadan önce aklınıza mevcudiyetteki getter-only-properties’lerin geldiğini tahmin etmekteyim. Misal, aşağıdaki örnek kod bloğunu incelerseniz eğer;

    class Book
    {
        public string Name { get; } = "Kutsal İsyan";
        public string Author { get; }
        public Book()
        {
            Author = "Hasan İzzet Dinamo";
        }
    }

Tanımlanan propertyler sadece get olduklarından dolayı ya tanımlandıkları anda (bknz : C# 6.0 – Auto Property Initializers) ya da sadece contructor’dan değer alabilmektedirler. Aksi taktirde bu propertylere başka bir yerden farklı değerler set edilememektedir.

Peki yeni gelen init-only properties özelliği ile mevcudiyetteki getter-only-properties arasında ne gibi bir fark var?
Bu ikisi arasındaki temel fark esasında object initializer işlevselliğinden kaynaklanmaktadır. Object initializer nedir? diye sorarsanız eğer aşağıdaki gibi bir sınıftan -new- operatörüyle object oluştururken üretim esnasında hızlı bir şekilde propertylerinin atanmasını sağlayan sıklıkla kullanmayı tercih ettiğimiz harika bir özelliktir.
C# 9.0 - Init-Only Properties ve Init Accessor
İşte bu özellikten bir önceki tasarımdaki gibi getter-only-properties özelliği kullanıldığı taktirde istifade etmemiz mümkün değildir. C# 9.0 ile beraber gelen init-only properties özelliği ile constructor’a olan bağımlılık ortadan kaldırılarak, -new- operatörüyle object oluştururken üretim esnasında propertylere ilk değerleri set edilebilmekte ve böylece sonraki süreçte değiştirilmesini önleyebilmekteyiz.

Init-Only Properties özelliğine ‘init’ keyword’ü eşlik etmektedir.

Sözgelimi;

    class Book
    {
        public string Name { get; init; } = "Kutsal İsyan";
        public string Author { get; init; }
        public Book()
        {
            Author = "Hasan İzzet Dinamo";
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer, property ‘get’ ile birlikte ‘init’ keyword’ü ile işaretlenmekte ve böylece ‘object initializer’ tarafından da ilk değerinin verilebileceği ifade edilmektedir. ‘init’, ‘get’ keyword’ü olmaksızın kullanılamamaktadır. Ayrıca yapısı gereği ‘set’ ile kullanılamayacağını da ekstradan ifade etmeye lüzum olmadığı kanaatindeyim. Velhasıl, ‘get; init;’ konsepti bir araya geldiği vakit hala readonly olan bu property ilk değerleri constructor yahut auto property initializers’dan alabileceği gibi ‘init’ sayesinde object initializer’dan da alabilmektedir.
C# 9.0 - Init-Only Properties ve Init Accessor
Yukarıdaki ekran görüntüsünde olduğu gibi ilk değerler verildikten sonra yeni bir değer atanmaya çalışıldığında derleyici hatasıyla karşılaşılmakta ve böylece developer uyarılmaktadır.

Ayrıca getter-only-properties ile çalışmaktansa readonly bir field üzerinde işlem yapmamız gerekiyorsa eğer aşağıdaki gibi ‘init’ bizlere eşlik edebilmektedir.

    class Book
    {
        private readonly string name;
        private readonly string author;
        public string Name
        {
            get => name;
            init => name = value;
        }
        public string Author
        {
            get => author;
            init => author = value;
        }
    }

Böylece C# 9.0 yeniliklerinden olan Init-Only Properties sayesinde, nesnelerin ilk yaratılış esnasında salt okunabilir değerlerini vermek için var olan başka bir tekniği(object initializer) bloklamadan kullanabilmekteyiz. Hayırlı olsun 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Kamil Yasin Ablay dedi ki:

    Teşekkürler

  1. 20 Kasım 2020

    […] 9.0’da gelen ve bir önceki Init-Only Properties ve Init Accessor başlıklı makalemde ele aldığımız konuda kısaca ‘init’ keyword’ünü ele […]

Bir cevap yazın

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