我刚刚在我的程序中发现了一个错误(经过一些调试和撕裂我的头发)
bool first = true;
foreach (RdAbstractNode node in listNodes)
{
if (!first)
{
// do stuff (does not change first)
}
// do more stuff (does not change first)
}
正如您所见first
总是true
- 永远不会改变。因此if(!first)
基本上是if(false)
虽然编译器设置为级别4(最高级别),但编译器未生成警告。
如何找到类似的if(false)
错误?
我正在使用VS 2010,.Net 4.0编译器,项目设置.Net 2.0
答案 0 :(得分:13)
使用Resharper,你会收到类似这样的警告
答案 1 :(得分:10)
我不知道可以帮助您的编译器功能 - 您需要进行单元测试。
答案 2 :(得分:1)
我同意Resharper是一个很好的工具,但我想补充一点,我认为这证明了不使用这个结构的原因。
替代方案可能是:
修改强>
//.net 4.0
var firstNode = listNodes.First();
//do something special for first.
foreach(var node in listNodes.Skip(1))
{
//do something for the rest.
}
//.net 2.0
using (IEnumerator<RdAbstractNode> enumerator = listNodes.GetEnumerator();)
{
if (!enumerator.MoveNext())
return;
RdAbstractNode first = enumerator.Current;
//do something with first
while(enumerator.MoveNext())
{
RdAbstractNode currentNode = enumerator.Current;
//do something with the node.
}
}
我们经常发现自己需要对第一个元素进行某种特殊处理,有时最好更改逻辑并使所有处理均匀。 如果我们不能,那么我总是更喜欢将特殊情况处理与其余元素分开,而不是嵌套它。
答案 3 :(得分:0)
编译器会根据if语句中的常量值警告您显而易见的事情,例如无法访问的代码 - 例如“if(false)”。但是,因为变量可以被改变,所以不幸的是在这种情况下不会这样做。