C# Debug.Assert和Debug.Fail是否应该自由使用,是否应该保留在生产代码中?

C# Debug.Assert和Debug.Fail是否应该自由使用,是否应该保留在生产代码中?,c#,.net,debugging,assertions,C#,.net,Debugging,Assertions,我正在读一本书,书中断言(双关语)你应该用Debug.Assert方法加载你的代码,不管你的条件是真是假 我还没有使用这两种调试方法,但它有一定的意义。然而,我讨厌在我的生产代码库中到处乱扔这些东西 想法?如果编译发布版本(使用Visual Studio项目设置),所有Debug.Assert语句将自动删除。所以,是的,可以自由地使用它们。您可以在生产代码库中自由地使用Debug.Assert调试。断言用条件属性修饰。如果您在“realease”配置中编译代码,编译器将跳过调用Debug.Ass

我正在读一本书,书中断言(双关语)你应该用
Debug.Assert
方法加载你的代码,不管你的条件是真是假

我还没有使用这两种调试方法,但它有一定的意义。然而,我讨厌在我的生产代码库中到处乱扔这些东西


想法?

如果编译发布版本(使用Visual Studio项目设置),所有
Debug.Assert
语句将自动删除。所以,是的,可以自由地使用它们。

您可以在生产代码库中自由地使用
Debug.Assert
<代码>调试。断言用
条件属性
修饰。如果您在“realease”配置中编译代码,编译器将跳过调用
Debug.Assert

这很好,因为编译器在发布版本中忽略了它。这是一种不错的做法,您不需要从源代码中删除它们(实际上,您可能不应该这样做)。但是你必须小心:

Debug.Assert(SomethingImportantThatMustExecute());
坏的-发布时必须执行的
某些重要内容将被忽略;您必须使用:

bool result = SomethingImportantThatMustExecute()
Debug.Assert(result);

基本上,避免在调用条件方法和部分方法时产生副作用。

这取决于您使用它的目的。如果您在自己的方法中使用它来进行断言,以确保它们正常工作,我认为这是可以的——但是如果可能的话,我更喜欢使用单元测试来验证我所能想到的一切

使用它来验证传入的输入(例如参数)不是一个好主意(IMO)。在这种情况下,我认为以正常方式使用异常更为一致:

if (foo == null)
{
    throw new ArgumentNullException("foo");
}

在我看来,这种行为不应该仅仅因为您正在运行发布代码而改变。

是的,断言是可以的。请注意,它们不仅是逻辑检查(这是显而易见的),而且还是一种文档形式,比注释更可靠

但是一定要事先考虑单元测试。如果您要测试调试构建,那么结果(关于错误逻辑)可能与您的发布版本不同

对于要在发布版本中处于活动状态的检查,可以使用Trace.Assert()


还没有人提到,这是一种更丰富、更结构化的检查和记录代码的方法

我知道这会删除它们(删除所有符号),但我想知道这是丑陋的还是不好的做法。理查德·德斯隆德:不,事实上,这是一种很好的做法,只要它能帮助你开发出好的代码。1+用于提及代码契约