C sharp - Método Main

 
Vista:
Imágen de perfil de Luis
Val: 50
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Método Main

Publicado por Luis (15 intervenciones) el 28/03/2021 19:47:39
Como soy principiante, tengo muchas dudas, entre ellas, esta que os planteo.
Entiendo que el método Main es ineludible y tiene que estar ahí porque es por donde el compilador empieza a trabajar, o algo parecido.

Ahora bien, lo que no entiendo es por qué tiene que ser un método 'static'
¿Hay alguna ventaja en que Main sea 'static', aparte de que sea obligado?

Lo digo por lo de la coña de tener que instanciar una clase (creando un objeto) para llamar a otro método, cosa mucho más fácil si lo haces desde cualquier otro método no 'static', y de ahí me surgen todas estas dudas.

Gracias por vuestra atención.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 88
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Método Main

Publicado por Kabuto (16 intervenciones) el 28/03/2021 22:23:17
En C# y en Java, lenguajes completamente (o casi) orientados a objetos, un programa es una clase.
En C++ por ejemplo, no es así, pero porque no está orientado a objetos nativamente.

Por otro lado, un método static implica que se puede llamar y ejecutar a ese método sin tener que instanciar un objeto de la clase a la que pertenece.

Entonces, para que el programa/clase principal funcione, el método Main ha de ser static.

Si no lo fuera, habría que instanciar un objeto de la clase/programa principal para poder llamarlo, pero.... ¿dónde instanciamos dicho objeto si no tenemos ningún "contexto" con posibilidad de ejecutar código alguno?
Esto es un poco como lo del huevo y la gallina.., si no hay huevo, no hay gallina.... y si no hay gallina, no hay huevo..

Es decir, para empezar a ejecutar código, necesitamos un contexto que pueda iniciarse por sí solo. Ese es el papel del Main, ofrecer un contexto que pueda arrancar sin tener que crear previamente ningún objeto (porque no es posible crearlo si no hay contexto).

Por eso el Main ha de ser estático.

Al principio esto de los contextos estáticos y "no estáticos" resulta lioso y cuesta entender su propósito de forma que parece que sea casi una imbecilidad que solo complica las cosas.
Pero con el tiempo lo irás teniendo más claro y verás que en realidad no supone ninguna complicación.

Incluso empezarás a ver las ventajas de disponer de los dos contextos.

Por poner un ejemplo, así pensado de forma rápida y que quizás no sea el mejor.

Imagina una clase Persona.
Tendrá unos atributos como nombre, apellidos, DNI, etc..
Y tendrá unos métodos pensados para trabajar con esos atributos.

Esos métodos y atributos serán propios y únicos para cada objeto que instanciemos de esta clase Persona.
Así que esos métodos y atributos, estarán en un contexto "no estático".

Ahora bien, es posible que queramos que la clase Persona tenga ciertas funcionalidades extra y que no estén asociadas a un objeto en concreto.
Por ejemplo, a lo mejor queremos que la clase Persona tenga un método que automáticamente nos proporcione un array con 100 objetos Persona ya creados previamente. Porque nos vendría de maravilla para poder hacer pruebas en un programa que gestione Personas, ¿vale?... llamo a este método y pum, ya tengo un array con 100 objetos para probar mi programa que ordena Personas por edades, o por apellidos, o lo que sea...

Este método lo vamos a querer tener en un contexto "estático", porque no está asociado a una "entidad persona" en concreto, si no que es de propósito general. Así que declarándolo estático, no tengo que instanciar ningún objeto, llamo a la clase.metodo y recojo el resultado.
Algo parecido a esto:
1
Persona[] listaPersonas = Persona.GetArrayPersonasPrefabricado();

O supón que tengo una clase Cuadrado, con unos métodos "no estáticos" para setear la base y la altura.
Serán "no estáticos" porque estarán asociados a unos objetos en concreto:
1
2
3
4
5
6
Cuadrado cuad1 = new Cuadrado();
cuad1.SetBase(10);
cuad1.setAltura(15);
Cuadrado cuad2 = new Cuadrado();
cuad2.SetBase(20);
cuad2.setAltura(30);

Pero además quiero que esta clase se capaz de recibir dos objetos Cuadrado y me devuelva un tercer Cuadrado creado con la suma de las bases y alturas de esos dos Cuadrados.
Este método no está asociado a un objeto en concreto, es una función general de la clase Cuadrado, así que será un método estático

1
2
3
4
5
6
7
8
Cuadrado cuad1 = new Cuadrado();
cuad1.SetBase(10);
cuad1.setAltura(15);
Cuadrado cuad2 = new Cuadrado();
cuad2.SetBase(20);
cuad2.setAltura(30);
 
Cuadrado cuad3 = Cuadrado.SumarCuadrados(cuad1, cuad2);


Y bueno, no me extiendo más, que total has hecho una pregunta muy concreta y yo estoy aquí divagando un poco.
Espero que tu pregunta inicial haya quedado un poco más clara, de lo contrario, insiste y buscamos otra forma de explicarlo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Luis
Val: 50
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Método Main

Publicado por Luis (15 intervenciones) el 29/03/2021 07:25:20
kabuto san, domo arigatou !

Creo que lo entendí, al menos en esencia.

Al principio esto de los contextos estáticos y "no estáticos" resulta lioso y cuesta entender su propósito de forma que parece que sea casi una imbecilidad que solo complica las cosas.
Pero con el tiempo lo irás teniendo más claro y verás que en realidad no supone ninguna complicación.


Creo que estoy en esa etapa que comentas

Muchas gracias por tu ayuda, te explicas muy bien y se te lee mejor, cosa nada habitual entre programadores
Saludos cordiales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar