none
Sigo sin entender esto de "static" RRS feed

  • Pregunta

  • Creo entender lo que es static, pero al mismo tiempo creo que no lo entiendo. Voy a mostrar el codigo más simple de la tierra a continuación para que vean el error que me da:

    using System;
    
    namespace henrencia2
    {
        class Taller
    
    
        {
            
            Auto1 objeto = new Auto1();
    
            public static void Main(string[] args)
            {
                
                objeto.Conducir(); //Se requiere una //referencia de objeto para el campo, método o propiedad //'Taller.objeto' no estáticos.
    
    
                Console.ReadLine();
             
            }
            public void Caso1()
            {
                objeto.Conducir();
            }
        }
    }
    

    La otra clase es :

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace henrencia2
    {
        class Auto1
        {
          
            public void Conducir ()
            {
               
            }
            
        }
    }

    esto lo puedo solucionar quitandole la palabra "static" a main, pero si lo hago luego me sale otro error "el programa no contiene ninguna clase Main estatica". Ahora no entiendo por qué es necesario que main sea estático. Entiendo que no puedo usar instancias dentro de un metodo estatico, pero de qué otra forma voy a llamar a objeto.Conducir?

    viernes, 18 de septiembre de 2020 19:52

Respuestas

  • Hola PequeñoSaltamontes,

    Primero que nada, algo muy importante que te tienes que entender es que el método Main en C# siempre va a ocupar llevar static, es parte de su sintaxis. De hecho, si no lo tienes exactamente de esta manera (incluidas mayúsculas y minúsculas), probablemente vas a ver un error:

            static void Main(string[] args)
    
            {
    
            }

    El motivo, es que el método Main es el punto de entrada del programa, donde se crean objetos e invocan otros métodos. En un programa de C#, sólo puede haber un punto de entrada. Si recuerdas lo que conversamos en tu otra pregunta, static a grandes rangos significa que solo va a existir una instancia en todo momento. Cuando se inicia la aplicación, el método Main es el primero que se invoca, si hubieran varios, el programa no sabría ni por dónde empezar, imagina que problema tan grande, solo puede haber un punto de entrada en un programa de C#. Si hay más de una clase que tiene un método Main, podrías compilar el programa con la opción del compilador -main para especificar qué método Main deseas utilizar como punto de entrada, pero si en este momento apenas estás empezando ni siquiera te preocupes de eso por ahora. Siguiendo con tu pregunta, te presento un par de ejemplos. Esta es una clase normal, es decir no static:

        class Auto1
        {
            public int velocidad = 0;
            public void Conducir()
            {
                Console.WriteLine("La instancia de la clase Auto1 está siendo conducidaa " + velocidad + ".");
            }
        }

    Esta es una clase static:

        public static class AutoStatic
        {
            public static int velocidad = 0;
    
            public static void Conducir()
            {
                Console.WriteLine("La clase estatica AutoStatic está siendo conducida a "+ velocidad + ".");
            }
        }

    Esto es lo que hay dentro de la clase Main de mi programa:

            static void Main(string[] args)
            {
                //Aquí creamos varias instancias de la clase normal
                Auto1 instancia1 = new Auto1();
                Auto1 instancia2 = new Auto1();
                Auto1 instancia3 = new Auto1();
                //cada una es una versión aparate de la clase, cada una tiene su propia variable velocidad
                instancia1.velocidad = 10;
                instancia2.velocidad = 20;
                instancia3.velocidad = 30;
                //Aqui llamamos la clase estatica AutoStatic, primero nota que no tengo que usar un método constructor, no estoy instanciando nada, estoy llamando a la clase directamente
                //le estamos dando un valor a su campo de velocidad
                AutoStatic.velocidad = 10;
                //si le cambio el valor a su velocidad se reescribe sobre la velocidad anterior porque solo hay una
                AutoStatic.velocidad = 5000;
    
                //Aquí llamamos el método conducir de nuestras 3 instancias de la clase normal y el método conducir de la clase estática
                instancia1.Conducir();
                instancia2.Conducir();
                instancia3.Conducir();
                AutoStatic.Conducir();
    
            }

    Esto es lo que pasa cuando ejecuto mi programa:

    Espero que te sea de ayuda.  Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice “Marcar como Respuesta”). Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    viernes, 18 de septiembre de 2020 20:07
    Moderador
  • Simplificando al máximo, el problema es que desde Main (que es static) llamas a la variable "objeto", que no es static. Desde un static no puedes llamar a algo que no sea static.

    Solución simple:

    static Auto1 objeto = new Auto1();

    Nótese que no tiene nada que ver el contenido de la clase Auto1. Ahí puede haber cosas que sean o no sean estáticas. No afecta para nada al error que te da en Main.
    viernes, 18 de septiembre de 2020 21:15
    Moderador

