Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Kanntet ihr den ??-Operator? [null coalescing-Operator]
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
marco.b
myCSharp.de - Member



Dabei seit:
Beiträge: 303

beantworten | zitieren | melden

Ich kannte den Operator auch nicht, finde ihn aber ziemlich geil, gerade bei der Auslesung assoziativer Listen ist er ziemlich nützlich. Danke herbivore
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

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:
Zitat
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
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
marco.b
myCSharp.de - Member



Dabei seit:
Beiträge: 303

beantworten | zitieren | melden

Also nennt sich ternärer Operator.
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

beantworten | zitieren | melden

Zitat von marco.b
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"
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

@ 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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Zitat
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 :
Zitat
The ?? operator is called the null coalescing operator.

Null(verschmelzender/vereinigender) Operator ?!?
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

Zitat von 0815Coder
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
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

beantworten | zitieren | melden

Zitat von 0815Coder
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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

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

herbivore
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

/signed
NullWert ist schön kurz.
loop:
btst #6,$bfe001
bne.s loop
rts
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von herbivore
Scheint es aber leider nicht zu geben.
Doch - aber nur am 1.4.: Eric Lippert: Compound Assignment, Part Two
private Nachricht | Beiträge des Benutzers