2011-10-26 36 views
0

我們最近遇到了一個問題,我們調用一個字典來檢索一個值,期望密鑰存在。這不會導致流程中斷。ReSharper是否會警告字典密鑰?

ReSharper是否具有檢查此功能的功能,我聽說過它可以用於空對象?

這裏是爲了支持我所談論的例子:

Dictionary<String, Entity> allEntities = 
     new Dictionary<String, Entity>(SringComparer.OrdinalIgnoreCase); 

allEntities.AddMany(db.GetAllEntities()); 

Entity thisEntity = allEntities[entityID]; 
     // <-- error here as EntityID isn't in all entities... 

我想ReSharper的是能說我沒有查了字典,像這樣:

if (allEntities.ContainsKey(entityID)) 
    ... 

作爲僅供參考,我沒有ReSharper,但這是將所有開發人員都添加到商業案例中的一件事。

+3

您如何期待ReSharper知道您的數據庫調用會產生什麼值? –

+0

已更新的問題與可能的解決方案... – cjk

+0

您是否還希望每次分割兩個整數時都會警告您,以檢查分母是否爲零?你是否還希望每次調用'string.Substring'時都會發出警告,檢查參數是否在字符串的範圍內?如果沒有找到密鑰,那麼獲取'Dictionary.Item'會拋出'KeyNotFuondException'的事實不是祕密;有些人可能會說C#開發人員應該知道*,而不是被工具提醒...... – AakashM

回答

2

一個例子,我當前安裝了ReSharper 6,至少有我的設置,它不提醒我訪問它的值之前檢查與ContainsKey一個Dictionary

+0

謝謝,這就是我想知道的。 – cjk

2

Resharper是一個在編譯時使用的工具。它怎麼可能知道在運行時將在字典中放置什麼值?

在做任何事情之前,您可以查看字典是否具有所需的值。

Entity thisEntity; 
if (allEntities.TryGetValue(entityID, out thisEntity)){ 
    //DoStuff with thisEntity 
} 

或只使用if (allEntities.ContainsKey(entityID)){}

+0

我知道我可以檢查字典以查看該值是否存在,我之後發出的警告是我沒有這樣做。 – cjk

+1

改爲使用TryGetValue。它比首先檢查然後得到它快。 –

8

即使它可能(我不認爲它),所有它會做的是提醒你,關鍵可能無法在字典 - 剛就像它警告你,對象可能爲空。你仍然有責任在代碼中添加以檢查你是否認爲這是必要的。

我認爲如果這個功能告誡你關於你所做的每一個字典訪問,那麼這個功能將會比一個祝福更重要。然後你可以爭辯說,你希望它能夠警告你關於其他類型的集合訪問或任何可能拋出的異常。這裏的帶回家的消息是,你應該更多地依靠單元測試來捕捉這些問題,而不是靜態分析工具

編輯:

因爲ReSharper的不具備這個功能,如果你真的想要的話,你可以請考慮使用新的Roslyn API自己編寫它。見this article對於如何編寫代碼分析器