2010-02-24 12 views
7

Każdy zna przynajmniej dwa wspólne C# idiomów tym operatora zlewają:Typowe idiomy C#, w tym koalesce? Operator

Singleton jeden:

return _staticField = _staticField ?? new SingletonConstructor(); 

i jeden łańcuch:

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

to czytelne, spójne, warto skorzystać i rozpoznawalny w kodzie.

Ale, niestety, to wszystko. Czasami będzie wymagać rozszerzenia lub zmiany. Czasami używam ich, gdy widzę konkretny przypadek - i zawsze waham się go używać, ponieważ nie wiem, czy którykolwiek z programistów naprawdę to przeczyta.

Czy znasz jakieś inne? Chciałbym mieć więcej konkretnych zastosowań: np. Asp.net, EF, LINQ, cokolwiek - gdzie koalescencja jest nie tylko akceptowalna, ale godna uwagi.

+1

Wydaje mi się, że wszystkie zastosowania zerowej operatora koalescencyjnego to tylko szczególne przypadki z twoich " jeden łańcuch ". –

+0

nadal wszystkie sprawy są mniej lub bardziej wyjątkowe lub ogólne. dla mnie sztuka programowania polega na równoważeniu i odczuwaniu różnicy. coalesce jest szczególnym przypadkiem stwierdzenia "jeśli", czyż nie? i przełącznik - sprawa jest wyjątkowa, więc co - aby je usunąć? – rudnev

+1

To nie jest sposób implementacji leniwie tworzonego singletonu. Nawet jeśli po prostu pominąłeś blokadę "blokady" w celu zwięzłości w tym pytaniu, to tylko służy to zaciemnianiu kodu. – Aaronaught

Odpowiedz

6

Dla mnie, gdzie to przekłada się na SQL jest wystarczająco dobra sama:

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

To skutkuje COALSCE na stronie bazy danych sprawia ogromnie czystszego SQL w większości przypadków po prostu nie ma żadnego świetna alternatywa. Używamy Oracle, wolałbym nie czytać, ale dziękuję ... wezmę mój COALSCE i uruchomię go.

ja również użyć go do właściwości takich jak ta, tylko gustu Chyba:

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

tego powodu, że operator null koalescencyjny został wprowadzony w C# 2.0 było mieć sposób przypisywania wartości domyślne nullable types i w ten sposób łatwo przekonwertować typ nullby na typ nie podlegający zerowaniu. Bez żadnej konwersji wymagałaby długiej instrukcji if. Poniższy cytat pochodzi z MSDN:

pustych typu może zawierać wartość, lub może być niezdefiniowana. The ?? Operator definiuje wartość domyślną na , która zostanie zwrócona, gdy typ z wartością zerową to przypisany do typu nienależącego do pustego adresu. Jeśli próbujesz przypisać wartość zerową o numerze do wartości nieanulowalnej typu bez użycia znaku ?? operator, ty wygeneruje błąd podczas kompilacji. Jeśli używa się rzutowania, a wartość zerowania jest obecnie niezdefiniowana, zostanie zgłoszony wyjątek InvalidOperationException wyjątek .

Można rozważyć następujące uproszczenia „niezwykłe”:

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

zamiast

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

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

Tak, powinienem był określić, że łańcuch zwykle jest o zerach. Dziękuję Ci. – rudnev

+0

Operator koalescencji zerowej został wprowadzony w C# 2.0, a nie 3.0 (tak samo jak typy zerowane) –

+0

@Thomas Levesque: Masz rację, ja się poprawiam. –