Comprobando si un objeto es nulo en C#
Me gustaría evitar un mayor procesamiento de un objeto si es nulo.
En el siguiente código verifico si el objeto es nulo mediante:
if (!data.Equals(null))
y
if (data != null)
Sin embargo, recibo un NullReferenceException
en dataList.Add(data)
. Si el objeto era nulo, ¡nunca debería haber ingresado la if
declaración!
Por lo tanto, pregunto si esta es la forma adecuada de verificar si un objeto es nulo:
public List<Object> dataList;
public bool AddData(ref Object data)
bool success = false;
try
{
// I've also used "if (data != null)" which hasn't worked either
if (!data.Equals(null))
{
//NullReferenceException occurs here ...
dataList.Add(data);
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return success;
}
Si esta es la forma correcta de comprobar si el objeto es nulo, ¿qué estoy haciendo mal (cómo puedo evitar un mayor procesamiento del objeto para evitar la excepción NullReferenceException)?
No es data
eso null
, pero dataList
.
Necesitas crear uno con
public List<Object> dataList = new List<Object>();
Aún mejor: ya que es un campo, hazlo private
. Y si nada te lo impide, hazlo también readonly
. Sólo buena práctica.
Aparte
La forma correcta de comprobar la nulidad es if(data != null)
. Este tipo de verificación es omnipresente para los tipos de referencia; incluso Nullable<T>
anula el operador de igualdad para que sea una forma más conveniente de expresar nullable.HasValue
al verificar la nulidad.
Si lo hace, if(!data.Equals(null))
obtendrá un NullReferenceException
si data == null
. Lo cual es un poco cómico ya que el objetivo en primer lugar era evitar esta excepción.
También estás haciendo esto:
catch (Exception e)
{
throw new Exception(e.ToString());
}
Definitivamente esto no es bueno. Me imagino que lo pusiste allí solo para poder ingresar al depurador mientras aún estás dentro del método, en cuyo caso ignora este párrafo. De lo contrario, no detecte excepciones por nada. Y si lo haces, vuelve a lanzarlos usando solo throw;
.
Usarif (obj is null)
Para uso no nulo: o
if (obj is object)
(
if (obj is not null)
C# > 9)
Estos ignorarán cualquiera ==
de los !=
definidos por el objeto (a menos, por supuesto, que desee usarlos para comprobaciones nulas)
Para obtener más información, en la Referencia del lenguaje C#, consulte is operator .
C# 6 tiene comprobación nula monádica :)
antes:
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
después:
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Su lista de datos es nula porque no se ha creado una instancia de ella, a juzgar por el código que ha publicado.
Intentar:
public List<Object> dataList = new List<Object>();
public bool AddData(ref Object data)
bool success = false;
try
{
if (!data.Equals(null)) // I've also used if(data != null) which hasn't worked either
{
dataList.Add(data); //NullReferenceException occurs here
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw;
}
return success;
}