2010-04-24 122 views
0

你喜歡哪一個編碼風格:空合併運算符或條件運算

object o = new object(); 
//string s1 = o ?? "Tom"; // Cannot implicitly convert type 'object' to 'string' CS0266 
string s3 = Convert.ToString(o ?? "Tom"); 
string s2 = (o != null) ? o.ToString() : "Tom"; 

S2或S3?

可以縮短嗎? s1顯然不起作用。

+0

感謝您的所有答案。我還應該包括,我正在尋找「是否o預期是一個字符串」。 – rkrauter 2010-04-24 16:52:51

回答

5

在這種情況下,我認爲我的偏好是:

string s1 = (string)o ?? "Tom"; 

或者:

string s1 = (o as string) ?? "Tom"; 

取決於是否o真的預計是一個string與否。無論哪種方式,我更喜歡這些,因爲他們更好地表達了正在做的事情,並且如果o已經是string,那麼不要通過不必要的轉換。


作爲一般規則,我更喜歡哪個更清楚和/或實際工作。當操作字符串,我常常需要寫這樣的事情,而不是:

string result = !string.IsNullOrEmpty(value) ? value : "Default"; 

...這真的不能在所有與空合併運算符來完成。在另一方面,如果我試圖凝聚了大量的值,它是更好的約500倍:

var result = firstTry ?? secondTry ?? thirdTry ?? fourthTry ?? fifthTry; 

嘗試編寫與三元運算符。

如果這種差異不是那麼戲劇化,如果它只是一行代碼中的幾個字符,那真的沒什麼關係,只要使用任何你喜歡的東西。

1

這也將工作,雖然在一根繩子上調用ToString感覺有點怪:

string s4 = (o ?? "Tom").ToString(); 
1

對於這種情況,我寧願使用三元運算符,因爲它表達的意圖更加清晰,避免了冗餘呼叫到Convert.ToString()。一般來說,如果轉換爲相同類型的對象,我寧願使用空合併運算符,例如

string s1 = null; 
string s2 = s1 ?? string.Empty; 
1

IMO,我傾向於使用:

var s = obj ?? "tom"; 

s是相同的類型obj而不使用Convert或任何其他類型的鑄造的。

然後,我用:

var s = obj != null 
    ? obj.ToString() 
    : "tom"; 

當我需要分配給左側前投或有一些其他類型的右側改造......

只是我的編碼風格, 我想。

1

我不喜歡。將對象轉換爲特定類型充滿了麻煩,它永遠不應該隱藏在表達式中。我更希望如果炸彈爆炸,那麼它就會在特定的聲明中這樣做。並且讓這個轉換正在完成的代碼閱讀器顯而易見。所以,在最低限度:

string s1 = o as string; 
string s2 = s1 ?? "Tom";