Birisi bana C # 'korumalı' ve 'korumalı iç' değiştiriciler arasındaki farkı ayrıntılı olarak açıklayabilir misiniz? Görünüşe göre aynı şekilde davranıyorlar.
Birisi bana C # 'korumalı' ve 'korumalı iç' değiştiriciler arasındaki farkı ayrıntılı olarak açıklayabilir misiniz? Görünüşe göre aynı şekilde davranıyorlar.
Yanıtlar:
"Korumalı dahili" erişim değiştirici, "korumalı" ve "dahili" değiştiricilerin birleşimidir .
Gönderen MSDN, Erişim Modifiye edenler (C # Programlama Kılavuzu) :
korumalı :
Tür veya üyeye yalnızca aynı sınıf veya yapıdaki veya bu sınıftan türetilmiş bir sınıftaki kodla erişilebilir.
dahili :
Tür veya üyeye aynı montajdaki herhangi bir kodla erişilebilir, ancak başka bir montajdan erişilemez.
dahili korumalı :
Tür veya üyeye bildirildiği derlemedeki herhangi bir kodla VEYA başka bir derlemede türetilmiş bir sınıftan erişilebilir . Başka bir derlemeden erişim, korunan iç öğenin bildirildiği sınıftan türeyen bir sınıf bildirimi içinde gerçekleştirilmeli ve türetilmiş sınıf türünün bir örneği aracılığıyla gerçekleştirilmelidir.
Unutmayın : protected internal
" protected
VEYAinternal
" (aynı derlemedeki herhangi bir sınıf veya türetilmiş herhangi bir sınıf - farklı bir derlemede olsa bile).
... ve bütünlük için:
özel :
Tür veya üyeye yalnızca aynı sınıf veya yapıdaki kodla erişilebilir.
Tür veya üyeye aynı derlemedeki herhangi bir kod veya ona başvuran başka bir derleme tarafından erişilebilir.
Erişim, kapsayıcı sınıf veya geçerli derleme içinde kapsayıcı sınıftan türetilen türlerle sınırlıdır.
( C # 7.2'den beri mevcuttur )
protected
herhangi bir montajdan herhangi bir alt sınıf tarafından kullanılabilir.
protected internal
her şey protected
, ayrıca aynı montajdaki her şey ona erişebilir.
Önemlisi, "aynı meclis içindeki alt sınıflar" anlamına gelmez - kesişim değil ikisinin birliğidir.
private protected
C # 7.2'de sunulan erişim değiştirici ile elde edilebilir
Uygulamada, yöntemler hakkında:
korumalı - kalıtsal sınıflar için erişilebilir, aksi takdirde özel.
iç - yalnızca meclis içindeki sınıflar için, aksi takdirde özel.
korumalı dahili - korumalı veya dahili yöntemler, miras alınan sınıflar ve montaj içindeki tüm sınıflar için erişilebilir hale gelir .
protected
AND olarak işaretlemenin bir yolu var mı internal
?
protected internal
,.
private protected
docs.microsoft.com/tr-tr/dotnet/csharp/language-reference/…
Birçoğu doğru şekilde tanımlanmış tanımlara sahip olsa da, "korumalı dahili" erişimcilerin kapsamını anlama konusunda hala çok karışıklık var. Bu, "korumalı" ve "korumalı dahili" arasındaki karışıklığı anlamama yardımcı oldu:
kamu meclisin içinde ve dışında gerçekten kamusaldır ( kamu iç / kamu dış )
korumalı gerçekten montajın içinde ve dışında korunur ( korumalı iç / korumalı dış ) (üst düzey sınıflarda izin verilmez)
private , meclisin içinde ve dışında gerçekten özeldir ( özel iç / özel dış ) (üst düzey sınıflarda izin verilmez)
internal , meclis içinde gerçekten herkese açıktır, ancak özel (meclisin dışında / hariç tutulan harici ) gibi meclis dışında hariç tutulur
korumalı dahili montaj içinde gerçekten herkese açıktır ancak montaj dışında korunur ( genel dahili / korumalı harici ) (üst düzey sınıflarda izin verilmez)
Gördüğünüz gibi iç korumalı çok garip bir canavar. Sezgisel değil.
Şimdi Microsoft neden bir ( korumalı iç / dış dış korumalı) oluşturmadı ya da bir tür "özel korumalı" veya "iç korumalı" sanmıyorum sorusunu yalvarır ? lol. Eksik görünüyor mu?
Karışıklıklara ek olarak, ortak veya korumalı iç yuvalanmış üyeleri korumalı, iç veya özel türlerin içine yerleştirebilirsiniz. Neden derleme dışındaki bir korumalı "korumalı iç" e bir iç sınıf içinde erişiyorsunuz?
Microsoft, bu tür iç içe geçmiş türlerin üst tür kapsamlarıyla sınırlı olduğunu, ancak derleyicinin söylediği bu olmadığını söylüyor. Kapsamı yalnızca derleme ile sınırlaması gereken iç sınıflar içindeki korumalı içleri derleyebilirsiniz.
Bana göre bu eksik tasarım gibi geliyor. Tüm türlerin kapsamını, kalıtımın yanı sıra iç içe türlerin güvenliği ve hiyerarşisini açıkça dikkate alan bir sisteme sadeleştirmiş olmalıdırlar. Bu, eksik bir kapsam belirleme sistemine dayalı olarak türlerin ve üyelerin erişilebilirliğini keşfetmek yerine nesnelerin paylaşımını son derece sezgisel ve ayrıntılı yapacaktır.
Bu terimler için çok net tanımları okudum.
Korumalı: Erişim sınıf tanımıyla ve sınıftan miras alan herhangi bir sınıfla sınırlıdır. Tür veya üyeye yalnızca aynı sınıf veya yapıdaki veya o sınıftan türetilen bir sınıftaki kodla erişilebilir.
Dahili: Erişim yalnızca mevcut proje montajında tanımlanan sınıflarla sınırlıdır. Tür veya üyeye yalnızca aynı sınıftaki kodla erişilebilir.
Korumalı-Dahili: Erişim, geçerli derleme veya kapsayıcı sınıftan türetilen türlerle sınırlıdır.
Korunan Üye
Korumalı Üye sadece içerdiği sınıfta (içinde bildirildiği) ve derlemenin içinde ve derlemenin dışında türetilmiş sınıfta bulunur.
Derlemenin dışında kalan bir sınıfın, yalnızca bu sınıfı devralarak diğer derlemenin korumalı üyesini kullanıp kullanamayacağı anlamına gelir.
Korumalı üyeyi derleme dışında bu sınıfı miras alarak gösterebilir ve yalnızca türetilmiş sınıfta kullanabiliriz.
Not: Korunan üyelere türetilmiş sınıftaki nesne kullanılarak erişilemez.
Dahili Üye
Bir sınıfın Dahili Üyesi, nesne içinde veya türetilmiş bir sınıfta derleme içinde kullanılabilir veya erişebilir ya da derlemenin tüm sınıflarında erişilebilir olduğunu söyleyebilirsiniz.
Not: İç üyelere, nesne oluşturma veya türetilmiş bir sınıfta derleme dışında erişilemez.
Korumalı Dahili
Korumalı Dahili erişim değiştirici, Korumalı veya Dahili kombinasyonudur.
Korumalı Dahili Üye, nesne oluşturduğunu veya söz konusu sınıfı devraldığı bildirildiği tüm derleme içinde kullanılabilir. Ve montaj dışında sadece türetilmiş bir sınıfta erişilebilir.
Not: Korumalı Dahili üye, aynı montaj içinde Dahili olarak ve montaj dışında için Korumalı olarak çalışır.
public - Herkese açık olarak bildirilen üyelere (İşlevler ve Değişkenler) her yerden erişilebilir.
private - Özel üyelere sınıf dışından erişilemez. Bu, bir üye için varsayılan erişim belirtecidir, yani bir üye (değişken veya işlev) için bir erişim belirteci belirtmezseniz, özel olarak kabul edilir. Bu nedenle, PhoneNumber dizesi; , PhoneNumber özel dizesine eşdeğerdir.
korumalı - Korumalı üyelere yalnızca alt sınıflardan erişilebilir.
dahili - Yalnızca aynı montajdan erişilebilir.
korumalı iç - Aynı derlemede ve türetilmiş sınıfta erişilebilir.
Bir üyenin veya türün başka bir derlemeden türetilmiş bir sınıfta aynı anda kullanılmasını istediğinizde, korunan iç en iyi suitler, bildirildiği sınıftan türetmeksizin, üyeyi veya üst derleme türünü kullanmak isterler. Ayrıca, yalnızca başka bir sınıftan türetilen bir üye veya tür kullanmak istiyorsanız, aynı derlemede yalnızca dahili olanı kullanabilirsiniz.
protected internal
böyleceprotected
mevcut toplantıda ve harici olarak tamamen kullanılamıyor mu?