2010-02-24 11 views
7

Jeder kennt mindestens zwei gemeinsame C# Idiome einschließlich coalesce Betreiber:Gemeinsame C# idiome einschließlich coalesce ?? Betreiber

ein Singleton ein:

return _staticField = _staticField ?? new SingletonConstructor(); 

und eine Kette ein:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType); 

es ist lesbar, konsistente, lohnt sich der Einsatz und erkennbar im Code.

Aber leider ist das alles. Manchmal muss es erweitert oder geändert werden. Manchmal benutze ich sie, wenn ich einen bestimmten Fall sehe - und immer zögere ich, es zu benutzen, weil ich nicht weiß, ob irgendein anderer Programmierer es wirklich leicht lesen wird.

Kennen Sie noch andere? Ich würde gerne spezifischere Verwendungen haben: z.B. Asp.net, EF, LINQ, alles - wo Zusammenwachsen ist nicht nur akzeptabel, sondern auch bemerkenswert.

+1

Es scheint mir, dass alle Verwendungen des Null-Koaleszenz-Operator sind nur Sonderfälle Ihres " Kette eins ". –

+0

immer noch sind alle Fälle mehr oder weniger speziell oder allgemein. Programmieren bedeutet für mich, den Unterschied auszugleichen und zu fühlen. Coalesce ist ein Sonderfall von 'if' Aussage, nicht wahr? und Schalter - Fall ist ein besonderer, also was - um sie zu entfernen? – rudnev

+1

So implementieren Sie kein lazy-instanziiertes Singleton. Auch wenn Sie aus Platzgründen in dieser Frage einfach einen 'lock'-Block weggelassen haben, dient dieser nur dazu, den Code zu verschleiern. – Aaronaught

Antwort

6

Für mich, wo es zu SQL übersetzt von selbst gut genug ist:

from a in DB.Table 
select new { 
      a.Id, 
      Val = a.One ?? a.Two ??a.Three 
      } 

Der in COALSCE auf der Datenbankseite resultierende machen für enorm cleanen SQL in den meisten Fällen gibt es einfach nicht großartige Alternative. Wir verwenden Oracle, ich würde lieber nicht lesen, obwohl Nvl(Nvl(Nvl(Nvl( Schachteln danke ... Ich nehme meine COALSCE und laufe damit.

ich es auch so für Eigenschaften verwenden, nur persönlichen Geschmack Ich denke:

private string _str; 
public string Str { 
    get { return _str ?? (_str = LoaderThingyMethod()); } 
} 
4

Der Grund, dass die Null-koaleszierenden Operator C# 2.0 eingeführt wurde, war ein Weg, um Standardwerte zuweisen nullable types und wandeln so einfach einen nullfähigen Typ in einen nicht nullbaren Typ um. Ohne ?? würde jede Umwandlung eine lange if Anweisung erfordern. Das folgende Zitat aus MSDN genommen:

Ein Nullable Type einen Wert enthalten kann, oder es kann nicht definiert werden. Das ?? Der Operator definiert den Standardwert , der zurückgegeben wird, wenn ein nullwertfähiger Typ einem nicht nullfähigen Typ zugewiesen ist. Wenn Sie versuchen, einen nullbaren Wert Typ zu einem nicht nullbaren Wert Typ zuzuweisen, ohne das zu verwenden? Operator, Sie wird einen Fehler bei der Kompilierung generieren. Wenn Sie eine Umwandlung verwenden und der Nullwert nicht definiert ist, wird eine InvalidOperationException-Ausnahme ausgelöst.

Sie könnten die folgende Vereinfachung „bemerkenswert“ betrachten:

int? x = null; 
int y = x ?? -1; 

Statt

int? x = null; 
int y = -1; 

if (x.HasValue) 
{ 
    y = x.Value; 
} 
+0

Ja, ich hätte angeben sollen, dass eine Kette normalerweise Nullables ist. Danke. – rudnev

+0

Der Null-Koaleszenz-Operator wurde tatsächlich in C# 2.0 eingeführt, nicht in 3.0 (wie in NULL-Typen) –

+0

@Thomas Levesque: Sie haben recht, ich stehe richtig. –