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 protected internal es un modificador de acceso de miembro. Puede acceder a un miembro interno protegido desde el ensamblado actual o desde tipos derivados de la clase contenedora. Para obtener una comparación de protected internal 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#.
Cualquier tipo dentro del ensamblado contenedor puede tener acceso a un miembro interno protegido de una clase base. Una clase derivada ubicada en otro ensamblado solo puede tener acceso al miembro si el acceso se produce a través de una variable del tipo de clase derivada. Por ejemplo, considere 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 pública, BaseClass, y otra clase , TestAccess.
BaseClass posee un miembro interno protegido, , myValueal que el TestAccess tipo accede porque están en el mismo ensamblado.
En el segundo archivo, un intento de acceder myValue a través de una instancia de BaseClass produce un error, mientras que un acceso a este miembro a través de una instancia de una clase derivada, DerivedClass se realiza correctamente. Esta regla de acceso muestra que permite el acceso desde cualquier clase dentro del mismo ensamblado o clases derivadas de cualquier ensamblado, lo que protected internal lo convierte en el más permisivo de los modificadores de acceso protegidos.
Los miembros de estructura no pueden ser protected internal porque la estructura no se puede heredar.
Invalidar miembros internos protegidos
Al invalidar un miembro virtual, el modificador de accesibilidad del método invalidado depende del ensamblado donde defina la clase derivada.
Al definir la clase derivada en el mismo ensamblado que la clase base, todos los miembros invalidados tienen protected internal acceso. Si define la clase derivada en un ensamblado diferente de la clase base, los miembros invalidados tienen protected acceso.
// 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 el origen definitivo de la sintaxis y el uso de C#.