Laden...

Kanntet ihr den ??-Operator? [null coalescing-Operator]

Erstellt von herbivore vor 16 Jahren Letzter Beitrag vor 11 Jahren 34.303 Views
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren
Kanntet ihr den ??-Operator? [null coalescing-Operator]

Hallo zusammen,

kanntet ihr den ??-Operator?

String strDest = strSrc ?? "";

ist eine praktische Abkürzung für

String strDest = strSrc != null ? strSrc : "";

Wenn ihr nicht wisst, was das macht: Bitte Erklärung zu (...) ? ... : ... [Antwort: bedingte Bewertung].

Praktisch ist z.B. auch in solchen Fällen:


Console.Writeline (str ?? "<null>");
// oder
textBox1.Text = str ?? "<kein Wert>";

herbivore

PS: Die Eingangsfrage ist natürlich rhetorisch.

Stichwort: 1000 Worte, Fragezeichen

4.207 Beiträge seit 2003
vor 16 Jahren

Rhetorische Antwort: Ja 😉

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Golo,

dass es einige Mitglieder gibt, die den kannten, war schon klar. Ich denke nur, dass der Operator unbekannter ist, als er es verdient. Deshalb habe ich den Beitrag geschrieben.

herbivore

6.862 Beiträge seit 2003
vor 16 Jahren

Bis vor ner Weile kannt ich den echt net, weil man den doch eher weniger brauch und der auch kaum irgendwo erwähnt wird.

Und das obwohl ja nullable Types ne interessante Neuerung waren für .Net 2.0 und der Operator für diese eigentlich eingeführt wurde.

Hier ne ergänzende Erklärung:


int? y = ...;
int x = 0;
.
.
.
x = y;  // Zuweisung 1
x = (int) y; // Zuweisung 2
x = y ?? 1; // Zuweisung 3

Zuweisung 1 ergibt nen Compilerfehler da implizit kein cast möglich ist, aber es gibt einen expliziten cast -> Zuweisung 2.
Zuweisung 2 kann funktionieren wenn y einen Wert hat, ist y aber null gibts ne InvalidOperationException was auch net so dolle ist.

Deshalb hat man den ?? Operator eingeführt der x nur dann y zuweist wenn y != null ist oder wenn y = null ist, dann den defaultwert.

Baka wa shinanakya naoranai.

Mein XING Profil.

5.742 Beiträge seit 2007
vor 16 Jahren

Ich denke nur, dass der Operator unbekannter ist, als er es verdient.

Das kann ich auch nur bestätigen; im openbook wird er nicht einmal erwähnt.
(Deshalb kannte ich ihn auch bis jetzt nicht 🙂 )

4.207 Beiträge seit 2003
vor 16 Jahren

In der Beta von guide to C# 2.0 schon 😉

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

0
767 Beiträge seit 2005
vor 16 Jahren

ist vorallem beim übernehmen von request parametern in websites praktisch:


protected void Page_Load(object sender, EventArgs e)
{
  string name = Request["Name"] ?? string.Empty;
}

dann hat man nacher keine nulls mehr...

loop:
btst #6,$bfe001
bne.s loop
rts

5.657 Beiträge seit 2006
vor 16 Jahren

Danke für den Tip, herbivore! Den Operator kannte ich noch nicht und ich werde ihn in meinen aktiven Wortschatz übernehmen...

Weeks of programming can save you hours of planning

2.187 Beiträge seit 2005
vor 16 Jahren

Den Operator verwende ich in der Zwischenzeit öffte als das "class" Schlüsselwort!

Hab ihn auch erst vor 3 Monaten oder so entdeckt. Wird z.B. nicht in meinem Oraly-C#-Buch erwähnt.

?? Rockt!

L
333 Beiträge seit 2007
vor 16 Jahren

Huch, nein, den kannte ich noch nicht. Vor langer Zeit hab ich mir mal die Schlüsselwort-Liste für C# vorgenommen und alle Schlüsselwörter genau erforscht. Aber an Operatoren hab ich da nicht gedacht. 😉

S
54 Beiträge seit 2007
vor 16 Jahren

Ich kannte ihn nicht 🙂

ganz nett aber ich bleib bei if das sieht man besser 🙂

  1. 😜 😁
L
333 Beiträge seit 2007
vor 16 Jahren