Todas las respuestas

  • Hola PequeñoSaltamontes,

    Primero que nada, algo muy importante que te tienes que entender es que el método Main en C# siempre va a ocupar llevar static, es parte de su sintaxis. De hecho, si no lo tienes exactamente de esta manera (incluidas mayúsculas y minúsculas), probablemente vas a ver un error:

            static void Main(string[] args)
    
            {
    
            }

    El motivo, es que el método Main es el punto de entrada del programa, donde se crean objetos e invocan otros métodos. En un programa de C#, sólo puede haber un punto de entrada. Si recuerdas lo que conversamos en tu otra pregunta, static a grandes rangos significa que solo va a existir una instancia en todo momento. Cuando se inicia la aplicación, el método Main es el primero que se invoca, si hubieran varios, el programa no sabría ni por dónde empezar, imagina que problema tan grande, solo puede haber un punto de entrada en un programa de C#. Si hay más de una clase que tiene un método Main, podrías compilar el programa con la opción del compilador -main para especificar qué método Main deseas utilizar como punto de entrada, pero si en este momento apenas estás empezando ni siquiera te preocupes de eso por ahora. Siguiendo con tu pregunta, te presento un par de ejemplos. Esta es una clase normal, es decir no static:

        class Auto1
        {
            public int velocidad = 0;
            public void Conducir()
            {
                Console.WriteLine("La instancia de la clase Auto1 está siendo conducidaa " + velocidad + ".");
            }
        }

    Esta es una clase static:

        public static class AutoStatic
        {
            public static int velocidad = 0;
    
            public static void Conducir()
            {
                Console.WriteLine("La clase estatica AutoStatic está siendo conducida a "+ velocidad + ".");
            }
        }

    Esto es lo que hay dentro de la clase Main de mi programa:

            static void Main(string[] args)
            {
                //Aquí creamos varias instancias de la clase normal
                Auto1 instancia1 = new Auto1();
                Auto1 instancia2 = new Auto1();
                Auto1 instancia3 = new Auto1();
                //cada una es una versión aparate de la clase, cada una tiene su propia variable velocidad
                instancia1.velocidad = 10;
                instancia2.velocidad = 20;
                instancia3.velocidad = 30;
                //Aqui llamamos la clase estatica AutoStatic, primero nota que no tengo que usar un método constructor, no estoy instanciando nada, estoy llamando a la clase directamente
                //le estamos dando un valor a su campo de velocidad
                AutoStatic.velocidad = 10;
                //si le cambio el valor a su velocidad se reescribe sobre la velocidad anterior porque solo hay una
                AutoStatic.velocidad = 5000;
    
                //Aquí llamamos el método conducir de nuestras 3 instancias de la clase normal y el método conducir de la clase estática
                instancia1.Conducir();
                instancia2.Conducir();
                instancia3.Conducir();
                AutoStatic.Conducir();
    
            }

    Esto es lo que pasa cuando ejecuto mi programa:

    Espero que te sea de ayuda.  Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice “Marcar como Respuesta”). Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    viernes, 18 de septiembre de 2020 20:07
    Moderador
  • Simplificando al máximo, el problema es que desde Main (que es static) llamas a la variable "objeto", que no es static. Desde un static no puedes llamar a algo que no sea static.

    Solución simple:

    static Auto1 objeto = new Auto1();

    Nótese que no tiene nada que ver el contenido de la clase Auto1. Ahí puede haber cosas que sean o no sean estáticas. No afecta para nada al error que te da en Main.
    viernes, 18 de septiembre de 2020 21:15
    Moderador
  • Gracias campeón, me voy a guardar todo eso que escribiste en un word ¡Es super útil! Ahora me quedó todo bastante claro.
    viernes, 18 de septiembre de 2020 21:28