2011-04-04 36 views
1

它是可以使用的情況??操作,這樣的:使用空合併與屬性或調用方法

string str = collection["NoRepeate"] ?? null; // Will not compile 
          //because collection["NoRepeate"] is object 

這裏的問題是,它是不能分配collection["NoRepeate"]這是objectstrcollection["NoRepeate"].ToString()當它的值爲空時拋出異常。

我現在使用條件運算?:

str = collection["NoRepeate"].HasValue ? collection["NoRepeate"].ToString() : null 

但問題是重複的常量字符串。

+1

對於第一條語句:如果'collection [「NoRepeate」]是非空的,那麼'??零「部分被忽略。如果它是空的,那麼它已經是'空'了,所以'??空'是多餘的。 – kennytm 2011-04-04 16:11:48

+0

我同意KennyTM。在null合併運算符中放置'null'是沒有意義的。該運算符的目的是查找第一個非空值。我會認爲只是字符串str =集合[「NoRepeate」];將是你想要的。 – 2011-04-04 16:24:30

+0

'collection [「NoRepeate」]'是對象,我寫道這不會編譯。 – Homam 2011-04-04 16:29:06

回答

3

我同意你的看法,這不能在一個陳述中完成。空合併運算符在這裏沒有幫助。

我知道的最短的需要兩條語句。

object obj = collection["NoRepeate"]; 
string str = obj == null ? null : obj.ToString(); 
0

是的,如果返回的值爲null,那麼這是非常可能的。如果返回的值是「」,則不。我一直使用它的空值來分配默認值。

+0

爲什麼downvote不愛? – jcolebrand 2011-04-04 17:07:56

+0

還要注意並非所有東西都可以爲空(如果'object'應該可以爲空) – jcolebrand 2011-04-04 17:09:11

1

我的解決辦法是:

var field = "NoRepeate"; 

var str = collection[field].HasValue ? collection[field].ToString() : null; 

當然,如果你沒有primitive obsessions你可以添加一個方法集合類您這樣做。否則,你可能不得不堅持使用擴展方法。

+1

這樣做並不理想,因爲它需要兩次進入字典,這可能很昂貴。 – Talljoe 2011-04-04 16:19:48

+0

我以爲這就是爲什麼你使用字典 - 基於鍵的查找是爲了便宜 – 2011-04-05 08:11:36

+0

他們是,但他們不是免費的。一個字符串必須每次計算其哈希碼,然後字典必須選擇合適的存儲桶,然後它通過比較每個字符串的存儲桶,直到它找到匹配。它比蠻力搜索更快,但不是魔法。 – Talljoe 2011-04-05 16:03:43

1

是否從集合中返回的對象實際上是Nullable<object>?否則,你可能想明確地檢查空:

var item = collection["NoRepeate"]; 
string str = (item == null) ? null : item.ToString(); 
+0

'item == null'和'!item.HasValue'有什麼區別? – Homam 2011-04-04 16:17:43

+0

由於Nullable具有T是結構的約束,因此不可能使用可空的。 – BrandonAGr 2011-04-04 16:34:35

+0

@BrandonAGr:良好的通話,編輯。 – 2011-04-04 17:10:42

1

你可以做到以下幾點:

string str = (string) collection["NoRepeate"] ?? null; 

這是假設的對象實際上是一個字符串,但。如果不是,你會得到一個運行時錯誤。其他解決方案更強大。

儘管如此,儘可能縮短這一點並沒有什麼實際意義。你應該讓你的代碼可讀,而不是「我能寫多少?」

相關問題