Modificadores de acceso (Guía de programación de C#)
Todos los tipos y miembros de tipo tienen un nivel de accesibilidad. El nivel de accesibilidad controla si se pueden usar desde otro código del ensamblado u otros ensamblados. Un ensamblado es un archivo .dll o .exe creado mediante la compilación de uno o varios archivos .cs en una sola compilación. Use los modificadores de acceso siguientes para especificar la accesibilidad de un tipo o miembro cuando lo declare:
- public: el código de cualquier ensamblado puede tener acceso a este tipo o miembro. El nivel de accesibilidad del tipo contenedor controla el nivel de accesibilidad de los miembros públicos del tipo.
- private: solo el código declarado en el mismo
class
ostruct
puede acceder a este miembro. - protected: solo el código en el mismo
class
o en unclass
derivado puede tener acceso a este tipo o miembro. - internal: solo el código del mismo ensamblado puede tener acceso a este tipo o miembro.
- protected internal: solo el código del mismo ensamblado o de una clase derivada de otro ensamblado puede tener acceso a este tipo o miembro.
- private protected: solo el código del mismo ensamblado y en la misma clase o una clase derivada puede tener acceso al tipo o miembro.
- archivo: solo el código del mismo archivo puede tener acceso al tipo o al miembro.
El modificador record
de un tipo hace que el compilador sintetice miembros adicionales. El modificador record
no afecta a la accesibilidad predeterminada para record class
o record struct
.
Tabla de resumen
Ubicación del autor de la llamada | public |
protected internal |
protected |
internal |
private protected |
private |
file |
---|---|---|---|---|---|---|---|
Dentro del archivo | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Dentro de la clase | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Clase derivada (mismo ensamblado) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Clase no derivada (mismo ensamblado) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ | ❌ |
Clase derivada (otro ensamblado) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ |
Clase no derivada (otro ensamblado) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
En los ejemplos siguientes se muestra cómo especificar modificadores de acceso en un tipo y miembro:
public class Bicycle
{
public void Pedal() { }
}
No todos los modificadores de acceso son válidos para todos los tipos o miembros de todos los contextos. En algunos casos, la accesibilidad del tipo contenedor restringe la accesibilidad de sus miembros.
Varias declaraciones de una clase parcial o un miembro parcial deben tener la misma accesibilidad. Si una declaración de la clase o miembro parcial no incluye un modificador de acceso, las demás declaraciones no pueden declarar un modificador de acceso. El compilador genera un error si varias declaraciones para la clase o método parcial declaran distintas accesibilidades.
Accesibilidad de clases y estructuras
Las clases y estructuras que se declaran directamente en un espacio de nombres (que no están anidadas en otras clases o estructuras) pueden tener acceso public
, internal
o file
. Si no se especifica ningún modificador de acceso, el valor predeterminado es internal
.
Los miembros de estructura, incluidas las clases y las estructuras anidadas, se pueden declarar como public
, internal
o private
. Los miembros de clase, incluidas las clases y las estructuras anidadas, pueden ser public
, protected internal
, protected
, internal
, private protected
o private
. Los miembros de clase y estructura, incluidas las clases y las estructuras anidadas, tienen acceso private
de forma predeterminada.
Las clases derivadas no pueden tener mayor accesibilidad que sus tipos base. No se puede declarar una clase pública B
que derive de una clase interna A
. Si se permitiera, convertiría A
en público, porque todos los miembros protected
o internal
de A
son accesibles desde la clase derivada.
Puede habilitar otros ensamblados concretos para acceder a los tipos internos mediante InternalsVisibleToAttribute
. Para más información, vea Ensamblados de confianza.
Otros tipos
Las interfaces declaradas directamente en un espacio de nombres pueden ser public
o internal
y, al igual que las clases y las estructuras, su valor predeterminado es el acceso internal
. Los miembros de interfaz son public
de manera predeterminada porque el propósito de una interfaz es permitir que otros tipos accedan a una clase o estructura. Las declaraciones de miembros de interfaz pueden incluir cualquier modificador de acceso. Los modificadores de acceso se usan en los miembros interface
para proporcionar una implementación común necesaria para todos los implementadores de una interfaz.
Un tipo delegate
declarado directamente en un espacio de nombres tiene acceso internal
de forma predeterminada.
Para más información sobre los modificadores de acceso, consulte la página Niveles de accesibilidad.
Accesibilidad de miembros
Los miembros de class
o struct
(incluidas las clases y las estructuras anidadas) se pueden declarar con cualquiera de los seis tipos de acceso. Los miembros de estructura no se pueden declarar como protected
, protected internal
o private protected
porque las estructuras no admiten la herencia.
Normalmente, la accesibilidad de un miembro no es mayor que la del tipo que lo contiene. Sin embargo, un miembro public
de una clase internal
podría ser accesible desde fuera del ensamblado si el miembro implementa los métodos de interfaz o invalida los métodos virtuales definidos en una clase base pública.
El tipo de cualquier miembro que sea un campo, propiedad o evento debe ser al menos tan accesible como el propio miembro. Del mismo modo, el tipo devuelto y los tipos de parámetro de cualquier método, indizador o delegado deben ser al menos tan accesibles como el propio miembro. Por ejemplo, no puede tener un método public
M
que devuelva una clase C
a menos que C
también sea public
. Del mismo modo, no puede tener una propiedad protected
de tipo A
si A
se declara como private
.
Los operadores definidos por el usuario siempre se deben declarar como public
y static
. Para obtener más información, vea Sobrecarga de operadores.
Para establecer el nivel de acceso de un miembro de class
o struct
, agregue la palabra clave adecuada a la declaración de miembro, como se muestra en el ejemplo siguiente.
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int _wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return _wheels; }
}
}
Los finalizadores no pueden tener modificadores de accesibilidad. Los miembros de un tipo enum
siempre son public
y no se les puede aplicar ningún modificador de acceso.
El modificador de acceso file
solo se permite en declaraciones de tipo de nivel superior (no anidadas).
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#.