我们最近遇到了一个问题,我们调用字典来检索值,期望密钥存在。它并没有导致进程中断。
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,但这将是另外一个添加到业务案例中以便为所有开发人员提供它的东西。
答案 0 :(得分:8)
即使它可以(我不认为它会这样做),它只会警告你,键可能不在字典中 - 就像它警告你一个对象一样可能为空。您仍有责任在代码中添加以检查您是否认为有必要。
如果它警告你关于你所做的每一个字典访问,我认为这样的功能将是一种负担而不仅仅是一种祝福。然后你可以争辩说你希望它警告你关于所有其他类型的集合访问或任何可能被抛出的异常。这里的回家消息是,您应该更多地依靠单元测试来捕获这些问题而不是静态分析工具
编辑:
由于ReSharper没有此功能,如果您真的需要它,您可以考虑使用新的Roslyn API自行编写。有关如何编写代码分析器的示例,请参阅this article
答案 1 :(得分:2)
Resharper是编译时使用的工具。怎么可能知道在运行时将哪些值放在字典中?
您可以检查字典,看看它是否具有您想要的值,然后再使用它。
Entity thisEntity;
if (allEntities.TryGetValue(entityID, out thisEntity)){
//DoStuff with thisEntity
}
或只使用if (allEntities.ContainsKey(entityID)){}
答案 2 :(得分:2)
我目前安装了ReSharper 6,至少在我的设置下,它不会警告我在访问其值之前检查Dictionary
ContainsKey
。