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.

2625voto

lc. Punkte 109470

Es handelt sich um den Null-Koaleszenz-Operator, der dem ternären Operator (Sofort-wenn) sehr ähnlich ist. Siehe auch ?? Bediener - MSDN .

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

erweitert sich auf:

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

der sich weiter ausdehnt:

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

Auf Englisch heißt das: "Wenn das, was links steht, nicht null ist, dann nimm das, sonst nimm das, was rechts steht."

Beachten Sie, dass Sie beliebig viele davon nacheinander verwenden können. Die folgende Anweisung weist den ersten Nicht-Null-Wert Answer# a Answer (wenn alle Antworten null sind, wird die Answer ist null):

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

Außerdem ist es erwähnenswert, dass die obige Erweiterung zwar konzeptionell gleichwertig ist, das Ergebnis jedes Ausdrucks aber nur einmal ausgewertet wird. Dies ist wichtig, wenn ein Ausdruck beispielsweise ein Methodenaufruf mit Seiteneffekten ist. (Dank an @Joey für den Hinweis darauf).

26 Stimmen

Potenziell gefährlich, diese vielleicht zu verketten

95 Stimmen

@CodeBlend, es ist nicht gefährlich. Wenn Sie expandieren würden, hätten Sie nur eine Reihe von verschachtelten if/else-Anweisungen. Die Syntax ist nur seltsam, weil Sie nicht gewohnt sind, sie zu sehen.

1 Stimmen

@jm2 Solange Sie überprüfen, was Sie tun, zum Beispiel, wenn Sie bedeutete, um getrennte nicht verschachtelte ifs haben dies nicht angemessen wäre. (Das Lesen dieser wirklich zeigte mir eine anständige (ish) Beispiel, wie es verwendet werden kann)[ rlacovara.blogspot.com/2009/07/

332voto

Jon Skeet Punkte 1325502

Nur weil noch niemand die magischen Worte gesagt hat: Es ist der Null-Koaleszenz-Operator . Sie ist in Abschnitt 7.12 der C# 3.0 Sprachspezifikation .

Es ist sehr praktisch, vor allem wegen der Art und Weise, wie es funktioniert, wenn es mehrfach in einem Ausdruck verwendet wird. Ein Ausdruck der Form:

a ?? b ?? c ?? d

liefert das Ergebnis des Ausdrucks a wenn es nicht null ist, ansonsten versuchen Sie b , ansonsten versuchen c , ansonsten versuchen d . Es gibt an jeder Stelle einen Kurzschluss.

Auch wenn der Typ der d nicht nullbar ist, ist auch der Typ des gesamten Ausdrucks nicht nullbar.

3 Stimmen

Mir gefällt, wie Sie die Bedeutung auf "null coalescing operator" vereinfacht haben. Das war alles, was ich brauchte.

2 Stimmen

Tangential, aber verwandt: Es ist jetzt in Swift, aber es ist ganz anders: "Nil Coalescing Operator" developer.apple.com/library/ios/documentation/Swift/Conceptual/

81voto

Iain Holder Punkte 13981

Das ist der Null-Koaleszenz-Operator.

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

Ja, es ist fast unmöglich, danach zu suchen, wenn man nicht weiß, wie es heißt :-)

EDIT: Und das ist ein cooles Feature aus einer anderen Frage. Man kann sie verketten.

Versteckte Eigenschaften von C#?

39 Stimmen

Wenigstens ist es jetzt einfach, danach zu suchen, auch wenn man den Namen nicht kennt, ich habe einfach gegoogelt "doppeltes fragezeichen c#"

39voto

Edward Tanguay Punkte 182540

Danke an alle, hier ist die prägnanteste 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;

4 Stimmen

Dies deutet auf einen wichtigen Aspekt des ??-Operators hin - er wurde eingeführt, um die Arbeit mit nullbaren Typen zu erleichtern. In Ihrem Beispiel ist "x" vom Typ "int?" (Nullable<int>).

9 Stimmen

@vitule nein, wenn der zweite Operand des Null-Koaleszenz-Operators nicht-nullbar ist, dann ist das Ergebnis nicht-nullbar (und -1 ist nur eine einfache int die nicht nullbar ist).

33voto

Shivprasad Koirala Punkte 25296

enter image description here

Die beiden Fragezeichen (??) weisen darauf hin, dass es sich um einen Coalescing-Operator handelt.

Der Koaleszenz-Operator gibt den ersten NON-NULL-Wert aus einer Kette zurück. Sie können sehen dieses youtube-Video die das Ganze praktisch demonstriert.

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

Die englische Bedeutung von coalescing lautet "zusammenführen". Nachfolgend ein Beispiel für einen einfachen Koaleszenzcode, der vier Zeichenfolgen miteinander verbindet.

Wenn also str1 es null es wird versuchen str2 wenn str2 es null es wird versuchen str3 und so weiter, bis er eine Zeichenkette mit einem Nicht-Null-Wert findet.

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

Mit einfachen Worten gibt der Coalescing-Operator den ersten NON-NULL-Wert aus einer Kette zurück.

1 Stimmen

Ich mag diese Erklärung, weil sie ein Diagramm enthält und der letzte Satz es in so einfachen Worten erklärt! Das macht es leicht zu verstehen und stärkt mein Vertrauen in die Anwendung. Danke!

0 Stimmen

Wenn wir nur die englische Bedeutung von coalesce nehmen, könnten wir erwarten, dass das Ergebnis eine Art Vereinigung oder Verschmelzung der Argumente ist. Das ist sicherlich nicht die beste Metapher für das, was es tatsächlich tut. Aber es gibt einen langjährigen Vorgänger, die t-sql COALESCE Funktion, die dasselbe tut, und - was nur wenigen Entwicklern bekannt sein dürfte - eine variable Argumentliste hat, so dass sie mehr als zwei Kandidatenwerte für die Zusammenführung annehmen kann, genau wie der .NET ??

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