c# - validar - ¿Por qué los tipos de referencia no se inicializan a nulo?
system.nullreferenceexception solucion (4)
El lenguaje C # requiere que todas las variables se asignen definitivamente antes de que se lean. Las variables locales se consideran inicialmente no asignadas , mientras que los campos, los elementos de la matriz, etc. se consideran inicialmente asignados a su valor predeterminado . (Que, para un tipo de referencia, es nulo.)
No existe una razón técnica por la que no podamos tratar las variables locales como asignadas inicialmente a sus valores predeterminados y descartar toda la verificación de asignación definida. Está ahí porque usar un local no asignado como valor predeterminado es (1) una mala práctica de codificación y (2) una fuente altamente probable de errores irritantes. Al exigirle que asigne explícitamente variables locales antes de que se utilicen, evitamos que el usuario use una mala práctica y eliminamos una clase completa de errores que nunca tendrá que depurar.
Además, considere lo siguiente:
while(whatever)
{
int i;
print(i);
i = i + 1;
}
¿Esperas que mantenga su valor en las ejecuciones del ciclo, o que se inicialice en cero a cero cada vez? Al forzarte a inicializarlo explícitamente, la pregunta pierde sentido y esta es una diferencia que no hace diferencia.
(Además, en el caso anterior hay una pequeña optimización de rendimiento potencial, en la que el compilador podría volver a utilizar la variable sin tener que generar código para borrar sus contenidos porque el compilador sabe que va a borrar los contenidos).
No sé cómo responder a tu segunda pregunta porque no sé a qué te refieres con "trabajo". ¿Puedes decirme cómo asignar "int x = 123;" ¿trabajos? Una vez que sé lo que quiere decir con "obras", puedo describir cómo funciona la asignación de un valor nulo a una variable de tipo de referencia.
Verifique este código ...
string str;
if (str.Contains("something.."))
{
}
El compilador arroja este error para este código
Uso de la variable local no asignada ''str''
¿Por qué un tipo de referencia no se inicializa a nulo?
Solo quiero saber por curiosidad.
También me gustaría saber qué sucede con el código a continuación. ¿Cómo funciona esta tarea?
string str = null;
Se inicializa a nulo. El compilador te hizo un favor al no tener que depurar la inevitable NullReferenceException que obtendrás.
Solo los campos (variables declaradas a nivel de clase) se inicializan automáticamente:
- Los tipos de valor se inicializan a su valor predeterminado.
- Los tipos de referencia se inicializan a referencia
null
.
Lo que está declarando es una "variable local" dentro de un método. Las variables locales no se inicializan automáticamente independientemente de que sean un tipo de valor o un tipo de referencia.
También me gustaría saber qué sucede con el código a continuación. ¿Cómo funciona esta tarea?
Esta asignación inicializa la variable local con valor nulo con una instrucción ldnull
seguida de una instrucción stloc
(en caso de que no esté optimizada, por supuesto) y, lo que es más importante, cumple las reglas de análisis de flujo de datos del compilador para la asignación definitiva. La especificación C # define un concepto llamado asignación definida que asegura que una variable se asigna antes del primer uso.
Tenga en cuenta también que la invocación de Contiene en una cadena nula arrojará una NullReferenceException.