studio - validar si un objeto es null c#
¿Por qué este inicializador de objeto anidado lanza una excepción de referencia nula? (1)
El compilador no da una advertencia porque podrías tener:
public class R
{
public H Header { get; set; }
public R()
{
Header = new H();
}
}
así que Header
podría ser inicializado por alguien / algo. Resolver si alguien / algo inicializará el Header
es un problema complejo (probablemente similar al problema de detención) ... No es algo que un compilador quiera resolver por usted :-)
De las especificaciones de C #:
Un inicializador de miembro que especifica un inicializador de objeto después del signo igual es un inicializador de objeto anidado, es decir, una inicialización de un objeto incrustado. En lugar de asignar un nuevo valor al campo o propiedad, las asignaciones en el inicializador de objeto anidado se tratan como asignaciones a los miembros del campo o propiedad . Los inicializadores de objetos anidados no se pueden aplicar a propiedades con un tipo de valor, o a campos de solo lectura con un tipo de valor.
Estamos en el caso de un inicializador anidado, y vemos la parte en negrita. No lo sabia
Ahora, observe que la new R { }
es, según la especificación de C #, 7.6.10.1 Object creation expressions
seguidas de un object-initializer
, mientras que el Header = { }
es un 7.6.10.2 Object initializers
"puro".
El siguiente testcase lanza una excepción de referencia nula, cuando trata de asignar Id a un objeto que es nulo, ya que el código falta la "nueva R" antes del inicializador de objeto.
¿Por qué esto no es atrapado por el compilador? ¿Por qué está permitido, en qué casos de uso sería un constructo significativo?
[TestClass]
public class ThrowAway
{
public class H
{
public int Id { get; set; }
}
public class R
{
public H Header { get; set; }
}
[TestMethod]
public void ThrowsException()
{
var request = new R
{
Header =
{
Id = 1
},
};
}
}