C# ReSharper是否警告字典键?
我们最近遇到了一个问题,我们调用了一个字典来检索一个值,希望键存在。这并没有导致进程中断 ReSharper是否具有像我听说的空对象检查功能那样检查这种情况 下面是一个例子来支持我所说的:C# ReSharper是否警告字典键?,c#,resharper,C#,Resharper,我们最近遇到了一个问题,我们调用了一个字典来检索一个值,希望键存在。这并没有导致进程中断 ReSharper是否具有像我听说的空对象检查功能那样检查这种情况 下面是一个例子来支持我所说的: Dictionary<String, Entity> allEntities = new Dictionary<String, Entity>(SringComparer.OrdinalIgnoreCase); allEntities.AddMany(db.GetAll
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,但这将是在业务案例中添加的另一件事情,以便为所有开发人员提供它。ReSharper是编译时使用的工具。它怎么可能知道在运行时哪些值将被放入字典中 在使用字典做任何事情之前,你可以先检查字典,看看它是否有你想要的值
Entity thisEntity;
if (allEntities.TryGetValue(entityID, out thisEntity)){
//DoStuff with thisEntity
}
或者只使用if(allenties.ContainsKey(entityID)){}
即使它可以(我不认为它可以),它所做的只是警告您键可能不在字典中,就像它警告您对象可能为空一样。您仍然有责任添加代码来检查是否有必要
我认为,如果这样一个功能警告您每一次访问字典,那么它将是一种负担,而不是一种祝福。然后,您可能会争辩说,您希望它警告您任何其他类型的集合访问或任何可能引发的异常。这里的要点是,您应该更多地依赖单元测试来捕获此类问题,而不是静态分析工具
编辑:
由于ReSharper没有这个功能,如果您真的想要它,您可以考虑使用新的API自己编写它。有关如何编写代码分析器的示例,请参见。我目前已安装ReSharper 6,至少使用我的设置,它不会警告我在访问其值之前检查
字典
和ContainsKey
。您希望ReSharper如何知道您的数据库调用将产生什么值?更新了问题并提供了可能的解决方案…您是否希望它在每次除以两个整数时警告您,检查分母是否为零?您是否希望它在每次调用string.Substring
时警告您,以检查参数是否在字符串的范围内?如果找不到密钥,获取Dictionary.Item
会抛出keynotfuondeception
这一事实几乎不是什么秘密;有人可能会说,C#开发者应该知道这一点,而不是被工具提醒……我认为这个特性可能很好,也许只是一个建议或提示。在获取值之前检查字典是否包含键要比捕获KeyNotFoundException
好得多。我知道我可以检查字典以查看值是否存在,但我得到的警告是我没有这样做。请改用TryGetValue。这比先检查然后拿到要快。谢谢,这就是我想知道的。
Entity thisEntity;
if (allEntities.TryGetValue(entityID, out thisEntity)){
//DoStuff with thisEntity
}