260 votes

vérifier si un objet est nul en c#

Je voudrais empêcher la poursuite du traitement d'un objet s'il est nul.

Dans le code suivant, je vérifie si l'objet est nul par soit :

if(!data.Equals(null))

et

if(data != null)

Cependant, je reçois un NullReferenceException sur dataList.Add(data) . Si l'objet était nul, il n'aurait même pas dû entrer dans l'énoncé if !

Je demande donc si c'est une bonne façon de vérifier si un objet est nul :

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 c'est la bonne façon de vérifier si l'objet est nul, qu'est-ce que je fais mal (comment puis-je empêcher la poursuite du traitement de l'objet pour éviter l'exception NullReferenceException) ?

14 votes

Vous devez également utiliser throw e; contre throw new Exception(e.ToString());

0 votes

Est-ce que le data initialisé avant de vérifier s'il est nul ? Ou cela vient-il d'une base de données ?

20 votes

En C#, vous devez toujours utiliser != null dans vos contrôles nuls. .Equals lèvera toujours une exception si l'objet est nul.

267voto

Jon Points 194296

Ce n'est pas data c'est-à-dire null mais dataList .

Vous devez en créer un avec

public List<Object> dataList = new List<Object>();

Encore mieux : puisque c'est un champ, faites-en un private . Et si rien ne t'empêche de le faire, fais-le aussi. readonly . Juste une bonne pratique.

Aside

La façon correcte de vérifier la nullité est if(data != null) . Ce type de vérification est omniprésent pour les types de référence ; même Nullable<T> remplace l'opérateur d'égalité pour être un moyen plus pratique d'exprimer nullable.HasValue lors de la vérification de la nullité.

Si vous le faites if(!data.Equals(null)) alors vous obtiendrez un NullReferenceException si data == null . Ce qui est assez comique puisque l'objectif premier était d'éviter cette exception.

C'est aussi ce que vous faites :

catch (Exception e)
{
    throw new Exception(e.ToString());
}

Ce n'est vraiment pas bon. Je peux imaginer que vous l'avez mis là juste pour pouvoir entrer dans le débogueur tout en restant dans la méthode, auquel cas ignorez ce paragraphe. Sinon, n'attrapez pas les exceptions pour rien. Et si vous le faites, relancez-les en utilisant simplement throw; .

6 votes

J'ai aussi vu Object.ReferenceEquals(obj, null) à cette fin. Est-ce pour éviter les surcharges d'égalité ?

2 votes

@LucaPiccioni Je l'ai utilisé pour éviter les plaines de type valeur lors de l'utilisation de génériques : geekality.net/2009/11/13/generics-and-checking-for-null

5 votes

Je préfère null != data . Le fait de mettre la constante en premier évite la faute de frappe. null = data en une erreur de compilation, plutôt qu'une affectation non intentionnelle. (Cela fonctionne également pour == .)

27voto

glosrob Points 4318

Votre dataList est nulle car elle n'a pas été instanciée, à en juger par le code que vous avez affiché.

Essayez :

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 new Exception(e.ToString());
}
return success;

}

3 votes

Aussi, juste pour ajouter, si les données sont nulles, il ne se plantera pas, vous pouvez ajouter null à une List<Object>.

7 votes

Mais essayer de faire .Equals sur un null déclencherait une exception. Il faudrait faire != null

0 votes

@glosrob : Ah !! Quel oubli ! Je pensais que l'exception NullReferenceException provenait de l'objet pas de la liste ! Je suis nouveau en c# et je pensais qu'il y avait une façon spéciale de vérifier les nullités en c# !

22voto

gatopeich Points 474

[Modifié pour refléter l'astuce de @kelton52]

Le moyen le plus simple est de faire object.ReferenceEquals(null, data)

Depuis (null==data) n'est PAS garantie de fonctionner :

class Nully
{
    public static bool operator ==(Nully n, object o)
    {
        Console.WriteLine("Comparing '" + n + "' with '" + o + "'");
        return true;
    }
    public static bool operator !=(Nully n, object o) { return !(n==o); }
}
void Main()
{
    var data = new Nully();
    Console.WriteLine(null == data);
    Console.WriteLine(object.ReferenceEquals(null, data));
}

Produit :

Comparaison entre '' et 'Nully'.

Véritable

Faux

2 votes

En fait, je viens d'essayer ceci, et la remarque "L'avantage implicite est qu'il ignore les surcharges qui peuvent être présentes dans la classe des données, comme "operator !=". ne semble pas se vérifier.

9voto

Ed S. Points 70246

Non, vous devriez utiliser != . Si data est en fait nulle, alors votre programme se plantera avec une erreur de type NullReferenceException à la suite d'une tentative d'appel de la Equals méthode sur null . Sachez également que, si vous souhaitez spécifiquement vérifier l'égalité des références, vous devez utiliser la fonction Object.ReferenceEquals car on ne sait jamais comment Equals a été mis en œuvre.

Votre programme se bloque parce que dataList est nulle car vous ne l'initialisez jamais.

7voto

Jeffrey L Whitledge Points 27574

Le problème dans ce cas n'est pas que data est nulle. C'est que dataList est lui-même nul.

A l'endroit où vous déclarez dataList vous devez créer un nouveau List et l'assigne à la variable.

List<object> dataList = new List<object>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X