Como parte da documentação do Roslyn no GitHub, existe uma página chamada Status de implementação do recurso de idioma , com recursos de idioma planejado para C # e VB.
Um recurso que eu não conseguia entender era o private protected
modificador de acesso:
private protected string GetId() { … }
Há também uma página do C # Language Design Notes , que explica muitos novos recursos, mas não este.
Eric Lippert disse em um comentário :
Seu erro é pensar nos modificadores como restrições crescentes. Na verdade, os modificadores sempre diminuem as restrições. Lembre-se, as coisas são "privadas" por padrão; somente adicionando modificadores você os torna menos restritos.
Qual é o significado de private protected
? Quando devo usá-lo?
c#
access-modifiers
c#-6.0
c#-7.2
Kobi
fonte
fonte
protected & internal
,assembly protected
ouproternal
(espero que alguns sejam piadas). Há também o tópico de discussão com algumas idéias interessantes.protected | internal
eprotected & internal
Respostas:
De acordo com o " Professional C # 2008 " de De Bill Evjen e Jay Glynn, página 1699:
O C ++ / CLI possui um recurso semelhante - Definir e consumir classes e estruturas (C ++ / CLI)> Visibilidade do membro :
fonte
internal
tipo sem exigir que ele seja exposto a tudo na montagem?internal
.internal
visibilidade (relacionada a onde a classe é definida) é realmente ortogonal apublic
/protected
/private
visibilidade (relacionada a herança) e que, talvez,internal
deva ser seu próprio modificador separado depublic
/protected
/private
.package
em Java é mais como espaço para nome em C #.Aqui estão todos os modificadores de acesso nos diagramas de Venn, de mais limitantes a mais promíscuos:
private
:private protected
: - adicionado no C # 7.2internal
:protected
:protected internal
:public
:fonte
Isso serve apenas para fornecer um gráfico (feito com http://ashitani.jp/gv/ ) dos diferentes níveis de acessibilidade (as imagens não se encaixam nos comentários).
Cada seta significa "é mais restritivo que".
Os nomes CLR são
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Edição muito mais tarde: o novo nível de acesso (com um nome muito ruim) acabou não sendo incluído no C # 6.0. É suportado apenas no C # 7.2 (e vejo que você atualizou sua pergunta "tags").
fonte
a → b
no diagrama significa "a
é mais restritivo queb
", para que você possa "ler" a seta como "é mais restritivo que" (foi o que tentei explicar), de modo que a seta aponta para o menos restritivo " direção". A convenção oposta para as flechas poderia ter sido igualmente boa, a propósito, mas eu tive que escolher uma convenção.É apenas um palpite, mas, a partir de um nome, você pode adivinhar que é uma versão mais restrita
protected
(ou mais descontraída,private
se desejar). E apenas uma variante razoável disso está restringindo oprotected
comportamento à montagem.Uso possível: então você quer ter
protected
para implementação interna, mas não para usos externos (e não deseja selar a classe).PS: Ele sempre existiu no CLR, mas não no C # . É uma combinação de
protected
einternal
, citação:fonte
"Pode ser" visível apenas para subclasses que estão no mesmo assembly. Isso torna um pouco restrito que
protected
.fonte
Veja a especificação do recurso "protegido particular":
fonte