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.

25voto

D'Arcy Rittich Punkte 159655

?? ist dazu da, einen Wert für einen nullbaren Typ bereitzustellen, wenn der Wert null ist. Wenn also formsAuth null ist, wird new FormsAuthenticationWrapper() zurückgegeben.

19voto

Benjamin Autin Punkte 4075

Das ist die Kurzform für den ternären Operator.

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

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

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

3 Stimmen

Ich habe nur die Schreibweise von "ternär" korrigiert, aber der Operator, den Sie meinen, ist der bedingte Operator. Es ist zufällig der einzige ternäre Operator in C#, aber irgendwann kommt vielleicht ein weiterer hinzu, dann ist "ternär" zweideutig, aber "bedingt" nicht mehr.

1 Stimmen

Es ist eine Kurzform für etwas, das man tun mit dem ternären (bedingten) Operator. In Ihrer Langform müssen sowohl der Test ( != null ) und die zweite formsAuth (nach dem ? ) könnten geändert werden; in der Null-Koaleszenz-Form nehmen beide implizit die von Ihnen angegebenen Werte an.

18voto

Thane Plummer Punkte 5373

Andere haben die Null Coalescing Operator recht gut. In Fällen, in denen ein einziger Test auf Null erforderlich ist, kann die verkürzte Syntax ??= kann die Lesbarkeit verbessern.

Legacy-Null-Test:

if (myvariable == null)
{
    myvariable = new MyConstructor();
}

Unter Verwendung des Null-Koaleszenz-Operators kann dies geschrieben werden:

myvariable = myvariable ?? new MyConstructor();

die auch mit der verkürzten Syntax geschrieben werden kann:

myvariable ??= new MyConstructor();

Manche finden sie besser lesbar und prägnanter.

1 Stimmen

Beachten Sie, dass diese Funktion nur in C# 8 oder höher verfügbar ist.

13voto

Sarah Vessels Punkte 29404

Wenn Sie mit Ruby vertraut sind, ist die ||= scheint ähnlich wie C#s ?? zu mir. Hier ist etwas 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";

5 Stimmen

x ||= y entzuckert zu etwas wie x = x || y Así que ?? ähnelt eigentlich mehr dem einfachen || in Ruby.

8 Stimmen

Beachten Sie, dass ?? kümmert sich nur um null während die || Operator in Ruby ist, wie in den meisten Sprachen, eher ein null , false oder alles, was als boolescher Wert betrachtet werden kann, mit einem Wert von false (z. B. in einigen Sprachen, "" ). Dies ist weder gut noch schlecht, sondern lediglich ein Unterschied.

13voto

brakeroo Punkte 1249

Wie in zahlreichen Antworten richtig angemerkt wurde, handelt es sich dabei um den "Null-Koaleszenz-Operator" ( ?? ), und da wir gerade davon sprechen, sollten Sie sich auch seinen Cousin, den "Null-Conditional Operator", ansehen ( ?. o ?[ ) ist ein Operator, der oft in Verbindung mit ??

Null-Bedingungs-Operator

Wird verwendet, um auf Null zu testen, bevor ein Mitgliederzugriff durchgeführt wird ( ?. ) oder Index ( ?[ ) Betrieb. Diese Operatoren helfen Ihnen, weniger Code für die Handhabung von Null-Prüfungen zu schreiben, insbesondere beim Abstieg in Datenstrukturen.

Zum Beispiel:

// if 'customers' or 'Order' property or 'Price' property  is null,
// dollarAmount will be 0 
// otherwise dollarAmount will be equal to 'customers.Order.Price'

int dollarAmount = customers?.Order?.Price ?? 0; 

auf die alte Weise ohne ?. et ?? dies zu tun, ist

int dollarAmount = customers != null 
                   && customers.Order!=null
                   && customers.Order.Price!=null 
                    ? customers.Order.Price : 0; 

die ausführlicher und umständlicher ist.

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