Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReSharper是否警告字典键?_C#_Resharper - Fatal编程技术网

C# ReSharper是否警告字典键?

C# ReSharper是否警告字典键?,c#,resharper,C#,Resharper,我们最近遇到了一个问题,我们调用了一个字典来检索一个值,希望键存在。这并没有导致进程中断 ReSharper是否具有像我听说的空对象检查功能那样检查这种情况 下面是一个例子来支持我所说的: Dictionary<String, Entity> allEntities = new Dictionary<String, Entity>(SringComparer.OrdinalIgnoreCase); allEntities.AddMany(db.GetAll

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

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

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
}