我的代码我正在使用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
语句未满足,则执行下面的代码(例如,在发布模式下)
答案 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