2010-02-18 11 views
8

Powiel możliwe:
What is the “??” operator for?Co oznacza symbol <??> w języku C# .NET?

widziałem linię kodu, który Zjednoczone -

return (str ?? string.Empty).Replace(txtFind.Text, txtReplace.Text); 

Chcę poznać dokładne znaczenie tej linii (tj ?? część) ..

+0

Zawsze akceptowałem to jako zastępstwo, ale nigdy tak naprawdę nie rozumiałem w pełni, skąd pochodzi ono ode mnie; –

+1

duplikat http://stackoverflow.com/questions/827454/what-is-the-operator-for – tanascius

+0

Szczegóły w sekcji 7.12 specyfikacji. –

Odpowiedz

19

To jest null coalescing operator: zwraca pierwszy argument, jeśli ma wartość inną niż null, a drugi - inaczej. W twoim przykładzie do zamiany pustych ciągów na puste ciągi służy zasadniczo str ?? string.Empty.

Jest to szczególnie przydatne przy pustych typów, gdyż pozwala domyślna wartość należy określić:

int? nullableInt = GetNullableInt(); 
int normalInt = nullableInt ?? 0; 

Edit:str ?? string.Empty mogą być zapisane pod względem operatora warunkowego jako str != null ? str : string.Empty. Bez operatora warunkowego, trzeba by użyć bardziej gadatliwy if, np:

if (str == null) 
{ 
    str = string.Empty; 
} 

return str.Replace(txtFind.Text, txtReplace.Text); 
+0

Czy możesz wyjaśnić 'str ?? string.Empty' ze szczegółową składnią? Mam na myśli zastąpienie tej linii szczegółową składnią. :) –

+0

Mam to .. Thanx .. :) –

4

to odpowiednik Na przykład:

+0

W tym konkretnym przypadku jest, ale jeśli podstawisz dowolne wyrażenie dla "str", staje się ono bardziej skomplikowane - ponieważ wyrażenie zostanie ocenione tylko raz. –

+0

Nigdy nie użyłem operatora koalescencji zerowej w jakichkolwiek ustawieniach innych niż proste, więc nie jestem pewien co masz na myśli. Czy mógłbyś podać przykład tego, o czym mówisz? –

+1

Co Jon robi, to jeśli powiesz F()? G(), który nie jest ** dokładnie równoważny ** do (F() == null? G(): F()), ponieważ rzecz ta wywołuje F() dwukrotnie. W rzeczywistości bardziej przypomina to wykonywanie niejawnego temp = F(), a następnie obliczanie temp == null? G(): temp. I faktycznie to też nie jest w porządku, ponieważ rzeczy stają się skomplikowane w zależności od dokładnych typów dwóch boków operatora. Możliwe, że wstawiamy tu również odlewy. –

9

To się nazywa null coalescing operator. To pozwala warunkowo wybrać pierwszą wartość niezerową z łańcucha:

string name = null; 
string nickname = GetNickname(); // might return null 
string result = name ?? nickname ?? "<default>"; 

Wartość w result będzie albo wartość nickname jeśli nie jest null lub "<default>".

1
str ?? String.Empty 

można zapisać jako:

if (str == null) { 
    return String.Empty; 
} else { 
    return str; 
} 

lub potrójnego stwierdzeniem:

str == null ? str : String.Empty; 
+0

Jak Jon Skeet dodał do wcześniejszej odpowiedzi, twoje oświadczenie jest tylko równoważne w prostych przypadkach - wyrażenie 'str' jest oceniane tylko raz przy użyciu operatora' ?? '. – Broam

3

The ?? operator mówi, że zwraca mi wartość inną niż null. Tak więc, jeśli masz następujący kod:

string firstName = null; 

string personName = firstName ?? "John Doe"; 

Powyższy kod powróci „John Doe”, ponieważ wartość firstName jest null.

To wszystko!