1994 Stimmen

Was bedeuten zwei Fragezeichen zusammen in C#?

Bin auf diese Codezeile gestoßen:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

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

70 Stimmen

Es ist definitiv no ein ternärer Operator - er hat nur zwei Operanden! Er ist ein bisschen wie der bedingte Operator (der ist ternär), aber der Null-Koaleszenz-Operator ist ein binärer Operator.

104 Stimmen

Ich habe es in einem Vorstellungsgespräch erklärt, in dem der potenzielle Arbeitgeber zuvor Zweifel an meinen C#-Fähigkeiten geäußert hatte, da ich zuvor eine Zeit lang beruflich mit Java gearbeitet hatte. Sie hatten vorher noch nie etwas davon gehört und stellten meine Vertrautheit mit C# danach nicht mehr in Frage :)

85 Stimmen

@Jon Skeet Seit dem Kerl, der die Beatles ablehnte, gab es keine derartigen Misserfolge bei der Anerkennung von Fähigkeiten mehr :-) Schicken Sie ihnen von nun an einfach ein Exemplar Ihres Buches mit einem Link zu Ihrem SO-Profil auf der Innenseite des Umschlags.

8voto

Im einfachsten Fall werden zwei Fragezeichen als "Coalescing Operator" bezeichnet, der den ersten Nicht-Null-Wert aus der Kette zurückgibt.

Wenn Sie z.B. einen Wert von einem nicht löschbaren Objekt in einer Variablen erhalten, die nicht löschbar ist, dann können Sie diesen Operator verwenden. d.h..

int a = 1;
int? b = null;
a = b??0;

Das Ergebnis der obigen Gleichung wäre Null, da b Null ist und wir den Operator ?? zusammen mit Null verwendet haben, was bedeutet, dass 0 zurückgegeben wird, wenn und nur wenn b Null ist.

int a = 1;
int? b = 15;
a = b??0;

In der obigen Gleichung erhält a den Wert "15", weil b einen gültigen Wert hat und nicht null ist. Außerdem können Sie den Operator ?? nicht auf ein nicht löschbares Objekt anwenden.

In den obigen Beispielen habe ich ?? 0, es kann jedoch auch eine komplett neue Gleichung nach dem Operator ?? verwendet werden.

Wie zum Beispiel
a = b ?? ( x==1 ? 10 : 15)
Ich hoffe, das klärt Ihre Frage.

4voto

Jubayer Hossain Punkte 71

El ?? wird als Null-Koaleszenz-Operator bezeichnet. Er gibt den linken Operanden zurück, wenn der Operand nicht null ist; andernfalls gibt er den rechten Operanden zurück.

int? variable1 = null;
int variable2  = variable1 ?? 100;

Satz variable2 auf den Wert von variable1 wenn variable1 ist NICHT null; andernfalls, wenn variable1 == null gesetzt variable2 auf 100.

0 Stimmen

Das ist es, was ich brauchte. Danke, Mann!

3voto

NolePTR Punkte 158
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

ist gleichbedeutend mit

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

Aber das Tolle daran ist, dass man sie aneinanderreihen kann, wie andere Leute schon sagten. Die eine dünne nicht auf berührt ist, dass Sie tatsächlich verwenden können, um eine Ausnahme zu werfen.

A = A ?? B ?? throw new Exception("A and B are both NULL");

0 Stimmen

Es ist wirklich großartig, dass Sie in Ihrem Beitrag Beispiele angeführt haben, obwohl die Frage nach einer Erklärung des Operators oder seiner Funktion gerichtet war.

1voto

Ashish Mishra Punkte 608

Es handelt sich um einen Null-Koaleszenz-Operator, der ähnlich wie ein ternärer Operator funktioniert.

    a ?? b  => a !=null ? a : b 

Ein weiterer interessanter Punkt in diesem Zusammenhang ist, "Ein nullbarer Typ kann einen Wert enthalten, oder er kann undefiniert sein. . Wenn Sie also versuchen, einen nicht löschbaren Werttyp einem nicht löschbaren Werttyp zuzuweisen zuzuweisen, erhalten Sie einen Kompilierfehler.

int? x = null; // x is nullable value type
int z = 0; // z is non-nullable value type
z = x; // compile error will be there.

Um dies zu tun, verwenden Sie den Operator ??

z = x ?? 1; // with ?? operator there are no issues

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X