Zum ❔-Operator hat mir vor Jahren ein Arbeitskollege mal gesagt, ich sollte das besser nicht verwenden (weiß nicht, ob das damals noch in C++ war - gab's den da auch schon?), weil ihn viele nicht kennen und den Code dann nicht verstehen würden. Find ich ein doofes Argument, dann sollen sie die Sprache halt besser lernen. Ist ja alles übersichtlich dokumentiert. Wo diese Abkürzungen die Lesbarkeit verbessern, also insbesondere bei kurzen Ausdrücken von max. einer halben Zeile, verwende ich sie gerne. Wenn man mehrere Zeilen dafür braucht, ist ein if u.U. doch besser geeignet.

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo LonelyPixel,

weiß nicht, ob das damals noch in C++ war - gab's den da auch schon?

bedingte Bewertung gab es schon in C.

Ich kann das Argument zwar nachvollziehen, aber halte es nicht für stichhaltig.

herbivore

S
54 Beiträge seit 2007
vor 16 Jahren


if (a==b) lalala; else{tralala}





a=b ? lalala:tralala;

// so hab ich das jetzt mal verstand das es funktionieren soll


// 10 x mal einen Tastendruck gespart :)



Naja also leider macht mein VS-Express das ? nicht farbig und man muss logisch im Kopf zurück springen weil das ? Welches die Übergabe von zuvor zur Bedingung macht erst später kommt (^^). Während das if, das ganz links steht sofort die logik des darauf folgenden Teils ändert. Haarspalterrei, aber das es nicht farbig wird ist stört mich am meisten🙂 habs versucht in den Optionen zu ändern aber geht irgendwie nicht.

😁 8) 🤔

L
333 Beiträge seit 2007
vor 16 Jahren
  
a=b ? lalala:tralala;  
  

tralala wird nie ausgeführt. Weißt du auch warum? 😉

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Schnueggel,

ich denke mal, da hast du was falsch verstanden.

? : ist kein Ersatz und auch keine Kurzform von if () else, sondern eine Möglichkeit innerhalb eines Ausdrucks eine Verzweigung zu verwenden. Das hat z.B. als Konsequenz, dass linker und rechter Ausdruck vom Doppelpunkt den gleichen/kompatiblen Ergebnistyp haben muss und einiges mehr. Es geht hier nicht um das Sparen von Tastendrücken.

Außerdem geht es hier eigentlich um ?? und nicht so sehr um ? :.

herbivore

1.985 Beiträge seit 2004
vor 16 Jahren

Hallo herbivore,

danke für den Tipp. Den Operator kannte ich noch nicht.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

S
54 Beiträge seit 2007
vor 16 Jahren

@LonleyPixel

🙂 ne keine Ahnung hab es nicht ausprobiert 🙂

Ich bleib aufjedenfall im if-Team glaub das ?-Team wird diese Saison absteigen. 🙂

Also in den zwei Büchern die ich habe stand bisher noch nichts von ? und ?? und auch sonst kam mir das noch nicht unter. Aber ich bin ja auch noch eine C# Neugeborenes 🙂

Hatte mich nur interessiert, weil ich sehr viel if benutze, aber wenns damit nix zu tun hat will ich euch das glauben. =)

998 Beiträge seit 2007
vor 16 Jahren

Den kannte ich auch nicht, bisher in keinem Buch aufgetaucht. Auch wenn ich immo keine Anwendung dafür sehe, gut zu wissen 🙂
Nur Feaks hier... 😉

0
767 Beiträge seit 2005
vor 16 Jahren

@schnueggel

der ? : operator ist nicht für bedingte ausführung sondern für bedingte zuweisung, etwa wie wenn du schreiben könntest (pseudocode aus Amiga-E grins)

int a = 1;
string b = IF (a == 1) THEN "Hello World" ELSE "Hello Uncle Sam";

und eigentlich wärs auch lesbarer als ?... wurde halt aus C übernommen. ich würd oberes dem ? vorziehen wenns möglich wär. dann hätt man auch ein syntax highlightetes if else...

loop:
btst #6,$bfe001
bne.s loop
rts

3.971 Beiträge seit 2006
vor 16 Jahren

Ich bin im .Net BlogBook v3 über diese (tolle) "Abkürzung" gestoßen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

242 Beiträge seit 2006
vor 16 Jahren

🤔 weiss vielleicht jemand warum das nicht funktioniert:


...
        private int _X;
