2010-05-26 17 views
36

Ok esto me está molestando ... Sé que lo he leído en alguna parte y Google no me está ayudando.método sin modificador de acceso

¿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.

+0

En qué idioma? –

+0

@steve lo siento, etiqueta C# agregada. –

Respuesta

39

La accesibilidad por defecto para un tipo es internal, pero la accesibilidad por defecto de miembros de ese tipo depende del tipo.

En términos generales, los miembros de una claseson private por defecto, en tanto que los miembros de una estructurason 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.

+7

¿Están seguros de este voto negativo? Si coloco un método en una clase C#, sin modificador de acceso, el compilador C# 3.0 lo construye como un método privado. –

+1

Steve tiene razón. La accesibilidad predeterminada para los métodos de clase es 'privada'. Pruébalo por ti mismo. –

+1

Esta respuesta es correcta. Acabo de verificarlo en VS2010 porque originalmente pensé que también estaba mal. – Donnie

9

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.

15

Sí, internal es el valor predeterminado para las clases, pero private es el valor predeterminado para los miembros.

17

Suponiendo que se trata de un método C#, ya que tiene la etiqueta ".net".

Las personas necesitan diferenciar entre la accesibilidad de "miembro" y la accesibilidad de "clase".

5

De El C# Programming Language, Tercera Edición por Anders Hejlsberg et al, sección 10.3.5 ("Miembros de la Clase - modificadores de acceso") en la página 434:

Una clase -member-declaration puede tener cualquiera de los cinco posibles tipos de accesibilidad declarada (§3.5.1): public, protected internal, protected, internal, o private. A excepción de la combinación protected internal, es un error en tiempo de compilación especificar más de un modificador de acceso. Cuando class-member-declaration no incluye ningún modificador de acceso, se supone private. [El énfasis es mío]

Y a continuación, en la sección 11.2 ("miembros de la estructura") en la página 539:

A excepción de las diferencias observadas en §11.3, las descripciones de los miembros de la clase proporcionan en el § 10.3 a través de §10.14 también se aplica a los miembros de la estructura.

Sección 11.3 no menciona nada acerca de modificadores de acceso, por lo que mi lectura de esto implica que los miembros de una struct sin un modificador de acceso son también private por defecto. Esto corresponde con what MSDN says y con mi propia experiencia.

3

Oh espera, hay una cosa más .... declaraciones

interface método 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) {} 
} 
+0

métodos de interfaz btw no pueden ser privados – Dragon

+0

oh, sí ... [ Se recomienda heredar 'EqualityComparer', no implementar la interfaz] (https://msdn.microsoft.com/en-us/library/ms132123%28v=vs.110%29.aspx). ver las observaciones" – radarbob

0

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.

0

esperanza que esto aclare todo, como por captura de pantalla directamente desde MSDN

enter image description here

Cuestiones relacionadas