【问题标题】:Does ReSharper warn about dictionary keys?ReSharper 是否会警告字典键?
【发布时间】:2011-10-27 13:12:34
【问题描述】:

我们最近遇到了一个问题,我们调用字典来检索一个值,期望键存在。它不会导致进程中断。

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 如何知道您的数据库调用将产生什么值?
  • 更新了问题以及可能的解决方案...
  • 您是否还希望它在每次除以两个整数时发出警告,检查分母是否为零?您是否还希望它在您每次调用string.Substring 时向您发出警告,以检查参数是否在字符串的范围内?如果找不到密钥,获取Dictionary.Item 会抛出KeyNotFuondException 这一事实几乎不是什么秘密。有人可能会说 C# 开发人员应该知道,而不是被工具提醒...
  • 我认为这个功能可能很好,也许只是作为一个建议或提示。在获取值之前检查字典是否包含键比捕获KeyNotFoundException 要好得多

标签: c# resharper


【解决方案1】:

即使它可以(我不认为它可以),它只会警告您键 可能 不在字典中 - 就像它警告您一个对象可能为空。您仍然有责任添加代码以检查您是否认为有必要。

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

编辑:

由于 ReSharper 没有此功能,如果您真的需要它,您可以考虑使用新的 Roslyn API 自己编写它。有关如何编写代码分析器的示例,请参阅this article

【讨论】:

    【解决方案2】:

    我目前已安装 ReSharper 6,至少在我的设置下,它不会警告我在访问其值之前检查 DictionaryContainsKey

    【讨论】:

    • 谢谢,这正是我想知道的。
    【解决方案3】:

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

    在对字典进行任何操作之前,您可以检查字典以查看它是否具有您想要的值。

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

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

    【讨论】:

    • 我知道我可以检查字典以查看该值是否存在,我之后的警告是我没有这样做。
    • 改用 TryGetValue。这比先检查再获取要快。
    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2015-11-15
    • 1970-01-01
    • 2011-02-16
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多