Como parte de la documentación de Roslyn en GitHub, hay una página llamada Estado de implementación de la función de idioma , con funciones de lenguaje planificadas para C # y VB.
Una característica que no podía entender era el private protected
modificador de acceso:
private protected string GetId() { … }
También hay una página de Notas de diseño de lenguaje C # , que explica muchas características nuevas, pero no esta.
Eric Lippert dijo en un comentario :
Su error es pensar en los modificadores como restricciones crecientes. Los modificadores de hecho siempre disminuyen las restricciones. Recuerde, las cosas son "privadas" por defecto; solo agregando modificadores los hace menos restringidos.
¿Cuál es el significado de private protected
? ¿Cuándo podría usarlo?
c#
access-modifiers
c#-6.0
c#-7.2
Kobi
fuente
fuente
protected & internal
,assembly protected
oproternal
(espero que algunos de estos sean chistes). También está el hilo de discusión con algunas buenas ideas.protected | internal
yprotected & internal
Respuestas:
De acuerdo con " Professional C # 2008 " de De Bill Evjen y Jay Glynn, página 1699:
C ++ / CLI tiene una característica similar: definir y consumir clases y estructuras (C ++ / CLI)> Visibilidad de miembros :
fuente
internal
tipo sin requerir que el miembro esté expuesto a todo en la asamblea?internal
.internal
visibilidad (relacionada con el lugar donde se define la clase) es realmente ortogonal apublic
/protected
/private
visibilidad (relacionada con la herencia) y que, tal vez,internal
debería ser su propio modificador separado depublic
/protected
/private
.package
en Java se parece más al espacio de nombres en C #.Aquí están todos los modificadores de acceso en los diagramas de Venn, desde más limitantes hasta más promiscuos:
private
:private protected
: - agregado en C # 7.2internal
:protected
:protected internal
:public
:fuente
Esto es solo para proporcionar un gráfico (hecho con http://ashitani.jp/gv/ ) de los diferentes niveles de accesibilidad (las imágenes no caben en los comentarios).
Cada flecha significa "es más restrictivo que".
Los nombres son CLR
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Edición mucho más tarde: resultó que este nuevo y agradable nivel de acceso (con un nombre realmente pobre) finalmente no se incluyó en C # 6.0. Solo es compatible con C # 7.2 (y veo que actualizó sus "etiquetas" de preguntas).
fuente
a → b
en el diagrama significa "a
es más restrictivo queb
", por lo que puede "leer" la flecha como "es más restrictivo que" (eso fue lo que intenté explicar), por lo que la flecha apunta en el menos restrictivo " dirección". La convención opuesta para las flechas podría haber sido igual de buena, por cierto, pero tuve que elegir una convención.Es solo una suposición, pero por un nombre que posiblemente puedas adivinar es una versión más restringida de
protected
(o una versión más relajadaprivate
si lo deseas). Y solo una variante razonable es restringir elprotected
comportamiento al ensamblaje.Uso posible: entonces desea tener
protected
una implementación interna, pero no para usos externos (y no desea sellar la clase).PD: siempre existió en CLR, pero no en C # . Es una combinación de
protected
yinternal
, cita:fuente
"Puede ser" solo visible para las subclases que están en el mismo ensamblado. Esto lo hace un poco restringido que
protected
.fuente
Consulte las especificaciones de la función "privada protegida":
fuente