Planlanan “özel korumalı” C # erişim değiştiricisinin anlamı nedir?


133

GitHub'daki Roslyn belgelerinin bir parçası olarak, C # ve VB için planlanan dil özelliklerine sahip Dil özelliği uygulama durumu adlı bir sayfa var .

Kafamı saramadığım bir özellik private protectederişim değiştiriciydi:

private protected string GetId() {  } 

Orada bir sayfa da C # Dili Tasarım Notları bu bir birçok yeni özellik açıklar, ancak.

Eric Lippert bir yorumda şunları söyledi :

Hatanız değiştiricileri artan kısıtlamalar olarak düşünüyor. Değiştiriciler aslında kısıtlamaları her zaman azaltır. Unutmayın, işler varsayılan olarak "özel" dir; yalnızca değiştiriciler ekleyerek onları daha az kısıtlı hale getirirsiniz.

Anlamı ne private protected? Ne zaman kullanabilirim?


2
VB dil tasarım notları altında bu konuda bilgi olduğunu unutmayın .
Jesse Good

3
MethodAttributes.FamANDAssem ile eşlenen bir eşlemdir. C # tuhaf bir eşleme vardır, (Özel | FamANDAssem) kullanır. Ve (Private | Family) için dahili korumalı haritalar. CLR özellikleri tuhaf.
Hans Passant

22
Önerilen bu özellik yorumumu yanlış yapacaktır.
Eric Lippert

C # tasarım ekibi, bu özellik için önerilen alternatif sözdizimine sahip bir anket yayınladı . Bunlardan bazıları gibi ilginç protected & internal, assembly protectedveya proternal(bunlardan bazı espriler umut). Bazı hoş bilgiler içeren Tartışma dizisi de var .
Kobi

1
Özellik artık Dil Özelliği uygulama durumunda geri çekildi! Şahsen bu erişim seviyesi fikrini seviyorum ve bunun yararlı bir özellik olduğunu düşünüyorum. Kodumu sınıf tasarımına göre tutmak için korumalı kullanmak istiyorum, ancak başkalarının bu üyelere erişim sağlayan çılgın alt sınıflar yazmasını istemiyorum. IMO en iyi çözüm yazabilirsek olurdu protected | internalveprotected & internal
Felix Keil

Yanıtlar:


98

De Bill Evjen ve Jay Glynn tarafından yazılan " Profesyonel C # 2008 " e göre, sayfa 1699:

özel korumalı - "yalnızca geçerli derlemede türetilen türler"

C ++ / CLI benzer bir özelliğe sahiptir - Sınıfları ve Yapıları Tanımla ve Kullan (C ++ / CLI)> Üye görünürlüğü :

private protected-VEYA- protected private- Üye meclis içinde korunur, ancak meclis dışında özeldir.


72
Yani "korumalı veya dahili" yerine "korumalı ve dahili" mi?
user541686

2
Artık türetilmiş sınıfların erişebildiği bir üyenin internal, meclis içindeki her şeye maruz kalmasını gerektirmeden türden şeyleri kabul etmesi veya iade etmesi mümkün olacak mı?
supercat

Teşekkürler! Bunu düşünmedim. Aslında bu değiştiriciyi kullanacağım ve tekrar düştüğüm vakalarım var internal.
Kobi

3
Bu teklifin / özelliğin varlığı, internalgörünürlüğün (sınıfın tanımlandığı yerle ilgili) public/ protected/ privategörünürlüğünün (kalıtımla ilgili ) gerçekten dikey olduğunu ve belki de / / ' internaldan ayrı olarak kendi değiştiricisinin olması gerektiğini düşündürmektedir . publicprotectedprivate
jpmc26

1
@jww - Java'ya çok aşina değilim, ama packageJava'da bildiğim kadarıyla C # 'daki ad alanı gibi.
Gogutz


28

Bu sadece farklı erişilebilirlik seviyelerinin (resimler yorumlara uymuyor) bir grafiğini ( http://ashitani.jp/gv/ ile yapılır ) sağlamak içindir.

C # erişim seviyelerinin digraph diyagramı

Her ok "daha kısıtlayıcıdır" anlamına gelir.

CLR isimler Private, FamilyANDAssembly, Assembly, Family, FamilyORAssembly, Public.


Çok daha sonra düzenleme: Bu (gerçekten kötü bir isimle) bu güzel yeni bir erişim düzeyi ortaya çıktı değil sonuçta C # 6.0 dahil. Sadece C # 7.2'den desteklenmektedir (ve sorunuzu "etiketler" olarak güncellediğinizi görüyorum).


Sadece ben olabilirim, ama oklar 'daha az kısıtlayıcı' yönde gidiyor gibi görünüyor.
acarlon

4
@acarlon Evet, a → bşemada " adaha kısıtlayıcı " anlamına gelir b, bu nedenle oku "daha fazla kısıtlayıcı" olarak (açıklamaya çalıştığım şey) "okuyabilirsiniz", böylece ok en az kısıtlayıcı olanı gösterir. yönü". Bu arada oklar için tam tersi konvansiyon da iyi olabilirdi, ama bir kongre seçmek zorunda kaldım.
Jeppe Stig Nielsen

10

Bu sadece bir tahmindir, ancak bir addan muhtemelen daha kısıtlı bir versiyonudur protected(veya privateisterseniz daha rahat bir versiyonudur ). Ve bunun sadece makul bir çeşidi, protecteddavranışı montajla sınırlamaktır .

Olası kullanım: sonra protected dahili uygulama , ancak harici kullanımlar için değil (ve sınıfı mühürlemek istemezsiniz).

PS Her zaman CLR'de vardı, ama C # 'da yoktu . Bu, protected ve bir internal alıntıdır:

CLR ayrıca “Aile ve montaj” erişim türünü de destekler. Bu, yönteme bildiren türden, iç içe ve türetilmiş türlerden erişilebileceği anlamına gelir, ancak yalnızca aynı derlemede bildirilmişlerse. Görünüşe göre C # ekibi bunu çok kullanışlı bir özellik olarak düşünmedi, bu yüzden bu dilde desteklenmiyor.


CLR yorumu için +1 - C # çok fazla zaman harcadım ve diğer .NET dillerinde bu gün çok az zaman zaman bazen aynı şey olmadığını unutuyorum.
brichins

@DarrelHoffman not ettiğiniz için teşekkürler! Düşüncelerimi biraz karıştırdım)
Petr Abdulin

5

"Belki" yalnızca aynı derlemedeki alt sınıflar tarafından görülebilir. Bu onu biraz kısıtlıyor protected.


1

"Özel korumalı" özellik için teknik özelliklere bakın :

Özel korumanın sezgisel anlamı “bu derlemede, kapsayıcı sınıftan türetilmiş türler tarafından erişilebilir”.

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.