2010-09-17 15 views
5

Creo una clase de muestra en vs2010.C# Modificador de acceso predeterminado del método Main()

A través de la Vista de clase, veo que el modificador de acceso predeterminado para Main es interno.

También veo que algunas personas dicen que el modificador de acceso predeterminado para Main es "implícitamente privado".

Visual Studio 2010 define automáticamente el método Main() de un programa como implícitamente privado. Si lo hace, se asegura de que otras aplicaciones no puedan invocar directamente el punto de entrada de otro .

Sé que hay diferencias entre interno y privado. Entonces, ¿cuál es la correcta?

Respuesta

13

Si el código aparece como esto:

static void Main() 

entonces eso es un método privado. (La parte static es ortogonal a la accesibilidad, pero es necesario que sea un punto de entrada). En general, la accesibilidad predeterminada de cualquier miembro es la accesibilidad más privada que usted podría declarar. Entonces, para los métodos en una clase o una estructura, eso es privado. Para tipos de nivel superior (no anidados) es interno. Para cualquier miembro declarado en una clase/estructura, es privado . Para los miembros de interfaz y enum, es público.

Es difícil comprender exactamente lo que está viendo a través de la Vista de clases sin ver su código o una captura de pantalla de Class View, pero la accesibilidad predeterminada para un método es definitivamente privada. Eso es cierto independientemente de si es el método Main o no.


aplicación explícita de interfaces es un poco extraño aquí, ya que es ni privado ni público; simplemente no es accesible a través del tipo, solo a través de la interfaz.

+1

Por supuesto, un miembro declarado dentro de un tipo 'interface' o' enum' es siempre público, y no está permitido especificar ningún modificador de acceso con miembros de los tipos 'enum' y' interface'. Los miembros declarados en una 'clase' o 'estructura' son ciertamente privados por defecto, como usted dice. Otro problema: el método 'Principal' anterior no es estático, por lo que no puede ser un punto de entrada. –

+0

@JeppeStigNielsen: editará. –

2

Ambos, el modificador de clase predeterminado es interno. El método principal es un método y es privado. En general, las clases sin un modificador son internas, los miembros de la clase (como métodos y campos) sin una declaración son privados.

+1

El valor predeterminado para una clase * no anidada * es interno. Para un tipo anidado, es privado. –

1

Los miembros privados son accesibles solo dentro del cuerpo de la clase en la que están declarados.

tipos internos o miembros son accesibles solamente dentro de los archivos en el mismo conjunto

interna 'es como' público, pero sólo para todos los elementos del mismo conjunto. La clase 1 del conjunto1 no puede 'ver' ni acceder a ningún elemento interno del conjunto2.

3

No puede ver el modificador de acceso predeterminado para un miembro en el explorador de clases, puede ver el modificador de acceso actual.

Los modificadores de acceso predeterminados para las clases en el nivel de espacio de nombres es internal, mientras que el modificador de acceso predeterminado para los miembros de la clase (incluidas las clases anidadas) es private. No hay ningún caso especial para la función Main(). Si no hay ningún modificador de acceso antes (como un ejemplo de Jon Skeet), entonces es private. Si hay uno, entonces eso es lo que es.

2

Aunque etiquetó su pregunta , permítame decir que los modificadores de acceso para el valor predeterminado Program.Main generado por VS2010 realmente dependen de la plantilla del proyecto, en estos difieren para cada idioma. rápidamente Probé el siguiente:

  • En un proyecto de consola VB.NET, la Program módulo (clase estática) es Friend (es decir internal en C#) y el método estático Main es Public.

  • En un proyecto de C# consola, es Programinternal y Main es private.

Es decir, un proyecto de C# simplemente usará los modificadores de acceso (por defecto internal para las clases, métodos para private).

0

Por defecto, el especificador de acceso para Main() en C# es privado.

Esto es lo que obtuve cuando vi el código MSIL (IL) en ILDASM.

Puede ver que Main() es privado. IL code of Simple Program in C#

Cuestiones relacionadas