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.
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.
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).
@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.
@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/
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.
Mir gefällt, wie Sie die Bedeutung auf "null coalescing operator" vereinfacht haben. Das war alles, was ich brauchte.
Tangential, aber verwandt: Es ist jetzt in Swift, aber es ist ganz anders: "Nil Coalescing Operator" developer.apple.com/library/ios/documentation/Swift/Conceptual/
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.
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>).
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.
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!
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 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.
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.
6 Stimmen
IainMH: Wenn Sie mich fragen, hatte ich keine ziemlich noch nicht mit dem Schreiben des Buches begonnen. (Oder vielleicht habe ich auch nur an Kapitel 1 gearbeitet - so was in der Art.) Zugegeben, eine Suche nach mir hätte schnell meinen Blog + Artikel etc. gefunden.
9 Stimmen
Re: letzter Satz in der Frage - für zukünftige Referenz, SymbolHound ist großartig für diese Art von Dingen z.B.. symbolhound.com/?q=%3F%3F&l=&e=&n=&u= (für alle, die misstrauisch sind - ich bin in keiner Weise verbunden, ich mag einfach ein gutes Werkzeug, wenn ich eines finde...)
7 Stimmen
Auf der Suche nach
C# ??
|C# '??'
|C# "??"
führt nicht zu den erwarteten Ergebnissen. Testet die Suchmaschine, ob C# Null ist, und sagt: Nein - es ist tatsächlichC#
- Hier sind Ihre Ergebnisse fürC#
- Oje!6 Stimmen
@ppumkin Suchen Sie einfach nach
double question mark c#
in Google.