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 que controla si se pueden usar desde otro código del ensamblado u otros ensamblados.All types and type members have an accessibility level, which controls whether they can be used from other code in your assembly or other assemblies. Puede usar los siguientes modificadores de acceso para especificar la accesibilidad de un tipo o miembro cuando lo declare:You can use the following access modifiers to specify the accessibility of a type or member when you declare it:

publicpublic
Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste.The type or member can be accessed by any other code in the same assembly or another assembly that references it.

privateprivate
Solamente el código de la misma clase o estructura puede acceder al tipo o miembro.The type or member can be accessed only by code in the same class or struct.

protectedprotected
Solamente el código de la misma clase, o de una clase derivada de esa clase, puede acceder al tipo o miembro.The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
internalinternal
Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto.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 cualquier clase 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 is declared, or from within a derived class in another assembly.

private protected El código de la misma clase, o de un tipo derivado de esa clase, puede acceder al tipo o miembro solo dentro de su ensamblado que declara.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 tipos o miembros pueden usar todos los modificadores de acceso en todos los contextos; en algunos casos la accesibilidad de un miembro de tipo está restringida por la accesibilidad de su tipo contenedor.Not all access modifiers can be used by all types or members in all contexts, and in some cases the accessibility of a type member is constrained by the accessibility of its containing type. En las secciones siguientes se proporcionan más detalles sobre la accesibilidad.The following sections provide more details about accessibility.

Accesibilidad de clase y estructuraClass 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 públicas o internas.Classes and structs that are declared directly within a namespace (in other words, that are not 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 as 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. El nivel de acceso de los miembros de clase y los miembros de estructura, incluidas las clases y estructuras anidadas, es private de forma predeterminada.The access level for class members and struct members, including nested classes and structs, is private by default. Los tipos anidados privados no son accesibles desde fuera del tipo contenedor.Private nested types are not accessible from outside the containing type.

Las clases derivadas no pueden tener mayor accesibilidad que sus tipos base.Derived classes cannot have greater accessibility than their base types. En otras palabras, no puede tener una clase pública B que derive de una clase interna A.In other words, you cannot have a public class B that derives from an internal class A. Si se permitiera, convertiría A en público, porque todos los miembros protegidos o internos de A son accesibles desde la clase derivada.If this were 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 protegidos porque las estructuras no admiten la herencia.Struct members cannot be declared as protected because structs do not support inheritance.

Normalmente, la accesibilidad de un miembro no es mayor que la del tipo que lo contiene.Normally, the accessibility of a member is not greater than the accessibility of the type that contains it. Pero un miembro público 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 that is a 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 miembro que sea un 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 member that is a method, indexer, or delegate must be at least as accessible as the member itself. Por ejemplo, no puede tener un método público M que devuelva una clase C a menos que C también sea público.For example, you cannot have a public method M that returns a class C unless C is also public. Del mismo modo, no puede tener una propiedad protegida de tipo A si A se declara como private.Likewise, you cannot have a protected property of type A if A is declared as private.

Los operadores definidos por el usuario siempre deben declararse como public.User-defined operators must always be declared as public. Para más información, vea Operador (Referencia de C#).For more information, see operator (C# Reference).

Los finalizadores no pueden tener modificadores de accesibilidad.Finalizers cannot have accessibility modifiers.

Para establecer el nivel de acceso de un miembro de clase o estructura, 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; }
    }
}

Nota

El nivel de accesibilidad protected internal significa protected O internal, no protected E internal.The protected internal accessibility level means protected OR internal, not protected AND internal. Es decir, se puede acceder a un miembro protegido interno desde cualquier clase del mismo ensamblado, incluidas las clases derivadas.In other words, a protected internal member can be accessed from any class in the same assembly, including derived classes. Para limitar la accesibilidad a las clases derivadas del mismo ensamblado, declare la propia clase como internal y sus miembros como protected.To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected. Además, a partir de C# 7.2, puede usar el modificador de acceso private protected para lograr el mismo resultado sin necesidad de convertir en internal la clase contenedora.Also, starting with C# 7.2, you can use the private protected access modifier to achieve the same result without need to make the containing class internal.

Otros tiposOther Types

Las interfaces declaradas directamente en un espacio de nombres se pueden declarar como public o internal y, al igual que las clases y las estructuras, su valor predeterminado es el acceso interno.Interfaces declared directly within a namespace can be declared as public or internal and, just like classes and structs, interfaces default to internal access. Los miembros de interfaz son siempre públicos porque el propósito de una interfaz es permitir que otros tipos accedan a una clase o estructura.Interface members are always public because the purpose of an interface is to enable other types to access a class or struct. A los miembros de interfaz no se les puede aplicar ningún modificador de acceso.No access modifiers can be applied to interface members.

Los miembros de enumeración siempre son públicos 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 interno cuando se declaran directamente en un espacio de nombres y acceso privado 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#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea tambiénSee Also

Guía de programación de C#C# Programming Guide
Clases y structsClasses and Structs
InterfacesInterfaces
privateprivate
publicpublic
internalinternal
protectedprotected
protected internalprotected internal
private protectedprivate protected
classclass
structstruct
interfaceinterface