我敢肯定,我们都曾编写过这样的代码:
For Each datVehicle In datVehicles
If datVehicle.ID = -1 Then
datVehicles.Remove(datVehicle)
End If
Next
哪个编译得很好,但会引发运行时异常,因为您无法删除枚举中的项目。ReSharper 能捕捉到这样的事情吗?
我认为它不会自动发生,但您可以轻松创建自定义模式来为您识别它。请参阅:https ://blog.jetbrains.com/dotnet/2010/08/19/highlighting-custom-patterns-with-resharper/
没有任何版本的 ReSharper 可以解决这个问题。创建可以警告这种情况的自定义模式并不容易,因为您的迭代代码可能非常复杂。
如果您想创建自定义模式,我建议您提出建议(可能是警告)。你的模式看起来像这样:
$ICOLLECTION$.Remove($arg$)
其中 $ICOLLECTION$ 是 System.Collections.Generic.ICollection 类型的表达式,$arg$ 是参数占位符。
这样,您将始终有建议(或警告)。
我知道这个问题仅与 ReSharper 有关,但我想展示解决方法来完成我的答案。此问题的解决方法是使用 RemoveAll。这是 C# 中的示例:
datVehicles.RemoveAll(x => x.Id == -1);
VS 2010 上的 Resharper 6.1 并没有开箱即用。Resharper 认为它不是 Skeet 代码,因为它建议转换为 linq。