Frage Was bedeuten zwei Fragezeichen zusammen in C #?


Ran über diese Codezeile:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

Was bedeuten die beiden Fragezeichen, ist es eine Art ternärer Operator? Es ist schwer, in Google nachzuschlagen.


1319
2018-01-15 14:03


Ursprung


Antworten:


Es ist der Null-Koaleszenzoperator und ganz ähnlich wie der ternäre (Sofort-Wenn-) Operator. Siehe auch ?? Bediener - MSDN.

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

erweitert zu:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

welches sich weiter ausdehnt zu:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

Im Englischen bedeutet das: "Wenn das, was auf der linken Seite ist, nicht null ist, benutze das, ansonsten benutze das, was rechts ist."

Beachten Sie, dass Sie beliebig viele davon nacheinander verwenden können. Die folgende Anweisung weist das erste nicht null zu Answer# zu Answer (Wenn alle Antworten null sind, dann ist der Answer ist Null):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

Es ist auch erwähnenswert, dass die obige Erweiterung konzeptionell äquivalent ist, das Ergebnis jedes Ausdrucks wird nur einmal ausgewertet. Dies ist wichtig, wenn beispielsweise ein Ausdruck ein Methodenaufruf mit Nebenwirkungen ist. (Dank an @Joey, dass Sie darauf hingewiesen haben.)


1801
2018-01-15 14:04



Nur weil noch niemand die magischen Worte gesagt hat: es ist das null Koaleszenzoperator. Es ist in Abschnitt 7.12 der definiert C # 3.0-Sprachspezifikation.

Es ist sehr praktisch, besonders weil es funktioniert, wenn es mehrmals in einem Ausdruck verwendet wird. Ein Ausdruck der Form:

a ?? b ?? c ?? d

wird das Ergebnis des Ausdrucks geben a Wenn es nicht null ist, versuchen Sie es andernfalls bsonst versuche es csonst versuche es d. Es schließt an jedem Punkt kurz.

Auch wenn der Typ von d ist nicht nullfähig, der Typ des gesamten Ausdrucks ist ebenfalls nicht nullfähig.


232
2018-01-15 14:07



Es ist der Null-Koaleszenzoperator.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

Ja, fast unmöglich zu suchen, wenn Sie nicht wissen, wie es heißt! :-)

EDIT: Und das ist ein cooles Feature von einer anderen Frage. Sie können sie verketten.

Versteckte Funktionen von C #?


64
2018-01-15 14:05



Vielen Dank an alle, hier ist die kürzeste Erklärung, die ich auf der MSDN-Website gefunden habe:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

21
2018-01-15 14:09



?? Gibt einen Wert für einen Nullwerttyp an, wenn der Wert null ist. Wenn formsAuth also null ist, wird das neue FormsAuthenticationWrapper () zurückgegeben.


16
2018-01-15 14:05



enter image description here

Die zwei Fragezeichen (??) zeigen an, dass es ein Coalescing-Operator ist.

Der Koaleszenzoperator gibt den ersten NON-NULL-Wert aus einer Kette zurück. Du kannst sehen Dieses YouTube-Video was praktisch alles demonstriert.

Aber lassen Sie mich mehr hinzufügen, was das Video sagt.

Wenn Sie die englische Bedeutung des Verschmelzens sehen, sagt es "zusammen konsolidieren". Zum Beispiel unten ist ein einfacher Koaleszenz-Code, der vier Strings kettet.

Also, wenn str1 ist null es wird versuchen str2, ob str2 ist null es wird versuchen str3 und so weiter, bis es eine Zeichenfolge mit einem Nicht-Null-Wert findet.

string final = str1 ?? str2 ?? str3 ?? str4;

In einfachen Worten gibt der Koaleszenzoperator den ersten NON-NULL-Wert aus einer Kette zurück.


13
2017-12-16 10:30



Es ist eine kurze Hand für den ternären Operator.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

Oder für diejenigen, die nicht ternär sind:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

9
2018-01-15 14:05



Wenn Sie mit Ruby vertraut sind, ist es ||= scheint C # verwandt zu sein ?? mir. Hier ist ein Ruby:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

Und in C #:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

9
2018-06-30 17:16



Nur zu deiner Belustigung (zu wissen, dass du alle C # Jungs bist ;-).

Ich denke, es entstand in Smalltalk, wo es seit vielen Jahren existiert. Es ist dort definiert als:

im Objekt:

? anArgument
    ^ self

in UndefinedObject (aka Nils Klasse):

? anArgument
    ^ anArgument

Es gibt sowohl evaluierende (?) Als auch nicht-evaluierende Versionen (??) davon.
Es wird oft in Getter-Methoden für Lazy-initialisierte private (Instanz-) Variablen gefunden, die bis zur tatsächlichen Nullung leer bleiben.


8
2018-01-15 14:31



Nichts gefährliches daran. In der Tat ist es schön. Sie können einen Standardwert hinzufügen, wenn dies erwünscht ist, zum Beispiel:

CODE

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

8
2018-03-21 21:13



Koaleszenz-Operator

es entspricht

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

7
2018-01-15 14:05