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 o struct puede acceder a este miembro.
  • protected: solo el código en el mismo class o en un class 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.

Cuando una declaración de una clase parcial o un método parcial no declara su accesibilidad, tiene la accesibilidad de la otra declaración. 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 ser public o internal. 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 publicM 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.

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