c#:查找错误:if(false)

时间:2011-04-20 13:29:19

标签: c# visual-studio-2010 debugging

我刚刚在我的程序中发现了一个错误(经过一些调试和撕裂我的头发)

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

4 个答案:

答案 0 :(得分:13)

使用Resharper,你会收到类似这样的警告

enter image description here

答案 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)”。但是,因为变量可以被改变,所以不幸的是在这种情况下不会这样做。