Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
La combinación de palabras clave private protected es un modificador de acceso de miembro. Los tipos que derivan de la clase y se declaran en el ensamblado contenedor pueden tener acceso a un miembro protegido privado. Para obtener una comparación de private protected con los otros modificadores de acceso, vea Niveles de accesibilidad.
La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.
La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.
Sugerencia
Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.
Los tipos derivados pueden tener acceso a un miembro protegido privado de una clase base en su ensamblado contenedor solo si el tipo estático de la variable es el tipo de clase derivado. Por ejemplo, considere el siguiente segmento de código:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
private protected int myValue = 0;
}
public class DerivedClass1 : BaseClass
{
void Access()
{
var baseObject = new BaseClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 5;
// OK, accessed through the current derived class instance
myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
void Access()
{
// Error CS0122, because myValue can only be
// accessed by types in Assembly1
// myValue = 10;
}
}
Este ejemplo contiene dos archivos, Assembly1.cs y Assembly2.cs.
El primer archivo contiene una clase base pública, BaseClass, y un tipo derivado de él, DerivedClass1.
BaseClass posee un miembro protegido privado, myValue que DerivedClass1 puede acceder como miembro heredado dentro del mismo ensamblado.
En el segundo archivo, un intento de obtener acceso myValue como miembro heredado de DerivedClass2 genera un error, ya que private protected los miembros solo son accesibles por tipos derivados dentro del mismo ensamblado. Esta restricción es la diferencia clave de protected (que permite el acceso desde clases derivadas de cualquier ensamblado) y protected internal (que permite el acceso desde cualquier clase dentro del mismo ensamblado o clases derivadas de cualquier ensamblado).
Si Assembly1.cs contiene un InternalsVisibleToAttribute valor de tipo que da nombre Assembly2a , la clase DerivedClass2 derivada tiene acceso a private protected los miembros declarados en BaseClass.
InternalsVisibleTo hace que los miembros private protected sean visibles para las clases derivadas en otros ensamblados.
Comparación con otros modificadores de acceso protegidos
En la tabla siguiente se resumen las diferencias clave entre los tres modificadores de acceso protegidos:
| Modificador de acceso | Mismo ensamblado, clase derivada | Mismo ensamblado, clase no derivada | Ensamblado diferente, clase derivada |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- Use
protectedcuando desee que las clases derivadas de cualquier ensamblado accedan al miembro. - Use
protected internalcuando desee el acceso más permisivo (cualquier clase del mismo ensamblado o clases derivadas en cualquier lugar). - Use
private protectedcuando desee el acceso protegido más restrictivo (solo las clases derivadas del mismo ensamblado).
No se pueden declarar private protected miembros struct porque no se pueden heredar estructuras.
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.