...
        public int X
        {
            get { return _X; }
            set { _X = _X ?? value; } //Hier tritt der Fehler auf
        }
...

Der Operator "??" kann nicht auf Operanden vom Typ "int" und "int" angewendet werden.

ich wollte eigentlich eine Variable machen, die einmal (von aussen) definiert werden kann und als ich diesen thread gesehen habe, dachte ich eigentlich müsste es mit dem ??-Operatoren doch gehen...^^

mfG b3nj

664 Beiträge seit 2005
vor 16 Jahren

Schau dir mal das Beispiel in der MSDN dazu an.

        private static int? _X;

public static int? X
{
    get { return _X; }
    set { _X = _X ?? value; } 
}
242 Beiträge seit 2006
vor 16 Jahren

...
Das Fragezeichen hinter der Typangabe macht aus einem "gewöhnlichen" Typen einen, der nullable ist.
... Philosophie für Fortgeschrittene: Ist Null gleich 0

=)thx, jetzt versteh ich den code =)

mfG b3nj

1.274 Beiträge seit 2005
vor 16 Jahren

Wow hab ich auch noch nicht gekannt, hab mir eine Generische Methode geschrieben, die das für mich mach, ala Access nz.

Danke für den Hinweis

Liebe Grüße
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

1.665 Beiträge seit 2006
vor 16 Jahren

Ich finde dass es eine tolle Abkürzung ist, als ich mitbekommen habe, dass es so etwas gibt: x != null ? "ok" : "fehler", dachte ich, cool. Schnelle Zeile Code und man kann schön erkennen was getan wird, wenn man weiß was das heißt.
Das war schon mal eine Abkürzung.
Aber ich glaube kaum dass ich das häufig verwenden werde, weil mir das doch zu kryptisch ist, es beim Lesen nicht eindeutig hervorgeht, was ?? macht.
Gibts diesen Operator auch außerhalb der C# Welt?

L
120 Beiträge seit 2007
vor 16 Jahren

HI,
is für mich auch neu.
hm... mal schaun ob der sich irgendwo verwenden lässt.

MfG,
Lecrell

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo JunkyXL,

❔ gibt es schon seit C.

?? ist in C# neu dazugekommen.

herbivore

1.665 Beiträge seit 2006
vor 16 Jahren

Dass es ? seit C oder zumnindest schon länger gibt, dachte ich mir so ziemlich, kennen tu ich es aber erst seit etwa einem Jahr.

Dennoch finde ich, dass ?? mh, naja.. wie gemütlich sollen es die C# Programmierer denn noch serviert bekommen 🙂 So denke ich nun über manche Neuerungen, wie diese, die praktisch sind, aber irgendwie fremd sind (

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo JunkyXL,

wenn man viel mit NullableTypes arbeitet, wird man die "Gemütlichkeit" zu schätzen wissen. Davon abgesehen ist es doch ein Nutzen, wenn eine Programmiersprache das Programmieren vereinfacht.

Sicher muss man beim Sprachdesign auch immer darauf achten, dass es zu keiner Inflation von Schlüsselworten und Operatorsymbolen kommt. Die Gefahr sehe ich allerdings hier nicht. Ich halte ?? für eine sinnvolle Ergänzung und durch die Nähe zu ❔ auch leicht zu merken.

herbivore

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

Mache mich gerade nochmal mit Operatoren & Co. vertraut, und da bin ich auf diesen Thread gestoßen.

Den Operator kannte ich bisher auch noch nicht.

Thx für die Info

Nobody is perfect. I'm sad, i'm not nobody 🙁

M
303 Beiträge seit 2006
vor 16 Jahren

Ich kannte den Operator auch nicht, finde ihn aber ziemlich geil, gerade bei der Auslesung assoziativer Listen ist er ziemlich nützlich. Danke herbivore

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo zusammen,

kennt jemand von euch eigentlich den Namen des Operators. Also der operator+ ist der Additions-Operator oder der operator>> ist der (Rechts)-Shift-Operator, aber wie heißt der ??-Operator?

In der :rtfm: Doku hat er keinen Namen (außer eben ??-Operator) und bei Google lässt sich so schlecht danach Suchen:

Google erkennt keine Sonderzeichen, wie Ausrufezeichen, Fragezeichen oder das Zeichen @. Diese Zeichentypen kommen so häufig vor, dass deren Berücksichtigung die Bereitstellung der Suchergebnisse erheblich verlangsamen würde.

