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]
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

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

beantworten | zitieren | melden

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

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

beantworten | zitieren | melden

Rhetorische Antwort: Ja ;-)
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de
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 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
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

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.
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
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 )
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von winSharp93 am .
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

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

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 333
Herkunft: Erlangen

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 54
Herkunft: Neustadt an der Weinstrasse

beantworten | zitieren | melden

Ich kannte ihn nicht

ganz nett aber ich bleib bei if das sieht man besser

8)
private Nachricht | Beiträge des Benutzers
LonelyPixel
myCSharp.de - Member



Dabei seit:
Beiträge: 333
Herkunft: Erlangen

beantworten | zitieren | melden

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.
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 LonelyPixel,
Zitat
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
private Nachricht | Beiträge des Benutzers
Schnueggel
myCSharp.de - Member



Dabei seit:
Beiträge: 54
Herkunft: Neustadt an der Weinstrasse

beantworten | zitieren | melden



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



Dabei seit:
Beiträge: 333
Herkunft: Erlangen

beantworten | zitieren | melden

Zitat von Schnueggel


a=b ? lalala:tralala;
tralala wird nie ausgeführt. Weißt du auch warum?
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 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
private Nachricht | Beiträge des Benutzers
Fabian
myCSharp.de - Member

Avatar #avatar-1590.jpg


Dabei seit:
Beiträge: 1.985
Herkunft: Dortmund

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 54
Herkunft: Neustadt an der Weinstrasse

beantworten | zitieren | melden

@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. =)
private Nachricht | Beiträge des Benutzers
DavidT
myCSharp.de - Member

Avatar #avatar-3073.png


Dabei seit:
Beiträge: 998
Herkunft: Winterberg

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

@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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von 0815Coder am .
loop:
btst #6,$bfe001
bne.s loop
rts
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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

Avatar #avatar-2528.gif


Dabei seit:
Beiträge: 242
Herkunft: CH;SG

beantworten | zitieren | melden

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
        }
...
Zitat
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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von B3nj am .
private Nachricht | Beiträge des Benutzers
langalaxy
myCSharp.de - Member

Avatar #avatar-1914.gif


Dabei seit:
Beiträge: 664

beantworten | zitieren | melden

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; } 
}
private Nachricht | Beiträge des Benutzers
B3nj
myCSharp.de - Member

Avatar #avatar-2528.gif


Dabei seit:
Beiträge: 242
Herkunft: CH;SG

beantworten | zitieren | melden

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

Avatar #avatar-1696.jpg


Dabei seit:
Beiträge: 1.274
Herkunft: Österreich

beantworten | zitieren | melden

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

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 120
Herkunft: KT

beantworten | zitieren | melden

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

MfG,
Lecrell
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 JunkyXL,

gibt es schon seit C.

?? ist in C# neu dazugekommen.

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

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

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 (
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 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
private Nachricht | Beiträge des Benutzers