2011-12-10 20 views
1

我有這樣一段代碼:爲什麼TryGetValue取消分配我的字典?

Dictionary<string, object> tempDict = new Dictionary<string, object>(); 

if(xDicionary.TryGetValue(...., out tempDict) 
{ 
tempDict.Add(...); 
} 
else 
{ 
tempDict.Add(..); 
} 

如果代碼傳遞到其他塊,然後我和異常不能進行補充,因爲tempDict點爲空。這是爲什麼發生?我知道如何通過在else塊中分配新詞典以醜陋的方式繞過它,但是有沒有更好的方法來做到這一點?

+1

按設計。 TryGetValue()失敗,因此tempDict爲null。重新思考你的邏輯。 –

+0

雖然它將'out'參數設置爲'null',但它並未解除分配。 – delnan

+0

反正你不想要這個設計。你只想在你發現沒有的時候實例化新的字典,也就是在else子句中,否則只有在字典中已經存在的時候纔會浪費資源。 – jnm2

回答

3

因爲具有out參數的方法,必須爲指定一個值給out參數。這意味着當您致電xDicionary.TryGetValuetempDict總是被覆蓋,並且當沒有發現任何東西時,它被設置爲空。因此,在你的其他地方,tempDict總是爲空。

1

這就是TryGetValue的工作原理,因爲它使用了out參數。一個out參數總是在方法中分配一個值,所以無論您初始化參數,它都會被覆蓋。

documentation了這一點時指出:

此參數傳遞初始化。

所以你必須使用一個臨時的。

1

TryGetValue將返回false並將tempDict設置爲null如果它無法獲取該值。

這是因爲一個out參數必須被明確分配的方法中被調用,並且當值不能重試爲值類型,null邏輯默認到分配給它。

這是所有BCL TryGet*方法的正常語義。

0

因爲如果xDictionary不包含所請求的值,TryGetValue返回falseout值設置爲null。因此,當你嘗試Addnull時,你會得到NullReferenceException

0

你應該把tempDict = new ...放在else {}塊中。如果TryGetValue返回false,則不能依賴out參數中的值。

相關問題