Kapsülleme, bir nesnenin durumunun yalnızca tanımlanmış bir arabirim aracılığıyla gerçekleştiği anlamına gelir ve bu nedenle sınıf, bu durumun her zaman geçerli olduğundan ve sınıfın amacına uygun olduğundan emin olabilir.
Bu nedenle bazı durumlarda, bir alanı herkese açık olarak göstermek, kapsülleme ilkesine mükemmel bir şekilde uymaktadır - alan için tüm olası değerler, diğer tüm alanların diğer tüm olası değerleri ile geçerlidir ve bu nedenle programcı, alana etkin bir şekilde izin vermeye karar verebilir. dış kod tarafından serbestçe manipüle edilebilir.
Bu durumlar, çoğunlukla "düz eski veriler" olan sınıflarla sınırlıdır. Onlar da bu konuda çok ilginç değiller, bu kadar onlar için yeterli.
Diğer durumlarda, diğer dillerde, bir alıcı ve ayarlayıcı yöntemine sahip int getId()olunur , bir değer elde etmek ve void setId(int val)onu güncellemek gibi bir şey.
Özellikler, bir alanı okumak ve yazmak için kullanacağımız gibi, bu tür yöntemlerle okumak ve yazmak için aynı sözdizimini kullanmamıza izin verir. Bu hayati olmasa da iyi bir sözdizimsel şekerdir.
(Aslında, yansımanın çalışma şekli nedeniyle ve DataBinder.Evalbir alan iyi çalışsa bile bir mülke sahip olmak kullanışlı olabilir, ancak bu başka bir mesele).
Özel ayarlayıcılar tanıtılıncaya kadar (aslında, aynı blokta özel bir ayarlayıcı ve genel veya korumalı bir alıcıya sahip olmak için C # 2 ile değişen sözdizimi), özel ayarlayıcının işini yapmak için özel bir yönteme sahip olabilirdik, yani özel ayarlayıcılar gerçekten gerekli değildir. Yine de kullanışlıdırlar, bu yüzden sözdizimsel şeker olsa da oldukça kullanışlıdırlar.
Kapsülleme, ayarlayıcılarınızın (veya alıcılarınızın) kamuya açık, özel, korumalı veya dahili olup olmadıklarının değil, uygun olup olmadıklarının bir meselesidir . Her alanın özel (ve bu konuda readonly) varsayılan olarak başlayın ve ardından gerektiğinde bu alanları değiştiren üyeler (özellikler veya yöntemler olsun ) ekleyin ve değiştikçe nesnenin geçerli kalmasını sağlayın . Bu, bir sınıfın değişmezinin korunmasını sağlar , yani içinde bulunabileceği geçerli durum kümesini tanımlayan kuralların asla bozulmaması gerekir (kurucular ayrıca, sınıfın böyle geçerli bir durumda başladığından emin olarak yardımcı olurlar).
Son sorunuza gelince, değişmez olmak, bir sınıfın genel, korumalı veya dahili belirleyicileri olmadığı ve herhangi bir alanı değiştiren genel, korumalı veya dahili yöntemleri olmadığı anlamına gelir . Bunun dereceleri vardır, C # 'da olası üç derece vardır:
Bir sınıfın tüm örnek alanlarıdır readonly, bu nedenle özel kod bile onu değiştiremez. Değişmez olduğu garanti edilir (değiştirmeye çalışan herhangi bir şey derlenmez) ve muhtemelen bunun arkasında optimizasyonlar yapılabilir.
Bir sınıf dışarıdan değişmez çünkü hiçbir kamu üyesi hiçbir şeyi değiştirmez, ancak kullanımıyla readonlyiçeriden değiştirilmeyeceği garanti edilmez.
Bir sınıf dışarıdan görüldüğü gibi değişmezdir, ancak bazı durumlar bir uygulama ayrıntısı olarak değişir. Örneğin, bir alan hafızaya alınabilir ve bu nedenle dışarıdan onu elde etme girişimi aynı değeri alırken, bu tür ilk girişim onu gerçekten hesaplar ve ardından sonraki denemelerde geri almak için depolar.
private File settingsFile = null;kurucular ve sonra one:if (settingsFile == null) { settingsFile = GetSettingsFile() };. Kodu yeniden düzenlemek bazen beni ağlattı :). Yapıcıdan önce bir üye ayarlayabildiğiniz için, birden çok kurucu ile yapmanız gerektiği anlamına gelmez, bu mantığı takip etmeyi ZOR hale getirir. Özel ayarlayıcılar sizi yapıcı içinde veya daha sonra değerleri ayarlamaya zorlar.