it-swarm.com.de

Was bedeutet Fragezeichen und Punktoperator? meine in C # 6.0?

Mit C # 6.0 in der VS2015-Vorschau haben wir einen neuen Operator ?., der folgendermaßen verwendet werden kann:

_public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}
_

Was genau macht es?

293
Landeeyo

Es ist der Operator nullbedingt . Es bedeutet im Grunde:

"Bewerten Sie den ersten Operanden. Wenn dies null ist, stoppen Sie mit einem Ergebnis von null. Anderenfalls bewerten Sie den zweiten Operanden (als Elementzugriff auf den ersten Operanden)."

In Ihrem Beispiel ist der Punkt, dass, wenn anull ist, _a?.PropertyOfA_ zu null ausgewertet wird, anstatt eine Ausnahme auszulösen. Dann wird der null-Verweis mit foo (unter Verwendung der Zeichenfolge _==_ Überladung) verglichen Sie sind nicht gleich und die Ausführung erfolgt im Hauptteil der Anweisung if.

Mit anderen Worten ist es so:

_string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}
_

... außer dass a nur einmal ausgewertet wird.

Beachten Sie, dass dies auch den Typ des Ausdrucks ändern kann. Betrachten Sie zum Beispiel FileInfo.Length . Das ist eine Eigenschaft vom Typ long, aber wenn Sie sie mit dem Operator null verwenden, erhalten Sie einen Ausdruck vom Typ _long?_:

_FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
_
414
Jon Skeet

Dies kann beim Reduzieren einer Hierarchie und/oder beim Zuordnen von Objekten sehr hilfreich sein. Anstatt von:

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;
}

Es kann so geschrieben werden (gleiche Logik wie oben)

mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";

DotNetFiddle.Net Arbeitsbeispiel .

(Der ?? oder Null-Koaleszenzoperator unterscheidet sich vom ? oder Null-Bedingungsoperator ).

Es kann auch außerhalb von Zuweisungsoperatoren mit Aktion verwendet werden. Anstatt von

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

Es kann vereinfacht werden:

myAction?.Invoke(TValue);

DotNetFiddle-Beispiel :

using System;

public class Program
{
  public static void Main()
  {
    Action<string> consoleWrite = null;

    consoleWrite?.Invoke("Test 1");

    consoleWrite = (s) => Console.WriteLine(s);

    consoleWrite?.Invoke("Test 2");
  }
}

Ergebnis:

Test 2

66
Erik Philips

Dies ist relativ neu in C #, was es für uns einfach macht, die Funktionen in Bezug auf die Null- oder Nicht-Null-Werte in der Methodenverkettung aufzurufen.

der alte Weg, dasselbe zu erreichen, war:

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

und jetzt ist es viel einfacher geworden mit nur:

member?.someFunction(var someParam);

Ich empfehle Ihnen dringend, es hier zu lesen:

https://docs.Microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

2
Zeeshan Adil