158 votes

Est-ce que if(items != null) est superflu avant foreach(T item in items) ?

Je rencontre souvent un code comme le suivant :

if ( items != null)
{
   foreach(T item in items)
   {
        //...
   }
}

En principe, le if La condition garantit que foreach Le bloc ne s'exécutera que si items n'est pas nulle. Je me demande si le if est réellement nécessaire, ou foreach traitera le cas si items == null .

Je veux dire par là que je peux simplement écrire

foreach(T item in items)
{
    //...
}

sans se préoccuper de savoir si items est nulle ou non ? Est-ce que le if condition superflue ? Ou bien cela dépend de la type de items ou peut-être sur T également ?

172voto

Vlad Bezden Points 5024

Vous devez toujours vérifier si (items != null) sinon vous obtiendrez une NullReferenceException. Cependant, vous pouvez faire quelque chose comme ceci :

List<string> items = null;  
foreach (var item in items ?? new List<string>())
{
    item.Dump();
}

mais vous pouvez en vérifier la performance. Je préfère donc toujours avoir if (items != null) en premier.

Sur la base de la suggestion d'Eric Lippert, j'ai changé le code en :

List<string> items = null;  
foreach (var item in items ?? Enumerable.Empty<string>())
{
    item.Dump();
}

104voto

kjbartel Points 453

En C# 6, vous pouvez utiliser le nouvel opérateur conditionnel null avec List<T>.ForEach(Action<T>) (ou votre propre IEnumerable<T>.ForEach (méthode d'extension).

List<string> items = null;
items?.ForEach(item =>
{
    // ...
});

38voto

Eric Lippert Points 300275

Ce qu'il faut retenir, c'est que une séquence ne devrait presque jamais être nulle en premier lieu . Il suffit de faire un invariant dans tous vos programmes : si vous avez une séquence, elle n'est jamais nulle. Elle est toujours initialisée pour être la séquence vide ou une autre séquence authentique.

Si une séquence n'est jamais nulle, il est évident qu'il n'est pas nécessaire de la vérifier.

11voto

Teoman Soygul Points 17544

En fait, il y a une demande de fonctionnalité à ce sujet ici : https://github.com/dotnet/csharplang/discussions/1081#issuecomment-443209795 Et la réponse est tout à fait logique :

Je pense que la plupart des boucles foreach sont écrites avec l'intention d'itérer une collection collection non nulle. Si vous essayez d'itérer dans une collection nulle, vous devriez obtenir l'exception, afin que vous puissiez corriger votre code.

6voto

nbz Points 1789

Vous pouvez toujours le tester avec une liste nulle... mais voici ce que j'ai trouvé sur le site msdn

foreach-statement:
    foreach   (   type   identifier   in   expression   )   embedded-statement 

Si l'expression a la valeur null, une exception System.NullReferenceException est levée.

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