iver - roslyn c#
¿Por qué compilar el error "Uso de la variable local no asignada"? (8)
Mi código es el siguiente
int tmpCnt;
if (name == "Dude")
tmpCnt++;
¿Por qué hay un error Use of unassigned local variable tmpCnt
? Sé que no lo inicialicé explícitamente, pero debido a la tabla de valores predeterminados, un tipo de valor se inicializa con 0
todos modos. La referencia también me recuerda:
Recuerde que no se permite el uso de variables no inicializadas en C #.
Pero ¿por qué tengo que hacerlo explícitamente si ya está hecho de manera predeterminada? ¿No ganaría rendimiento si no tuviera que hacerlo? Sólo me preguntaba...
La tabla de valores predeterminados solo se aplica a la inicialización de una variable.
Según la página enlazada, los siguientes dos métodos de inicialización son equivalentes ...
int x = 0;
int x = new int();
En su código, simplemente definió la variable, pero nunca inicializó el objeto.
Las asignaciones predeterminadas se aplican a los miembros de la clase, pero no a las variables locales. Como Eric Lippert lo explicó en esta respuesta , Microsoft podría haber inicializado a los lugareños por defecto, pero ellos eligen no hacerlo porque usar un local no asignado es casi seguro un error.
Las siguientes categorías de variables se clasifican como inicialmente sin asignar :
- Variables de instancia de variables de estructura inicialmente no asignadas.
- Parámetros de salida, incluida esta variable de constructores de instancias struct.
- Variables locales, excepto las declaradas en una cláusula catch o en una declaración foreach.
Las siguientes categorías de variables se clasifican como inicialmente asignadas :
- Variables estáticas
- Variables de instancia de instancias de clase.
- Variables de instancia de variables de estructura asignadas inicialmente.
- Elementos de matriz
- Parámetros de valor
- Parámetros de referencia.
- Variables declaradas en una cláusula catch o en una declaración foreach.
Las variables locales no se inicializan automáticamente. Eso solo ocurre con variables de nivel de instancia.
Necesita inicializar explícitamente las variables locales si desea que se inicialicen. En este caso, (como explica la documentación vinculada) estableciendo el valor de 0 o utilizando el new
operador.
El código que ha mostrado efectivamente intenta usar el valor de la variable tmpCnt
antes de que se inicialice a algo, y el compilador advierte acertadamente al respecto.
Las variables locales no se inicializan. Tienes que inicializarlos manualmente.
Los miembros se inicializan, por ejemplo:
public class X
{
private int _tmpCnt; // This WILL initialize to zero
...
}
Pero las variables locales no son:
public static void SomeMethod()
{
int tmpCnt; // This is not initialized and must be assigned before used.
...
}
Entonces tu código debe ser:
int tmpCnt = 0;
if (name == "Dude")
tmpCnt++;
Así que, cuanto antes, los miembros se inicializan, los locales no. Es por eso que obtienes el error del compilador.
Mira este hilo sobre bools no inicializados, pero debería responder a tu pregunta.
Las variables locales no se inicializan a menos que llame a sus constructores (nuevos) o les asigne un valor.
Si bien los tipos de valores tienen valores predeterminados y no pueden ser nulos, también deben inicializarse explícitamente para poder usarlos. Puedes pensar en estas dos reglas como reglas lado a lado. Los tipos de valor NO pueden ser nulos ==> el compilador garantiza eso. Si preguntas cómo? el mensaje de error que recibiste es la respuesta. Una vez que llamas a sus constructores, se inicializaron con sus valores predeterminados.
int tmpCnt; // not accepted
int tmpCnt = new Int(); // defualt value applied tmpCnt = 0
las variables locales no tienen un valor predeterminado.
Deben asignarse definitivamente antes de usarlos. Reduce la posibilidad de utilizar una variable a la que cree haber otorgado un valor razonable, cuando en realidad tiene algún valor predeterminado.