c#:查找bug:if(false)

c#:查找bug:if(false),c#,visual-studio-2010,debugging,C#,Visual Studio 2010,Debugging,我刚刚在我的程序中发现了一个bug(经过大量的调试和修改) 如您所见,第一个始终是真的——从未更改。所以,if(!first)基本上是if(false) 编译器没有生成警告,尽管它被设置为级别4(最高级别) 如果(false)错误,我如何找到类似的错误 我正在使用VS 2010、.Net 4.0编译器,项目设置.Net 2.0我不知道有什么编译器功能可以帮助您-您需要进行单元测试。使用它,您会收到类似这样的警告 编译器会警告您一些明显的事情,例如基于if语句中的常量值的无法访问的代码,例如“if

我刚刚在我的程序中发现了一个bug(经过大量的调试和修改)

如您所见,第一个始终是真的——从未更改。所以,
if(!first)
基本上是
if(false)

编译器没有生成警告,尽管它被设置为级别4(最高级别)

如果(false)错误,我如何找到类似的
错误


我正在使用VS 2010、.Net 4.0编译器,项目设置.Net 2.0

我不知道有什么编译器功能可以帮助您-您需要进行单元测试。

使用它,您会收到类似这样的警告


编译器会警告您一些明显的事情,例如基于if语句中的常量值的无法访问的代码,例如“if(false)”。但是,由于变量可以更改,因此在这种情况下,它将无法正常工作。

我同意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.
    } 
}
/.net 4.0
var firstNode=listNodes.First();
//先做些特别的事情。
foreach(listNodes.Skip(1)中的var节点)
{
//为剩下的做点什么。
}
//.NET2.0
使用(IEnumerator枚举器=listNodes.GetEnumerator();)
{
如果(!enumerator.MoveNext())
返回;
RdAbstractNode first=枚举数.Current;
//先做点什么
while(枚举数.MoveNext())
{ 
RdAbstractNode currentNode=枚举器.Current;
//对节点执行一些操作。
} 
}
我们经常发现自己需要对第一个元素进行某种特殊的处理,有时最好改变逻辑,使所有处理统一起来。
如果我们不能,那么我总是喜欢将特殊情况处理与其他元素清楚地分开,而不是嵌套它。

您的
//do stuff
可以做一些可以先翻转
的事情,但是我看到Resharper显示了关于总是错误或正确的东西的警告,
//do more stuff
必须是翻转变量的那一个。编译器会对未赋值的变量发出警告。它确实知道一个变量是否有一个常量值。但是它甚至没有对
if(false)
@Simon Ottenhaus发出警告:未分配的变量与这里的非常不同。如果我有一个if(false)块,其中包含代码,我会收到编译警告。如果其中只有一条注释,编译器似乎正在优化块,而没有发出警告。我同意@dahlbyk的观点:您可能希望使用代码覆盖率分析或静态分析器。如果你想知道为什么这不是一个警告,这篇文章可能有助于:+1推荐Resharper。对于一些人来说,这是一个昂贵的附加组件,但在这样的例子中它是非常宝贵的。有什么免费的吗?或者我只需要花42欧元来获得学术许可证吗?@Pretzel:“无价的”是一个延伸。R#是甜蜜的,但单元测试是免费的,并且会捕捉到逻辑错误R#会错过。请注意,如果你把
放在第一位=!第一,在“//do more stuff”之后,ReSharper足够聪明,可以停止警告您。mm..没有注意到这一点-但可以通过长(er)方式完成:
var enumerator=listNodes.GetEnumerator();枚举数。MoveNext();var first=枚举数。当前值;虽然(enumerator.MoveNext()){//使用enumerator.Current}
执行某些操作,但请注意,
IEnumerator
应该被释放。如果合适,您应该处理第一个
MoveNext()
调用返回
false
。谢谢@dahlbyk-添加了缺少的处理
//.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.
    } 
}