Modificadores de acceso (Guía de programación de C#)

Actualización: noviembre 2007

Todos los tipos y miembros de tipo tienen un nivel de accesibilidad, que controla si pueden utilizarse por otro código de su ensamblado u otros ensamblados. La accesibilidad de un tipo o miembro se especifica al declararlo utilizando uno de estos modificadores de acceso:

  • public
    Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste.

  • private
    Solamente puede obtener acceso al tipo o miembro código de la misma clase o estructura.

  • protected
    Solamente puede obtener acceso al tipo o miembro código de la misma clase o estructura o de una clase derivada.

  • internal
    Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto.

  • protected internal
    Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado o cualquier clase derivada de otro ensamblado.

En los ejemplos siguientes se muestra cómo especificar modificadores de acceso en un tipo y un miembro:

public class Bicycle
{
    public void Pedal() { }
}

No todos los tipos o miembros pueden utilizar todos los modificadores de acceso en todos los contextos. Además, en algunos casos, la accesibilidad de un miembro de tipo está restringida por la accesibilidad de su tipo contenedor. En las secciones siguientes se proporcionan más detalles sobre la accesibilidad.

Accesibilidad a clases y estructuras

Las clases y estructuras declaradas directamente en un espacio de nombres (es decir, que no se anidan dentro de otras clases o estructuras) pueden ser públicas o internas. Si no se especifica un modificador de acceso, internal es el valor predeterminado. Las clases y estructuras anidadas también pueden declararse como privadas. No se puede obtener acceso a tipos anidados privados desde el tipo contenedor.

Las clases derivadas no pueden tener mayor accesibilidad que sus tipos base. En otras palabras, no puede tener una clase pública B que se derive de una clase interna A. Si se permitiera, A se haría pública, porque se puede obtener acceso a todos los miembros internos o protegidos de A desde la clase derivada.

Puede permitir a otros ensamblados concretos el acceso a sus tipos internos utilizando el atributo InternalsVisibleTo. Para obtener más información, vea Ensamblados de confianza (Guía de programación de C#).

Accesibilidad de un miembro de clase y estructura

Los miembros de clase (incluyendo clases y estructuras anidadas) pueden declararse con cualquiera de los cinco tipos de acceso. Los miembros de estructura no pueden declararse como protegidos porque las estructuras no admiten la herencia.

La accesibilidad de un miembro nunca puede ser mayor que la de su tipo contenedor. Por ejemplo, un método público declarado en un tipo interno sólo tiene accesibilidad interna.

Cuando un miembro de una clase o estructura es una propiedad, campo, método, evento o delegado y dicho miembro es un tipo o tiene un tipo como parámetro o valor devuelto, la accesibilidad del miembro no puede ser mayor que la del tipo. Por ejemplo, no puede tener un método público M que devuelva una clase C a menos que C sea también pública. De igual forma, no puede tener una propiedad protegida de tipo A si A se declara como privado.

Los operadores definidos por el usuario siempre deben declararse como públicos. Para obtener más información, vea operator (Referencia de C#).

Los destructores no pueden tener modificadores de accesibilidad.

Para establecer el nivel de acceso para un miembro de clase o estructura, agregue la palabra clave adecuada a la declaración del miembro. A continuación se muestran algunos ejemplos:

// 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; }
    }
}
Nota:

La accesibilidad protectedinternal significa protegido O interno, no protegido E interno. En otras palabras, un miembro protectedinternal es accesible desde cualquier clase en el mismo ensamblado, incluso las clases derivadas. Para limitar la accesibilidad sólo a clases derivadas en el mismo ensamblado, declare la propia clase como interna y declare sus miembros como protegidos.

Otros tipos

Las interfaces declaradas directamente con un espacio de nombres pueden declararse como públicas o internas y, al igual que las clases y estructuras, el valor predeterminado de las interfaces es el acceso interno. Los miembros de interfaz son siempre públicos porque el propósito de una interfaz es permitir que otros tipos tengan acceso a una clase o estructura. No se pueden aplicar modificadores de acceso a los miembros de interfaz.

Los miembros de enumeración son siempre públicos y no se puede aplicar ningún modificador de acceso.

De forma predeterminada, los delegados tienen acceso interno.

Especificación del lenguaje C#

Para obtener más información, vea las secciones siguientes en la Especificación del lenguaje C#:

  • 3.5 Acceso a miembros

  • 10.3.5 Modificadores de acceso

Vea también

Conceptos

Guía de programación de C#

Referencia

Clases y estructuras (Guía de programación de C#)

Interfaces (Guía de programación de C#)

private (Referencia de C#)

public (Referencia de C#)

internal (Referencia de C#)

protected (Referencia de C#)

class (Referencia de C#)

struct (Referencia de C#)

interface (Referencia de C#)