Comprobando si un objeto es nulo en C#

Resuelto developer asked hace 13 años • 22 respuestas

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 NullReferenceExceptionen dataList.Add(data). Si el objeto era nulo, ¡nunca debería haber ingresado la ifdeclaració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)?

developer avatar Jun 21 '11 04:06 developer
Aceptado

No es dataeso 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.HasValueal verificar la nulidad.

Si lo hace, if(!data.Equals(null))obtendrá un NullReferenceExceptionsi 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;.

Jon avatar Jun 20 '2011 21:06 Jon

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 .

kofifus avatar Jul 04 '2018 01:07 kofifus

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;
Jowen avatar Feb 07 '2014 07:02 Jowen

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;
}
glosrob avatar Jun 20 '2011 21:06 glosrob