ReSharper是否警告字典键

本文关键字:字典 警告 是否 ReSharper | 更新日期: 2023-09-27 18:12:20

我们最近遇到了一个问题,我们调用了一个字典来检索一个值,期望键存在。这并没有导致流程中断。

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,但这将是添加到商业案例中的另一件事,为所有开发人员提供它。

ReSharper是否警告字典键

即使它可以(我认为它不会(,它所能做的就是警告你键可能不在字典中,就像它警告你对象是null一样。您仍然有责任添加代码来检查您是否认为有必要添加代码。

我认为,如果这样一个功能能提醒你每一次字典访问,那将是一种负担,而不是一种祝福。然后,您可能会争辩说,您希望它警告您所有其他类型的集合访问或任何可能引发的异常。这里要传达的信息是,您应该更多地依靠单元测试来发现这些问题,而不是静态分析工具

编辑:

由于ReSharper没有这个功能,如果你真的想要它,你可以考虑用新的Roslyn API自己编写。有关如何编写代码分析器

的示例,请参阅本文

我目前已经安装了ReSharper 6,至少根据我的设置,它不会警告我在访问其值之前用ContainsKey检查Dictionary

Resharper是编译时使用的工具。它怎么可能知道在运行时会将哪些值放入字典?

你可以先检查字典,看看它是否有你想要的值,然后再使用它

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

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