2010-10-13 20 views
9

我想我記得在C#中看到類似於?: ternary operator的東西,它只有兩個部分,如果它不是空值,將返回變量值,如果是則返回默認值。事情是這樣的:C#中的合併操作符?

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default"; 

基本上這相當於:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default"; 

難道這樣的事情存在,還是我只是想象看到了這個地方?

+1

可能的重複 - > http:// stackoverflow。com/questions/463155/how-do-ternary-operator-work – 2010-10-13 16:14:31

+3

@Junior但這是關於三元運算符,而這是關於合併運算符(儘管標題) – Rup 2010-10-13 16:16:18

+1

@Junior,而我的問題的標題是如果你閱讀我的問題,你會發現它與你建議的重複無關。 – 2010-10-13 16:19:41

回答

3

滑稽你用 「 - 一類算這裏??」,因爲你正在尋找的運營商 「??」,即:

tb_MyTextBox.Text = o.Member ?? "default"; 

http://msdn.microsoft.com/en-us/library/ms173224.aspx

+1

呵呵,一定是我的潛意識伸手。知道我曾在某處看過它。 – 2010-10-13 16:15:22

17

嗯,這是不太一樣的conditional operator,但我想你想的null coalescing operator的(??)。 (我猜你確實說過它是「相似的」:)請注意,「三元」只是指運算符的操作數的數量 - 所以當條件運算符是三元運算符時,空合併運算符是二元運算符。

它廣泛地採用這種形式:

result = first ?? second; 

這裏second如果first爲null,將只進行評估。例如,它不一定是賦值的目標 - 您可以使用它來評估方法參數。

請注意,第一個操作數已將設爲空 - 但第二個操作數沒有。雖然圍繞轉換有一些具體細節,但在簡單情況下,整體表達式的類型是第二個操作數的類型。由於關聯性,可以整齊地堆疊操作的用途太:

int? x = GetValueForX(); 
int? y = GetValueForY(); 
int z = GetValueForZ(); 

int result = x ?? y ?? z; 

注意如何xy是空的,但zresult都沒有。當然,z可能爲爲空,但result也必須爲空。

基本上,操作數將按它們在代碼中出現的順序進行評估,評估在找到非空值時停止。

呵呵,雖然上面是以數值類型來表示的,但它也適用於參考類型(它們是總是可爲空)。