Pregunta

Esto funciona:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

Pero esto da un error de compilación (" Uso de la variable local no asignada 'a' "):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

Por lo que puedo decir, esto sucede porque en el primer ejemplo, técnicamente, el compilador no sabe que 'a' no está asignado. En el último ejemplo, 'a' se define localmente y, por lo tanto, es fácil de rastrear.

¿Pero por qué el último ejemplo no funciona?

¿Los enteros no son predeterminados a 0? ¿Es esto algo que el compilador impone para las "mejores prácticas"? ¿O hay otra razón?

¿Fue útil?

Solución

En el primer ejemplo, es un campo . Los campos predeterminan automáticamente a 0 / falso / nulo. En el segundo ejemplo, es una variable . Las variables son no predeterminadas, y deben tener " asignación definitiva " antes de que se usen.

Esencialmente, al crear un objeto (o inicializar una estructura) pone a cero la memoria (o en el caso de un estructurador no predeterminado, lo obliga a inicializar todo manualmente). Sin embargo, las variables son tan comunes (en todos los métodos) que no quiere la sobrecarga de tener que poner a cero la pila todo el tiempo. En su lugar, te obliga a indicar el valor inicial.

Otros consejos

  

¿Los enteros no son predeterminados a 0?

Lo hacen cuando son miembros de datos de una clase, pero no cuando son una variable local: las variables locales deben inicializarse explícitamente antes de usarse, de ahí el error del compilador.

Cuando crea una instancia de una nueva clase de una clase, toda la memoria que necesita el objeto se pone a cero. los ints se establecen en 0 las cadenas se establecen en null, etc. Esto es para evitar muchos de los extraños errores de memoria y hacks que eran posibles en C (++). Desafortunadamente, esto también tiene un costo de procesamiento pequeño, por lo que cuando crea una variable local, el idioma asume que establecerá el valor usted mismo muy pronto y no se molestará en ponerlo a cero para disminuir el número total de instrucciones requeridas. Para compensar el riesgo de usar memoria no establecida, esto introduce las comprobaciones del compilador para garantizar que se haya establecido un valor antes de que le permita usar la variable.

Eso podría deberse a que a la variable declarada a nivel de clase no se le puede asignar un valor en el mismo ámbito (que no sea al declarar)

por ejemplo

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

mientras que

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

Según mi conocimiento, cuando declaramos una variable en clase y creamos un objeto, el constructor predeterminado inicializa la variable y, por lo tanto, no es necesario inicializar las variables de clase. Pero llegando a los métodos en clase no hay ningún constructor ni nada para inicializar esas variables, por lo que no podemos asignar variables no inicializadas en los métodos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top