Comparteix a través de


protected internal (Referencia de C#)

La combinación de palabras claves protected internal es un modificador de acceso de miembro. Se puede obtener acceso a un miembro protected internal desde el ensamblado actual o desde tipos que se deriven de la clase contenedora. Para obtener una comparación de protected internal con los demás modificadores de acceso, vea Niveles de accesibilidad.

Ejemplo

Se puede obtener acceso a un miembro protected internal de una clase base desde cualquier tipo de ensamblado que lo contenga. También estará accesible en una clase derivada ubicada en otro ensamblado, pero solo si el acceso se produce a través de una variable del tipo de clase derivada. Por ejemplo, vea el siguiente segmento de código:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

        // OK, because this class derives from BaseClass.
        derivedObject.myValue = 10;
    }
}

Este ejemplo contiene dos archivos, Assembly1.cs y Assembly2.cs. El primer archivo contiene una clase base interna, BaseClass, y otra clase, TestAccess. BaseClass posee un miembro protected internal (myValue), al que se obtiene acceso por medio del tipo TestAccess. En el segundo archivo, un intento de tener acceso a myValue a través de una instancia de BaseClass generará un error, mientras que un acceso a este miembro a través de una instancia de una clase derivada (DerivedClass) se realizará correctamente.

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

Invalidar miembros internos protegidos

Al reemplazar un miembro virtual, el modificador de accesibilidad del método invalidado depende del ensamblado en el que se define la clase derivada.

Cuando la clase derivada se define en el mismo ensamblado que la clase base, todos los miembros invalidados tienen acceso protected internal. Si la clase derivada se define en un ensamblado diferente de la clase base, los miembros invalidados tienen acceso protected.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

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