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+用于提及代码契约