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 ?

3voto

Jordão Points 29221

Vous pouvez encapsuler la vérification de la nullité dans une méthode d'extension et utiliser un lambda :

public static class EnumerableExtensions {
  public static void ForEach<T>(this IEnumerable<T> self, Action<T> action) {
    if (self != null) {
      foreach (var element in self) {
        action(element);
      }
    }
  }
}

Le code devient :

items.ForEach(item => { 
  ...
});

On peut être encore plus concis si l'on veut simplement appeler une méthode qui prend un élément et renvoie void :

items.ForEach(MethodThatTakesAnItem);

2voto

boca Points 1414

Ce n'est pas superflu. Au moment de l'exécution, les éléments seront convertis en IEnumerable et sa méthode GetEnumerator sera appelée. Cela entraînera un déréférencement des éléments qui échouera

1voto

Steve Townsend Points 36948

Vous en avez besoin. Vous obtiendrez une exception lorsque foreach accède au conteneur pour mettre en place l'itération autrement.

Sous les couvertures, foreach utilise une interface implémentée sur la classe de collection pour effectuer l'itération. L'interface générique équivalente est aquí .

L'instruction foreach du programme C# (pour chaque en Visual Basic) cache la complexité des énumérateurs énumérateurs. Par conséquent, il est recommandé d'utiliser l'instruction foreach est recommandée au lieu de manipuler directement directement l'énumérateur.

0voto

Marius Bancila Points 9184

Le test est nécessaire, car si la collection est nulle, foreach lancera une NullReferenceException. Il est en fait assez simple de l'essayer.

List<string> items = null;
foreach(var item in items)
{
   Console.WriteLine(item);
}

0voto

harryovers Points 1655

La seconde lancera un NullReferenceException avec le message Object reference not set to an instance of an 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