Mise à jour tardive : depuis C# 6.0, le opérateur de propagation nulle peut être utilisé pour exprimer une concision comme celle-ci :
if ( list?.Count > 0 ) // For List<T>
if ( array?.Length > 0 ) // For Array<T>
ou, en tant qu'alternative plus propre et plus générique pour les IEnumerable<T>
:
if ( enumerable?.Any() ?? false )
Note 1 : toutes les variantes supérieures reflètent en fait IsNotNullOrEmpty
contrairement à la question de l'OP ( citation ):
En raison de la préséance des opérateurs IsNullOrEmpty
équivalents semblent moins attrayants :
if (!(list?.Count > 0))
Note 2 : ?? false
est nécessaire, pour la raison suivante (résumé/citation de l'auteur) ce poste ):
?.
L'opérateur retournera null
si un membre enfant est null
. Mais [...] si nous essayons d'obtenir un non Nullable
membre, comme le Any()
qui renvoie la méthode bool
[...] le compilateur va "envelopper" une valeur de retour dans Nullable<>
. Par exemple, Object?.Any()
Est-ce que nous donner bool?
(qui est Nullable<bool>
), pas bool
. [...] Comme il ne peut pas être implicitement casté en bool
cette expression ne peut pas être utilisée dans le if
Note 3 : en prime, la déclaration est également "thread-safe" (citation de la réponse de cette question ):
Dans un contexte multithread, si [ énumérable ] est accessible depuis un autre d'un autre thread (soit parce que c'est un champ accessible, soit parce qu'il est ou parce qu'il est fermé dans un lambda qui est exposé à un autre thread). pourrait être différente à chaque fois qu'elle est calculée [ c.-à-d. contrôle préalable de la nullité ]
7 votes
Non, mais ajouter une méthode d'extension est trivial.
0 votes
Duplicata possible de Comment vérifier si IEnumerable est null ou vide ?