应该自由使用Debug.Assert和Debug.Fail,它们应该留在生产代码中吗?

ric*_*ard 17 .net c# debugging assertions

我正在读一本断言的书(双关语)"你应该Debug.Assert在任何条件总是真或假的情况下用方法加载你的代码."

我没有使用过这两种调试方法,但它有一定道理.但是,我不愿意在我的生产代码库中散布这些东西.

思考?

Mar*_*ell 37

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

Debug.Assert(SomethingImportantThatMustExecute());
Run Code Online (Sandbox Code Playgroud)

糟糕 - SomethingImportantThatMustExecute在发布时会被忽略; 你必须使用:

bool result = SomethingImportantThatMustExecute()
Debug.Assert(result);
Run Code Online (Sandbox Code Playgroud)

基本上,避免调用条件方法和部分方法时的副作用.


Jon*_*eet 11

这取决于你使用它的是什么.如果你在自己的方法中使用它进行断言,为了确保它们正常工作,我认为没关系 - 但我更喜欢单元测试来验证我能想到的一切.

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

if (foo == null)
{
    throw new ArgumentNullException("foo");
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这种行为不应仅仅因为你正在运行发布代码改变.