private protected (Referencia de C#)

La combinación de palabras claves private protected es un modificador de acceso de miembro. Los miembros private protected están accesibles para los tipos que se deriven de la clase contenedora, pero solo desde dentro del ensamblado correspondiente que lo contenga. Para obtener una comparación de private protected con los demás modificadores de acceso, vea Niveles de accesibilidad.

Nota:

El modificador de acceso private protected es válido en C# versión 7.2 y versiones posteriores.

Ejemplo

Se puede tener acceso a un miembro private protected de una clase base desde tipos derivados en el ensamblado que lo contiene solo si el tipo estático de la variable es el tipo de clase derivada. Por ejemplo, vea el siguiente segmento de código:

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 ella, DerivedClass1. BaseClass posee un miembro private protected, myValue, al que DerivedClass1 intenta tener acceso de dos maneras. El primer intento de acceso a myValue a través de una instancia de BaseClass generará un error. En cambio, el intento de usarlo como un miembro heredado en DerivedClass1 se realizará correctamente.

En el segundo archivo, un intento de tener acceso a myValue como un miembro heredado de DerivedClass2 generará un error, ya que solo está accesible para los tipos derivados en Assembly1.

Si Assembly1.cs contiene un elemento InternalsVisibleToAttribute que asigna un nombre a Assembly2, la clase derivada DerivedClass2 tendrá acceso a los miembros private protected declarados en BaseClass. InternalsVisibleTo hace que los miembros private protected sean visibles para las clases derivadas en otros ensamblados.

Los miembros de struct no pueden ser private protected, porque los structs no se heredan.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también