No, las variables locales no tienen un valor predeterminado . Tienen que ser definitivamente asignados antes de leerlos. Esto reduce la probabilidad de que use una variable que piensa que le ha dado un valor razonable, cuando en realidad tiene algún valor predeterminado. Esto no se puede hacer, por ejemplo, ni con variables estáticas porque no sabe en qué orden se llamarán los métodos.
Consulte la sección 5.3 de la especificación C# 3.0 para obtener más detalles sobre la asignación definitiva.
Tenga en cuenta que esto no tiene nada que ver con que se trata de una variable de tipo de referencia. Esto dejará de recopilar de la misma manera:
int i;
if (i == 0) // Nope, i isn't definitely assigned
{
}
En lo que se refiere a la lengua, de todos modos ... claramente la ubicación de almacenamiento en la memoria tiene algo en él, pero es irrelevante y específico de la implementación. Hay uno manera en que puede averiguar cuál es ese valor, creando un método con un parámetro out
pero luego usando IL para ver el valor de ese parámetro dentro del método, sin darle otro valor. El CLR no le importa eso en absoluto. A continuación, puede llamar al que pasa el método en una variable no asignada definitivamente, y he aquí que puede detectar el valor, que básicamente es el valor de "todos los ceros".
Sospecho que la especificación CLI hace hacer cumplir las variables locales que tienen un valor predeterminado, pero tendría que comprobar. A menos que estés haciendo cosas malas como la anterior, no debería importarte en C#.
En ese momento, Bar apunta a un lugar en la pila, no al montón. Esa es la razón por la que necesita un valor –
Y las clases se inicializan en el montón ¿no? Y no construye. ¿Correcto? – Snake
Pero el código se ejecuta en el contexto del Constructor –