ReSharper是否正确处理Debug.Assert(..)?

时间:2013-01-31 14:15:09

标签: c# debugging resharper assert

我的代码我正在使用System.Function方法Debug.Assert(..)来验证方法开头的输入参数(请参阅下面的示例代码剪切):

public class TestClass : IInterface
{
}

public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Debug.Assert((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // ReSharper (Version 7.1.1) marks here "Expression is always false
        if (!(objectToVerify is TestClass))
        {
           return;
        }

        // do something ...
     }
  }

如果我注释掉Debug.Assert语句,则ReSharper警告会消失。 在我看来,ReSharper必须忽略此Debug.Assert语句,因为如果Debug.Assert语句未满足,则执行下面的代码(例如,在发布模式下)

你有什么看法?或者有其他实现方法吗?

4 个答案:

答案 0 :(得分:9)

不,我认为resharper错了,原因很简单: Resharper说当我们知道事实并非如此时,代码无法访问。

发布版本将始终执行该代码,如果在对话框中单击“忽略”,调试版本将会点击它。

如果在断言是否是错误之后继续,那么它仍然不是无法访问的代码。

答案 1 :(得分:2)

如果Debug.Assert()不是objectToVerify,ReSharper很聪明地知道TestClass会停止执行。因此,if语句中的表达式确实始终为false(否则首先不会达到if语句。)

您可以通过编写以下内容来解决警告:

public static void Verify(IInterface objectToVerify)
{
    if (!(objectToVerify is TestClass))
    {
        Debug.Assert(false, "Passed object must be type of TestClass");
        return;
    }

    // do something ...
}

答案 2 :(得分:0)

我读了一个Debug.Assert,因为“这个表达式false永远不会发生”。 Resharper警告与该用途一致。它只是相信你的断言。当你的语句的then部分执行时,你的程序就会出错。

但是您在公共API的调试时使用它进行参数验证。我不会为此使用断言。在这种情况下你应该抛出异常,并消除你的if(...)return

答案 3 :(得分:0)

您可以使用Code Contracts

代码看起来像这样 -

  public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Contract.Requires<ArgumentException>((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // do something ...
     }
  }

在调试和发布模式下工作。阅读更多here