Opérateur de propagation N # Null / Expression d'accès conditionnel & amp; si les blocs
La Null propagation de l'opérateur /accès Conditionnel expression venir en c#-6.0 ressemble assez à une fonction bien pratique. Mais je suis curieux de savoir si il va aider à résoudre le problème de la vérification si un membre enfant n'est pas nulle, puis en appelant un Booléen sur l'enfant dit membre à l'intérieur d'un bloc si:
public class Container<int>{
IEnumerable<int> Objects {get;set;}
}
public Container BuildContainer()
{
var c = new Container();
if (/* Some Random Condition */)
c.Objects = new List<int>{1,2,4};
}
public void Test()
{
var c = BuildContainer();
//Old way
if ( null != c && null != c.Objects && c.Objects.Any())
Console.Write("Container has items!");
//C# 6 way?
if (c?.Object?.Any())
Console.Write("Container has items!");
}
Sera c?.Object?.Any()
compiler? Si l'opérateur de multiplication des courts-circuits (je suppose que c'est le bon terme) à null, alors vous avez if (null)
ce qui n'est pas valide.
Sera l'équipe C# répondre à cette préoccupation, ou ai-je raté l'utilisation prévue cas pour le nul de la propagation de l'opérateur?
source d'informationauteur Philip Pittle
Vous devez vous connecter pour publier un commentaire.
Il ne fonctionne pas de cette façon. Vous pouvez simplement ignorer l'explication et de voir le code ci-dessous 🙂
Comme vous le savez
?.
opérateur renvoie la valeur null si un membre enfant est null. Mais qu'advient-il si nous essayons d'obtenir un non nullable membre, comme leAny()
méthode, qui renvoiebool
? La réponse est que le compilateur "wrap", une valeur de retour dansNullable<>
. Par exemple,Object?.Any()
va nous donnerbool?
(qui estNullable<bool>
), pasbool
.La seule chose qui ne nous permet pas d'utiliser cette expression dans la
if
déclaration est qu'il ne peut pas être implicitement coulé àbool
. Mais vous pouvez faire la comparaison explicite, je préfère comparer àtrue
comme ceci:Grâce à @DaveSexton il y a une autre façon:
Mais comme pour moi, la comparaison de
true
semble plus naturel 🙂Null-opérateur conditionnel serait de retour
null
ou de la valeur à la fin de l'expression. Pour types de valeur Il sera de retour suite àNullable<T>
donc dans votre cas il seraitNullabe<bool>
. Si on regarde l'exemple dans le document pour Fonctionnalités à venir en C# (spécifié ici)il a un exemple:Dans l'exemple ci-dessus, au lieu de
int
Nullable<int>
serait renvoyé. Pourbool
il sera de retourNullable<bool>
.Si vous essayez le code suivant dans Visual Studio "14" CTP:
Le résultat de la ligne ci-dessus serait un
Nullable<bool>
/bool?
. Plus tard, vous pouvez faire la comparaison:À l'aide de null-coalescence de l'opérateur ??
À L'Aide De
Nullable<T>.GetValueOrDefault
MéthodeÀ l'aide de la comparaison
true