5

我的代码我正在使用该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

5 回答 5

9

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

如果您在对话框中单击忽略,发布构建将始终执行该代码,并且调试构建将命中它。

在断言之后继续是否是错误并不重要,它仍然不是无法访问的代码。

于 2013-05-30T08:33:25.210 回答
2

ReSharper 足够聪明,知道Debug.Assert()如果objectToVerify不是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 ...
}
于 2013-01-31T14:43:38.250 回答
1

老问题,但我刚刚遇到了这个问题,并通过切换HeuristicUnreachableCode解决了它(从外观上看) :

Debug.Assert(false, "type/fieldNum not processed");
// ReSharper disable HeuristicUnreachableCode
return null;
// ReSharper restore HeuristicUnreachableCode
于 2016-12-08T09:07:09.353 回答
0

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

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

于 2013-01-31T14:49:03.867 回答
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 ...
     }
  }

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

于 2013-01-31T14:55:00.883 回答