2013-03-13 23 views
3

我想的?=運算符有什麼優點或缺點?

result = result ?? defaultValue; 

相反,你可以寫

result ?= defaultValue; 

我並不是說這是一個好主意。
這個操作員有什麼優勢?
該操作員有什麼缺點?

+4

它會解決哪些問題? – 2013-03-13 23:06:47

+2

只有當你想混淆你的代碼。 – 2013-03-13 23:08:47

+0

確實+ =解決了一個問題? – Myster 2013-03-13 23:09:21

回答

0

我不認爲這是值得的。一般來說,你幾乎總是會這樣做:

result = someSourceValue ?? defaultValue; 

你的第二種形式是一種特殊情況,很少使用。

從某些源讀取值(如Web服務)時,null合併運算符最有用,並且您希望將缺失值強制爲零或其他默認值。數據幾乎總是來自某個地方,而去其他地方。

+1

作爲一個主持人,我真的很震驚,你很難回答這個問題。這顯然只是一個投票問題,而不是建設性的;這個問題可能沒有**答案**。它應該立即關閉。 – Yuck 2013-03-13 23:15:35

+6

恐怖。 。 。 – 2013-03-13 23:16:54

0

可能不是。我只在C#中少量使用過空合併運算符,並且從不這樣做。 C#做事的方式是編寫顯式的空檢查,而不是無所畏懼的分配。 (沒有冒犯性)

我確定很多人都想擁有這個操作符,但我認爲它不會對語言有所幫助。

這只是我的看法。

+0

當從某個源讀取值(如Web服務)時,null合併運算符非常有用,並且您希望將缺失值強制爲零或某些值。 – 2013-03-13 23:13:13

+0

我同意。很多人不理解''''或'?:'那麼爲什麼要添加'?='到混合中? – Yuck 2013-03-13 23:13:25

7

我看到的最大潛在優勢是它能夠提供其他複合運營商的相同優勢,如+=。考慮以下

Method().Field = Method().Field ?? someValue; 

如果Method()是昂貴的或有副作用,這些都會對這一說法進行了兩次。爲了防止這種情況發生,你就需要打破這種成2線

var temp = Method(); 
temp.Field = temp.Field ?? someValue; 

這可能是一個有點乏味,如果你陷在這個位置。如果?=+=具有相同的保證,即左側的副作用只發生一次,則此額外線路不是必需的。

Method().Field += someValue; // Method() happens once 
Method().Field ?= someValue; // Method() happens once 

IMHO,其是由具有超過簡單地???=一個運營商提供的關鍵優勢。這將是有價值的,但我不認爲這將是值得加入到

4

此之前已經提出的語言,我根據服用這種想法到了極點我2011年4月愚人節的博客文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/04/01/compound-assignment-part-two.aspx

與該帖子中提到的所有其他操作符不同,??=實際上會有點用處。沒有足夠的理由來證明其「直接」成本 - 設計和實施和記錄所有這些成本的時間和精力和金錢。它當然不能證明它的「機會」成本 - 花費在做一個相當愚蠢而不是特別有用的操作員上的時間,精力和金錢可能花費在直接解決開發人員實際遇到的實際問題的功能上。

相關問題