Modificadores de acceso (Guía de programación de C#)Access Modifiers (C# Programming Guide)

Todos los tipos y miembros de tipo tienen un nivel de accesibilidad.All types and type members have an accessibility level. El nivel de accesibilidad controla si se pueden usar desde otro código del ensamblado u otros ensamblados.The accessibility level controls whether they can be used from other code in your assembly or other assemblies. Use los modificadores de acceso siguientes para especificar la accesibilidad de un tipo o miembro cuando lo declare:Use the following access modifiers to specify the accessibility of a type or member when you declare it:

  • public: Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste.public: The type or member can be accessed by any other code in the same assembly or another assembly that references it.
  • private: solamente el código de la misma class o struct puede acceder al tipo o miembro.private: The type or member can be accessed only by code in the same class or struct.
  • protected: solamente el código de la misma class, o bien de una class derivada de esa class, puede acceder al tipo o miembro.protected: The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
  • internal: Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto.internal: The type or member can be accessed by any code in the same assembly, but not from another assembly.
  • protected internal: cualquier código del ensamblado en el que se ha declarado, o desde una class derivada de otro ensamblado, puede acceder al tipo o miembro.protected internal: The type or member can be accessed by any code in the assembly in which it's declared, or from within a derived class in another assembly.
  • private protected: el código de la misma class, o de un tipo derivado de esa class, puede acceder al tipo o miembro solo dentro de su ensamblado de declaración.private protected: The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class.

En los ejemplos siguientes se muestra cómo especificar modificadores de acceso en un tipo y miembro:The following examples demonstrate how to specify access modifiers on a type and member:

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.Not all access modifiers are valid for all types or members in all contexts. En algunos casos, la accesibilidad de un miembro de tipo está restringida por la accesibilidad de su tipo contenedor.In some cases, the accessibility of a type member is constrained by the accessibility of its containing type.

Accesibilidad de clases y estructurasClass and struct accessibility

Las clases y estructuras que se declaran directamente en un espacio de nombres (es decir, que no están anidadas en otras clases o estructuras) pueden ser public o internal.Classes and structs declared directly within a namespace (in other words, that aren't nested within other classes or structs) can be either public or internal. Si no se especifica ningún modificador de acceso, el valor predeterminado es Internal.Internal is the default if no access modifier is specified.

Los miembros de estructura, incluidas las clases y las estructuras anidadas, se pueden declarar como public, internal o private.Struct members, including nested classes and structs, can be declared public, internal, or private. Los miembros de clase, incluidas las clases y las estructuras anidadas, pueden ser public, protected internal, protected, internal, private protected o private.Class members, including nested classes and structs, can be public, protected internal, protected, internal, private protected, or private. Los miembros de clase y de estructura, incluidas las clases y estructuras anidadas, tienen acceso private de forma predeterminada.Class and struct members, including nested classes and structs, have private access by default. Los tipos anidados privados no son accesibles desde fuera del tipo contenedor.Private nested types aren't accessible from outside the containing type.

Las clases derivadas no pueden tener mayor accesibilidad que sus tipos base.Derived classes can't have greater accessibility than their base types. No se puede declarar una clase pública B que derive de una clase interna A.You can't declare a public class B that derives from an internal class 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.If allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.

Puede habilitar otros ensamblados concretos para acceder a los tipos internos mediante InternalsVisibleToAttribute.You can enable specific other assemblies to access your internal types by using the InternalsVisibleToAttribute. Para más información, vea Ensamblados de confianza.For more information, see Friend Assemblies.

Accesibilidad de miembros de clase y estructuraClass and struct member accessibility

Los miembros de clase (incluidas las clases y las estructuras anidadas) se pueden declarar con cualquiera de los seis tipos de acceso.Class members (including nested classes and structs) can be declared with any of the six types of access. Los miembros de estructura no se pueden declarar como protected, protected internal o private protected porque las estructuras no admiten la herencia.Struct members can't be declared as protected, protected internal, or private protected because structs don't support inheritance.

Normalmente, la accesibilidad de un miembro no es mayor que la del tipo que lo contiene.Normally, the accessibility of a member isn't greater than the accessibility of the type that contains it. Pero un miembro public de una clase interna 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.However, a public member of an internal class might be accessible from outside the assembly if the member implements interface methods or overrides virtual methods that are defined in a public base class.

El tipo de cualquier miembro que sea un campo, propiedad o evento debe ser al menos tan accesible como el propio miembro.The type of any member field, property, or event must be at least as accessible as the member itself. 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.Similarly, the return type and the parameter types of any method, indexer, or delegate must be at least as accessible as the member itself. Por ejemplo, no puede tener un método public M que devuelva una clase C a menos que C también sea public.For example, you can't have a public method M that returns a class C unless C is also public. Del mismo modo, no puede tener una propiedad protected de tipo A si A se declara como private.Likewise, you can't have a protected property of type A if A is declared as private.

Los operadores definidos por el usuario siempre se deben declarar como public y static.User-defined operators must always be declared as public and static. Para obtener más información, vea Sobrecarga de operadores.For more information, see Operator overloading.

Los finalizadores no pueden tener modificadores de accesibilidad.Finalizers can't have accessibility modifiers.

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.To set the access level for a class or struct member, add the appropriate keyword to the member declaration, as shown in the following example.

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

Otros tiposOther types

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.Interfaces declared directly within a namespace can be public or internal and, just like classes and structs, interfaces default to internal access. 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.Interface members are public by default because the purpose of an interface is to enable other types to access a class or struct. Las declaraciones de miembros de interfaz pueden incluir cualquier modificador de acceso.Interface member declarations may include any access modifier. Esto es muy útil para que los métodos estáticos proporcionen implementaciones comunes necesarias para todos los implementadores de una clase.This is most useful for static methods to provide common implementations needed by all implementors of a class.

Los miembros de enumeración siempre son public y no se les puede aplicar ningún modificador de acceso.Enumeration members are always public, and no access modifiers can be applied.

Los delegados se comportan como las clases y las estructuras.Delegates behave like classes and structs. De forma predeterminada, tienen acceso internal cuando se declaran directamente en un espacio de nombres y acceso private cuando están anidados.By default, they have internal access when declared directly within a namespace, and private access when nested.

Especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also