c# access-modifiers c#-6.0 c#-7.2

¿Cuál es el significado del modificador de acceso C#"protegido privado" planificado?



access-modifiers c#-6.0 (6)

"Puede ser" solo visible para las subclases que están en el mismo ensamblaje. Esto lo hace un poco más restringido que protected .

Como parte de la documentación de Roslyn en GitHub, hay una página llamada estado de implementación de la característica Idioma , con funciones de lenguaje planificadas para C # y VB.

Una característica que no pude entender fue private protected modificador de acceso private protected :

private protected string GetId() { … }

También hay una página de C # Language Design Notes , que explica muchas características nuevas, pero no esta.

Eric Lippert dijo en un comment :

Tu 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 haces menos restringidos.

¿Cuál es el significado de private protected ? ¿Cuándo podría usarlo?


Aquí están todos los modificadores de acceso en los diagramas de Venn, desde más limitadores a más promiscuos:

private :

private protected : - agregado en C # 7.2

internal :

protected :

protected internal :

public :


Consulte las spec para la función "protegido privado":

El significado intuitivo de privado protegido es "accesible dentro de este conjunto por tipos derivados de la clase contenedora".



Es solo una suposición, pero de un nombre podría adivinar que es una versión más restringida de la versión protected , (o más relajada si lo desea). Y solo una variante razonable de ello es restringir el comportamiento protected al ensamblaje.

Uso posible: luego desea tener protected para la implementación interna, pero no para usos externos (y no desea sellar la clase).

PS: siempre existió en CLR, pero no en C # . Es una combinación de protected e internal , cita:

CLR también es compatible con el tipo de acceso "Familia y ensamblaje". Esto significa que se puede acceder al método desde el tipo de declaración, tipos anidados y derivados, pero solo si se declaran en el mismo ensamblado. Bueno, aparentemente el equipo de C # no pensó en esto como una característica muy útil, por lo que no es compatible con este lenguaje.


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 de CLR son Private , FamilyANDAssembly y Assembly , Assembly , Family , FamilyORAssembly Family , Public .

Editar mucho más tarde: Resultó que este nuevo y agradable nivel de acceso (con un nombre realmente pobre) no se incluyó finalmente en C # 6.0. Solo se admite desde C # 7.2 (y veo que actualizaste las "etiquetas" de tu pregunta).