¿Cuál es el modificador de acceso predeterminado para clases, métodos, miembros, constructores, delegados e interfaces?
fuente
¿Cuál es el modificador de acceso predeterminado para clases, métodos, miembros, constructores, delegados e interfaces?
El acceso predeterminado para todo en C # es "el acceso más restringido que podría declarar para ese miembro" .
Así por ejemplo:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
es equivalente a
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
El único tipo de excepción a esto es hacer que una parte de una propiedad (generalmente el establecedor) sea más restringida que la accesibilidad declarada de la propiedad en sí:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Esto es lo que dice la especificación C # 3.0 (sección 3.5.1):
Dependiendo del contexto en el que se lleva a cabo una declaración de miembro, solo se permiten ciertos tipos de accesibilidad declarada. Además, cuando una declaración de miembro no incluye ningún modificador de acceso, el contexto en el que tiene lugar la declaración determina la accesibilidad declarada predeterminada.
- Los espacios de nombres implícitamente tienen accesibilidad pública declarada. No se permiten modificadores de acceso en las declaraciones de espacio de nombres.
- Los tipos declarados en unidades de compilación o espacios de nombres pueden tener accesibilidad declarada pública o interna y, por defecto, accesibilidad declarada interna.
- Los miembros de la clase pueden tener cualquiera de los cinco tipos de accesibilidad declarada y, por defecto, accesibilidad privada declarada. (Tenga en cuenta que un tipo declarado como miembro de una clase puede tener cualquiera de los cinco tipos de accesibilidad declarada, mientras que un tipo declarado como miembro de un espacio de nombres solo puede tener accesibilidad declarada pública o interna).
- Los miembros de estructura pueden tener accesibilidad declarada pública, interna o privada y por defecto accesibilidad declarada privada porque las estructuras están implícitamente selladas. Los miembros de estructura introducidos en una estructura (es decir, no heredada por esa estructura) no pueden tener accesibilidad declarada protegida o protegida interna. (Tenga en cuenta que un tipo declarado como miembro de una estructura puede tener accesibilidad declarada pública, interna o privada, mientras que un tipo declarado como miembro de un espacio de nombres solo puede tener accesibilidad declarada pública o interna).
- Los miembros de la interfaz tienen implícitamente accesibilidad pública declarada. No se permiten modificadores de acceso en las declaraciones de miembros de la interfaz.
- Los miembros de la enumeración tienen implícitamente accesibilidad pública declarada. No se permiten modificadores de acceso en las declaraciones de miembros de enumeración.
(Tenga en cuenta que los tipos anidados se incluirían en las partes "miembros de la clase" o "miembros de la estructura" y, por lo tanto, su valor predeterminado será la visibilidad privada).
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
no puede accederM
con éla.M()
, sin embargo, puede acceder con él(a as IFoo).M()
. (Consulte las especificaciones para obtener más información sobre los detalles)Respuesta corta: acceso mínimo posible (véase la respuesta de Jon Skeet).
Respuesta larga:
Tipos no anidados , enumeración y accesibilidad delegada ( solo puede tener accesibilidad interna o pública )
Tipo anidado y accesibilidad de miembros
La accesibilidad de un tipo anidado depende de su dominio de accesibilidad, que está determinado por la accesibilidad declarada del miembro y el dominio de accesibilidad del tipo que contiene inmediatamente. Sin embargo, el dominio de accesibilidad de un tipo anidado no puede exceder el del tipo que lo contiene.
Nota: CIL también tiene la provisión de protección e interna (a diferencia de la protección existente "o" interna), pero que yo sepa, esto no está disponible actualmente para su uso en C #.
Ver:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Hombre, me encantan los URI de Microsoft ...)
fuente
Eche un vistazo a los modificadores de acceso (Guía de programación de C #)
fuente
La clase es interna por defecto.
La interfaz es interna por defecto.
Los miembros de la interfaz son públicos por defecto. (Las interfaces no nos permitirán especificar ningún tipo de accesibilidad a sus miembros).
Nota: Si intenta especificar un especificador de acceso a los miembros de la interfaz, entonces muestra un error de compilación.
Struct es interno por defecto.
fuente
Me gustaría agregar un enlace de documentación. Mira más detalles aquí .
fuente
La respuesta más simple es la siguiente .....
Todos los miembros en C # siempre toman el modificador MENOS accesible posible por defecto.
Es por eso que todas las clases de nivel superior en un ensamblaje son "internas" de forma predeterminada, lo que significa que son públicas para el ensamblaje en el que se encuentran, pero privadas o excluidas del acceso a ensamblajes externos. La única otra opción para una clase de nivel superior es pública, que es más accesible. Para los tipos anidados, todo es privado, excepto algunas raras excepciones, como miembros de enumeraciones e interfaces que solo pueden ser públicos. Algunos ejemplos. En el caso de las clases e interfaces de nivel superior, los valores predeterminados son:
clase Animal igual que clase interna Animal
interfaz Animal igual que la interfaz pública Animal
En el caso de las clases e interfaces anidadas (tipos internos), los valores predeterminados son:
clase Animal igual que clase privada Animal
interfaz Animal igual que la interfaz privada Animal
Si solo asume que el valor predeterminado es siempre el más privado, entonces no necesita usar un acceso hasta que necesite cambiar el valor predeterminado. Fácil.
fuente
Interno es el modificador predeterminado
fuente
Nivel de espacio de nombres:
internal
Nivel de tipo:
private
fuente