Ce n'est point d'interrogation et le point d'opérateur ?. moyenne en C# 6.0?
Avec C# 6.0 dans le VS2015 aperçu, nous avons un nouvel opérateur, ?.
, qui peut être utilisée comme ceci:
public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
Exactement ce que fait-il?
Vous devez vous connecter pour publier un commentaire.
C'est le null conditionnel de l'opérateur. Cela signifie en gros:
"L'évaluation de la première opérande; si c'est null, stop, avec un résultat null. Sinon, évaluer le second opérande (comme l'accès d'un membre de la première opérande)."
Dans votre exemple, le point est que si
a
estnull
, puisa?.PropertyOfA
permettra d'évaluer ànull
plutôt que de lancer une exception, il comparera alors quenull
de référence avecfoo
(à l'aide de la chaîne de==
surcharge), trouver qu'ils ne sont pas égaux et d'exécution entreront dans le corps de laif
déclaration.En d'autres termes, c'est comme ça:
... sauf que
a
n'est évaluée qu'une fois.Noter que cela peut changer le type de l'expression, trop. Par exemple, considérons
FileInfo.Length
. C'est une propriété de typelong
, mais si vous l'utilisez avec la valeur null opérateur conditionnel, vous vous retrouvez avec une expression de typelong?
:if(a ?. PropertyOfA != foo)
est valide, alors votre réponse, cela implique queif(null)
est également valide. Est-il, et si oui, est-il évaluer àtrue
oufalse
?a?.PropertyOfA
dont la valeur est null - je vais le dire clairement.CS0019
en Mono sur le code qui compile bien avec .NET.Cannot implicitly convert type 'bool?' to 'bool'.
lors de la construction de code qui contient?.
Pas une telle erreur est généré avec .NET est un compilateur (qui n'est pas un problème).?.
et.?
sont les mêmes? Je suis à la recherche d'.?
et fini icistring.Join(",", potentiallyNull)
, ou devrais-je simplement s'en tenir à l'utilisation de l'opérateur ternaire?potentiallyNull ?? ""
string.Join()
fonction. Je ne vois pas un moyen de contourner le ternaire, je me demandais juste si il y avait quelqu'un de plus intelligent que moi, qui connaissait une sorte de magie.string.Join(",", potentiallyNull ?? "")
etpotentiallyNull
est nulle, alorsstring.Join
retourne une chaîne vide. N'est-ce pas ce que vous voulez?x?.Foo(10)
- est que "l'évaluation de sécurité"? Bien sûr, il ne lèvera une exception de type référence nulle immédiatement six
est nul, mais il pourrait facilement encore lever une exception. Il pourrait même lancer une exception NullReferenceException, à l'intérieur deFoo
. C'est seulement le déréférencement de x est nulle-fort, d'où ma proposé de terminologie, si vous avez vraiment, vraiment ne voulez pas utiliser ce que l'équipe C#, a décidé sur.Il peut être très utile lors de l'aplatissement d'une hiérarchie et/ou les objets de mappage. Au lieu de:
Il peut être écrit comme (même logique que ci-dessus)
DotNetFiddle.Net Exemple De Travail.
(le ?? ou null-coalescence de l'opérateur est différente de la ? ou null opérateur conditionnel).
Il peut également être utilisé hors du côté de l'affectation des opérateurs de l'Action. Au lieu de
Il peut être simplifiée:
DotNetFiddle Exemple:
à l'aide du Système;
Résultat:
|| Model.Model2.Model3.Model4.Name == null
pour avoir la même logique, sinon en casModel.Model2.Model3.Model4.Name
estnull
,mapped.Name
resteranull
Model.Model2.Model3.Model4.Name
estnull
.else
-branch etmapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null
, tandis que le deuxième exemple serait se substituer àmapped.Name = "N/A"
. Voir le édité DotNetFiddleC'est relativement nouveau, C#, ce qui le rend facile pour nous d'appeler les fonctions à l'égard de la nulle ou non nulle valeurs dans le chaînage de méthode.
ancienne façon de réaliser la même chose a été:
et maintenant il a été fait beaucoup plus facile avec juste:
Je vous recommande fortement de le lire ici:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators