'Korumalı' ve 'korumalı dahili' arasındaki fark nedir?


244

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:


402

"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" protectedVEYAinternal " (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.

herkese açık :

Tür veya üyeye aynı derlemedeki herhangi bir kod veya ona başvuran başka bir derleme tarafından erişilebilir.

özel korumalı :

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 )


2
Bir üye alabilir miyim, protected internalböylece protectedmevcut toplantıda ve harici olarak tamamen kullanılamıyor mu?
Shimmy Weitzhandler

8
Bu "Korumalı" olurdu, değil mi?
CAD

2
@Shimmy: korumalı yöntemlerle bir iç sınıfa sahip olabilirsiniz . Ancak daha sonra tüm sınıf harici meclislerden kullanılamayacak.
M4N


@Shimmy En azından CLR, korumalı ve dahili erişilebilirliğin kesişme kavramını destekliyor, ancak C # dili desteklemiyor. C #, yalnızca iki erişim değiştiricisinin birleşimini destekler.
RBT

89

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.


3
CLR'nin korumalı ve dahili erişilebilirliğin kesişim kavramını da desteklediği okuyucular için sadece bir FYI, ancak C # bunu desteklemiyor. C #, bu yayında belirtildiği gibi yalnızca ikisinin birleşimini destekler.
RBT

1
Okuyucular için sadece bir başka FYI, "aynı derlemedeki alt sınıflar" private protectedC # 7.2'de sunulan erişim değiştirici ile elde edilebilir
LordWilmore

52

- Güncelleme cevabı 2019 -

Aşağıdaki tablo tabanlı erişilebilirlik farkı evet,

resim açıklamasını buraya girin


4
Güzel cevap, her erişim değiştirici arasındaki farkları çok net bir şekilde iletir.
e_i_pi

23

Uygulamada, yöntemler hakkında:

korumalı - kalıtsal sınıflar için erişilebilir, aksi takdirde özel.

- 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 .


1
Ben OR her ikisinin de doğru olması gerekmediğini ifade etmek için kullanabilirsiniz.
Brian Rasmussen

"Korumalı" açıklamasında "temel sınıf davranışını değiştirmek için" bölümü ile tamamen aynı fikirde değilim. Burası "sanal" (temel sınıf) ve "geçersiz kılma" (türetilmiş sınıf) kullandığınız yerdir.
M4N

Bir üyeyi protectedAND olarak işaretlemenin bir yolu var mı internal?
Shimmy Weitzhandler

@Shimmy: evet protected internal,.
abatishchev

1
@Shimmy iki yıl sonra, evet. Şimdi C # 7.2'de bir yol var. Adı private protected docs.microsoft.com/tr-tr/dotnet/csharp/language-reference/…
Pauli Østerø

10

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.


1
özel korumalı, temelde dahili VE korumalı olan C # 7.2'ye eklendi.
Pauli Østerø

7

korumalı : değişken veya yöntem yalnızca alt sınıflar tarafından kullanılabilir (herhangi bir derlemede)

İç korumalı : mevcut çocuk sınıflarına herhangi montaj ve sınıflara tümüne aynı derlemenin içinde


3

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.


1

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.


1

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.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.