Avec l'aperçu VS2015 avec C # 6.0, nous avons un nouvel opérateur, ?.
, qui peut être utilisé comme ceci:
_public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
_
Qu'est-ce que cela fait exactement?
C'est l'opérateur null conditionnel . Cela signifie fondamentalement:
"Evalue le premier opérande; si c'est null, arrête, avec un résultat nul. Sinon, évalue le deuxième opérande (en tant qu'accès membre du premier opérande)."
Dans votre exemple, le fait est que si a
est null
, alors a?.PropertyOfA
sera évalué à null
au lieu de déclencher une exception. Il comparera alors cette référence null
à foo
(à l'aide de la surcharge ==
de la chaîne), constatera qu'elles ne sont pas égales et l'exécution Entrez dans le corps de la déclaration if
.
En d'autres termes, c'est comme ça:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... sauf que a
n'est évalué qu'une fois.
Notez que cela peut aussi changer le type de l'expression. Par exemple, considérons FileInfo.Length
. C'est une propriété de type long
, mais si vous l'utilisez avec l'opérateur conditionnel null, vous obtenez une expression de type long?
:
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
Cela peut être très utile pour aplatir une hiérarchie et/ou des objets de mappage. Au lieu de:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
Cela peut être écrit comme (même logique que ci-dessus)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
Exemple de travail DotNetFiddle.Net .
(le opérateur ?? ou nul-coalescent est différent du ? ou? ou l'opérateur conditionnel nul ).
Il peut également être utilisé en dehors des opérateurs d'affectation avec Action. Au lieu de
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
Il peut être simplifié pour:
myAction?.Invoke(TValue);
en utilisant le système;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
Résultat:
Test 2
Ceci est relativement nouveau en C #, ce qui nous permet d’appeler facilement les fonctions en ce qui concerne les valeurs null ou non-null dans l’enchaînement de méthodes.
l’ancien moyen de parvenir à la même chose était:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
et maintenant cela a été rendu beaucoup plus facile avec juste:
member?.someFunction(var someParam);
Je vous recommande fortement de le lire ici: