C# da field ve propertylerde unchancing state bildirmenin 3 farklı yolu vardır. Yani nesne create edildikten sonra artık property değerleri değiştirilemez.
Read Only Keyword
readonly keywordu değeri ya declare edildiği yerde yada constructer içerinde verilir ve bu değer bir daha değiştirilemez.
Yukarıdaki örneği incelersek eğer, readonly olan sayac ve myList ve readonly olmayan myList2 isminde 3 adet declaremiz var. Bunlardan read only olan sayac ve myListin değeri declare edildiği yerde yada constructer içerisnde verilir ve bir daha değiştirilemez. Fakat myList2 readonly tanımlanmadığı için chance metodu içersinde bu myList2 referansına heapden başka bir yer tahsisi oluşturulabildi. Fakat sayac ve myList artık değiştirilemez. Sayacın değeri 8, myListin referensıda artık sabittir. Artık hiç bir yerde myList = new List<string>(); yapamayız. Burası çok önemli. Fakat readonly demek bu listeye yeni elemanlar eklenemez demek değildir. readonly olarak tanımlanmış bir listeye myList.Add("yeni eleman") şeklinde ekleme yapılabilir. Yada remove işlemi yapılabilir.
Get-only Auto-Properties
Bu yapı readonly yapısının benzeridir. Yukarıdaki sayac fieldının değeri sadece constructer üzerinden yapılması ve bir daha değiştirilememesi istenirse aşağıdaki gibi yapabiliriz.
Init Only Setters
Yukarıdaki gibi bir kod yazdığımızda her yeni eklenen property için constructer daha da büyüyecek bunun yerine aşağıdaki şekilde yazabiliriz.
Yukarıdaki gibi nesne initial edildikten sonra Breed, BirthYear ve Name değerleri değiştirilemez.
İnit-Only çok sayıda parametreyi constructera geçmeye bir alternatif sunarlar, bu da sınıflarınızı basitleştirebilir ve yaratımlarını daha okunaklı hale getirebilir.
SONUÇ
Bir nesne oluşturulduktan sonra bir değerin değişmeyeceğini garanti etmek istiyorsanız, readonly, a get-only auto property, yada init-only setter kullanabiliri, Peki hangisi doğru?
1- Bir değeri depolamak istiyorsam ancak bunu bir property olarak göstermem gerekmiyorsa, readonly bir field kullanırım.
2- Bir sınıf için az sayıda required attributes varsa ve bu listenin büyümesini beklemiyorsam, get only auto-propertyi kullanırım.
3- Çok sayıda property varsa ve zaman içinde büyümeye devam edecekse init-only kullanırım
Hiç yorum yok:
Yorum Gönder