c# - niveles - método sin modificador de acceso
override c# (8)
De The C # Programming Language, tercera edición de Anders Hejlsberg et al , sección 10.3.5 ("Miembros de la clase - Modificadores de acceso") en la página 434:
Una declaración de miembro de clase puede tener cualquiera de los cinco posibles tipos de accesibilidad declarada (§3.5.1):
public
,protected internal
,protected
,internal
oprivate
. Excepto por la combinaciónprotected internal
, es un error en tiempo de compilación especificar más de un modificador de acceso. Cuando una declaración de miembro de clase no incluye ningún modificador de acceso, se suponeprivate
. [Énfasis mío]
Y luego en la sección 11.2 ("Miembros de Struct") en la página 539:
Excepto por las diferencias señaladas en §11.3, las descripciones de los miembros de la clase proporcionadas en §10.3 a §10.14 también se aplican a los miembros de la estructura.
La Sección 11.3 no menciona nada sobre los modificadores de acceso, por lo que mi lectura de esto implica que los miembros de una struct
sin un modificador de acceso también son private
por defecto. Esto se corresponde con lo que dice MSDN y con mi propia experiencia.
Ok, esto me está molestando ... Sé que lo he leído en alguna parte y Google no está ayudando.
¿Cuál es el nivel de accesibilidad de un método que no especifica un modificador de acceso?
void Foo()
{
//code
}
Quiero decir internal
pero no estoy 100% seguro.
La accesibilidad predeterminada para un tipo es internal
, pero la accesibilidad predeterminada de los miembros de ese tipo depende del tipo.
En general, los miembros de una clase son private
por defecto, mientras que los miembros de una estructura son public
por defecto. Esto varía según el idioma; los modificadores de acceso de estructura predeterminados para C ++ son públicos, mientras que para C # son privados.
Los métodos de clase son privados y están sellados por defecto en .NET. Esto significa que el método solo es visible dentro de la clase y no puede ser anulado por la clase heredada.
Oh, espera, hay una cosa más ...
interface
declaraciones de métodos de interface
son, por supuesto, public
por definición. Por lo tanto, la siguiente implementación es public
, sin un modificador de acceso explícito.
public class MyClass : IEqualityComparer<MyClass>
bool IEqualityComparer<MyClass>.Equals(MyClass x , MyClass y) {}
}
Para una clase: Interna es el valor predeterminado si no se especifica ningún modificador de acceso.
Para un método: Privado es el valor predeterminado si no se especifica ningún modificador de acceso.
Sí, internal
es el predeterminado para las clases, pero private
es el predeterminado para los miembros.
Suponiendo que este es un método C #, ya que tiene la etiqueta ".net".
Las personas necesitan diferenciar entre accesibilidad de "miembro" y accesibilidad de "clase".
- La accesibilidad predeterminada de los miembros de la clase (incluidos los métodos) en C # es privada. Ver https://msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.140).aspx
- La accesibilidad predeterminada de una clase en sí es interna.