herbivore

T
210 Beiträge seit 2006
vor 16 Jahren

Hallo!

Ich habe mir, als ich vor bald 2 Jahren in ein C#-Projekt reinrutschte zunächst das C#-Buch durchgelesen und dann noch im Internet nach Neuerungen gesucht und war begeistert von dem ??.
Sehr nützlich!

Was ich noch gerne hätte wäre folgende Erleichterung:


void MyMethod(object param)
{
  if (param == null) throw new ArgumentNullException("param");
  ...
}

hätte ich gerne vereinfacht in

void MyMethod(object !param)
{
  ...
}

oder so ähnlich.

Sprich: Ich hätte gerne die Möglichkeit einer Markierung von Parametern, die Aussagt, daß diese nicht null sein dürfen und wenn sie es doch sind eine ArgumentNullException geworfen wird, ohne das ich den Code Explizit schreiben muß.

Das spart zum einen Schreibarbeit und zum anderen kann ich, wenn ich mir die Definition einer Methode ansehe (was man ja ständig tut, wenn man Intellisense nutzt) direkt erkennen, ob ein Parameter auch null sein darf oder nicht und muß nicht erst die Doku lesen...

Gruß
T-Man

M
303 Beiträge seit 2006
vor 16 Jahren

Also ❔ nennt sich ternärer Operator.

T
210 Beiträge seit 2006
vor 16 Jahren

Also ❔ nennt sich ternärer Operator. Das geht auch nur, weil es der einzige ternäre (dreistellige) Operator ist.

Ich nenne ?? für mich "Not Null Operator"

6.862 Beiträge seit 2003
vor 16 Jahren

@ T-Man
Genau das wollt ich auch grad sagen 😉 Ist halt der einzige ternäre Operator, sonst würd er wohl auch anders heißen. Dann könnt man ?? auch binärer Operator schimpfen, nur gibts davon halt ne ganze Menge 😉

Aber naja, "Not Null" triffts ja nicht hundertprozentig - ich würd ihn eher "Default when Null" nennen, oder wenns nicht funktional beschreibend sein soll: "DQM(Double Question Mark) - Oder Deutsch: DFZ" gg Ich mag Abkürzungen 🙂

Baka wa shinanakya naoranai.

Mein XING Profil.

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo marco.b,

was T-Man sagt richtig ist, richtig: ternär (3) bezieht sich wie binär (2) und unär (1) nur auf die Anzahl der Argumente. Der ❔-Operator nennt man auch bedingte Bewertung, siehe Bitte Erklärung zu (...) ? ... : ...

Hallo T-Man,

[is] not null-Operator scheint aber schon durch SQL in einem etwas anderen Sinn belegt zu sein.

Hallo talla,

deine Namensvorschläge scheinen sich zumindest wenn man google trauen darf noch nicht durchgesetzt zu haben. 🙂

Hallo zusammen,

Ich nehme weiter gerne Namensvorschläge an. 🙂

herbivore

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo T-Man,

was die ArgumentNullException kann ich zwar nicht mit (object !param) dienen, aber doch zumindest mit einem Ansatz, bei dem man für die Prüfung keinen Code schreiben sondern nur ein Attribut angeben müsste:

[Artikel] Attribute zur Prüfung von Properties verwenden

Das ist zwar nicht ganz so kurz, wie dein Wunsch, aber sicher kürzer und übersichtlicher als die Prüfung in den Code zu schreiben.

Ok, ok, momentan ist der Code für Properties, aber vielleicht kann man den auch für Methoden-Parameter erweitern.

herbivore

6.862 Beiträge seit 2003
vor 16 Jahren

Original von herbivore
deine Namensvorschläge scheinen sich zumindest wenn man google trauen darf noch nicht durchgesetzt zu haben. 🙂

Dann lasst uns das gute Ranking von mycsharp bei google ausnutzen um für diesen Operator eine Bezeichnung zu prägen 😉 Zumindest ne deutsche, die englische C# Spec hat natürlich einen dafür :

The ?? operator is called the null coalescing operator.

Null(verschmelzender/vereinigender) Operator ?!?

Baka wa shinanakya naoranai.

Mein XING Profil.

T
210 Beiträge seit 2006
vor 16 Jahren

Hallo Herbivore,

