c#

c# - ¿Por qué debería main ser estático?



(5)

Traté de crear public void Main() en C #; dice que no hay ningún vacío estático encontrado .
¿Qué significa exactamente que Main sea ​​estático? Sé que el código funciona bien para public static void Main() .

Pero, ¿por qué Main tiene que ser static ?


Conceptualmente, sería posible que un marco especifique que en lugar de usar un método estático particular para ejecutar un programa, en su lugar construirá una instancia predeterminada de alguna clase en particular y ejecutará algún método particular al respecto. Si uno tiene un marco que implementa métodos estáticos al hacer que sean miembros de instancia de una instancia singleton iniciada por compilador, tal enfoque podría ser completamente razonable, ya que el marco tendría que generar una nueva instancia de objeto antes de llamar a la función principal en cualquier caso .

Si llamar a un método estático es "más fácil" que construir una nueva instancia de objeto y llamar a un método al respecto, sin embargo, no hay mucho beneficio para requerir que un marco use el curso de acción más costoso. Cualquier código que quiera usar este último enfoque sería perfectamente gratuito:

public static void Main( [[params]] ) { var mainObject = new MainObject(); mainObject.Main( [[params]] ); }

Podría haber algunos beneficios potenciales al tener el sistema que incluye su propio método estático que se parecía a algo así como:

public static void SysMain( [[params]] ) { using (Application app = new UserApp( [[params]] )) // UserApp derives from Application { app.Start(); // Virtual method app.AllowNext(); // Base method--see text app.Run(); // Abstract method } }

donde app.AllowNext() era un método para coordinar con otras instancias de aplicaciones lanzadas esencialmente al mismo tiempo, para garantizar que los intentos repetidos de iniciar una aplicación en segundo plano harían que sus llamadas de Start se procesaran estrictamente de forma secuencial. Sin este esquema de coordinación, sin embargo, no hay mucho beneficio para requerir que el marco construya un objeto de aplicación antes de ejecutarlo. El costo no sería enorme, pero sin ningún beneficio identificable potencial no tiene mucho sentido aceptar siquiera un costo trivial.


Durante el inicio de la aplicación, cuando no se han creado objetos de la clase, se debe llamar al método Principal para comenzar la ejecución del programa. Principal a veces se llama punto de entrada de la aplicación. Declarar Main como static permite que el entorno de ejecución invoque Main sin crear una instancia de la clase. Método Principal generalmente se declara con el encabezado:

static void Main(){..}

pero también se puede declarar con el encabezado:

static void Main(string[] args){..}

Puede declarar Main con return type int (en lugar de void); esto puede ser útil si una aplicación es ejecutada por otra aplicación y debe devolver una indicación de éxito o falla a esa otra aplicación.


Hay dos tipos de métodos dentro de una clase:

  1. Método no estático
  2. Método estático

// Example of static and non-static methods and how to call namespace TestStaticVoidMain { class Program { Static Void Main(string[] args) { // Instantiate or create object of the non-static method: Exam ob = new Exam(); // Call the instance: ob.Test1(); // Directly the call the static method by its class: Exam.Test2(); Console.ReadKey(); } } class Exam { public void Test1() { Console.WriteLine("This is a non-static method"); } public static void Test2() { Console.WriteLine("This is a static method"); } } }

1. Método estático:

Para llamar a un método estático (función), no necesitamos crear instancias o crear un objeto de ese método. No podemos usar palabras clave new porque, cuando la clase se carga y se compila, la palabra clave static de forma predeterminada, crea una instancia o crea un objeto de ese método de clase, por eso llamamos directamente a un método estático.

En referencia al static void Main(string[] args) , ya hablamos de static . El resto es void Main(string[] args) . void es un tipo de datos que no devuelve nada. Main() es el punto de entrada estándar para la ejecución de un programa C #. El argumento opcional string[] args recibe los parámetros opcionales de "línea de comando" con los que se ejecutó el programa.

2. Sethod no estático:

Para llamar a un método no estático, tenemos que instanciar o crear un objeto del método de clase para llamar al método (función) de la clase usando la palabra clave new .

Si una clase llamada Test tiene un método no estático llamado show() , entonces cómo llamaría una instancia:

// to call non-static method Test ob=new Test(); ob.show();


Necesitas un punto de entrada en tu programa. Estático significa que puede llamar a la función sin tener que crear una instancia de un objeto / instancia de una clase. Es un poco "pollo y huevo" ... no se puede crear una instancia de un objeto antes de estar dentro del programa.

Se puede invocar un método estático sin instanciar un objeto. Por lo tanto, main() debe ser estático para permitir que sea la entrada a su programa.

Como dice David, puede agregar la palabra clave static a la definición de la función para cambiarla. Vale la pena examinar los métodos estáticos (de clase) frente a los métodos de instancia, y conocer la diferencia puede ser útil a veces.


Solo el método principal estático puede hacer el trabajo porque existe una convención que define este comportamiento. No hay otra razón

Eche un vistazo a la especificación del lenguaje C # :

El inicio de la aplicación se produce cuando el entorno de ejecución llama a un método designado, que se conoce como punto de entrada de la aplicación. Este método de punto de entrada siempre se denomina Main y tendrá una de las siguientes firmas:

static void Main() {…} static void Main(string[] args) {…} static int Main() {…} static int Main(string[] args) {…}

Como se muestra, el punto de entrada opcionalmente puede devolver un valor int . Este valor de retorno se utiliza en la finalización de la aplicación (§10.2).

Nota: Lo anterior se cita de la edición , ahora etiquetada como "histórica". La edición actual está redactada de manera diferente.

Además de eso, el nombre Main se puede cambiar a algo más. En este caso, se debe agregar una opción de compilación para que el compilador de C # marque un método diferente como punto de entrada del programa.