mir geht es weniger um die Kürze, als vorallem darum, daß ich schon an der Definition erkenne, daß der Parameter nicht null sein darf.
Man kann IdR die Funktionsweise einer Methode an Ihrem Namen und den Namen der Parameter erraten. Das lesen der Doku kann man sich so oftmals sparen. Was aber häufig unklar ist, ist ob ein Parameter auch null sein darf. Vorallem wegen dieser Info muß ich häufig in die Doku sehen.
Ich habe z.B. Regex.IsMatch(...) zunächst intuitiv benutzt und bin davon ausgegangen, daß null wie ein Leerstring behandelt wird, was keider nicht so ist. Wären die Parameter entsprechend markiert hätte ich es gleich gesehen...

Was den Namen des ?? Operators angeht, würde ich sagen ist 'Default when null' nicht ganz so gut, das es ja nicht unbedingt ein Default-Wert ist den man da als zweites Argument angibt.

Vielleicht "Other when null" (kurz "own" für Akronymphile)?

Das "Not Null" nicht gut ist, ist mir klar, aber den habe ich mir auch nicht bewußt überlegt, der ist einfach in meinem Kopf entstanden und benutze ihn auch nicht wenn ich mit anderen kommuniziere.

1.378 Beiträge seit 2006
vor 16 Jahren

Ich kannte den Operator bislang auch noch nicht, denke aber nicht, dass er bei mir oft Verwendung finden wird. Genial wärs gewesen bei einem Ähnlichen Scenario. Nämlich wenn er auch bei DBNull.Value funktionieren würde.

0
767 Beiträge seit 2005
vor 16 Jahren

von der übersetzung her würde verschmelzung / vereinigung passen.

aber wie wärs mit "null-verwandlung" oder "null-transformation"? also null-transformations-operator. transformiert eine null ja auf was anderes.

loop:
btst #6,$bfe001
bne.s loop
rts

1.378 Beiträge seit 2006
vor 16 Jahren

von der übersetzung her würde verschmelzung / vereinigung passen.

aber wie wärs mit "null-verwandlung" oder "null-transformation"? also null-transformations-operator. transformiert eine null ja auf was anderes.

Macht doch im Prinzip nichts anderes als der ISNULL() Operator in SQL

T
210 Beiträge seit 2006
vor 16 Jahren

von der übersetzung her würde verschmelzung / vereinigung passen.

aber wie wärs mit "null-verwandlung" oder "null-transformation"? also null-transformations-operator. transformiert eine null ja auf was anderes. Sehr schön. null-transformations-operator gefällt mir bisher am besten.

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo zusammen,

wie wäre es denn einfach mit Nullwert-Operator. Kurz, knapp, einfach zu merken. Der Operator gibt ja Null einen Wert.

herbivore

6.862 Beiträge seit 2003
vor 16 Jahren

Schön kurz pägnant. Aber ich find das auch net eindeutig, klar gibt er dem Objekt das Null ist einen Wert, aber NullWert hört sich für mich eher nach nem Operator an der irgendwas nullt. Mag erstmal bissle sinnfrei erscheinen, aber in XAML z.B. gibts ja mit der Null Markup Extension etwas ähnliches weil "Null" in XAML halt net eindeutig ist ob man nun den String Null möchte oder das Objekt null zuweisen will.

Aber trotzdem finde ich des bisher als besten Vorschlag da schön kurz und an sich treffend wenn man weiß was der Operator macht.

Baka wa shinanakya naoranai.

Mein XING Profil.

0
767 Beiträge seit 2005
vor 16 Jahren

/signed
NullWert ist schön kurz.

loop:
btst #6,$bfe001
bne.s loop
rts

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

Also für meinen Geschmack passen sowohl "Null-Transformations-Operator" als auch "Nullwert-Operator".

Mein erster Gedanke war "Nichtnull-Rückgabe-Operator" 8o.

Nobody is perfect. I'm sad, i'm not nobody 🙁

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 11 Jahren

Hallo zusammen,

ich erlaube mir mal den Thread aufzuwecken (wer wissen will, worum es geht, sollte die ersten Beiträge auf Seite 1 lesen).

Wie mir in Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch aufgefallen ist (siehe PS), könnte man eigentlich auch einen ??= Operator gut gebrauchen, um statt

myString = myString ?? "";

einfacher, kürzer und DRY schreiben zu können

myString ??= "";

Scheint es aber leider nicht zu geben.

herbivore