我正在调试断点,我意识到断言调用?我以为它只适用于单元测试.它比断点更有用吗?既然我可以断点,我为什么要使用断言?
在调试编译中,Assert
将布尔条件作为参数,如果条件为false,则显示错误对话框.如果条件为真,程序将继续进行而不会中断.
如果你在Release中编译,那么所有Debug.Assert
的都会被自动省略.
从代码完成
8防御性编程
8.2断言
断言是在开发期间使用的代码 - 通常是例程或宏 - 允许程序在运行时检查自身.当断言为真时,这意味着一切都按预期运行.当它为假时,这意味着它已在代码中检测到意外错误.例如,如果系统假定客户信息文件永远不会有超过50,000条记录,则程序可能包含一条断言,即记录数量小于或等于50,000.只要记录数小于或等于50,000,断言就会保持沉默.但是,如果它遇到超过50,000条记录,它将大声"断言"程序中存在错误.
断言在大型复杂程序和高可靠性程序中特别有用.它们使程序员能够更快地清除不匹配的接口假设,修改代码时出现的错误,等等.
断言通常需要两个参数:一个布尔表达式,用于描述假定应该为true的假设,以及一个要显示的消息(如果不是).
(......)
通常,您不希望用户在生产代码中看到断言消息; 断言主要用于开发和维护期间.断言通常在开发时编译到代码中,并从代码中编译生产.在开发过程中,断言会清除相互矛盾的假设,意外情况,传递给例程的错误值等等.在生产过程中,它们是从代码中编译出来的,因此断言不会降低系统性能.
当你不想断断每一小段代码来检查变量时,你应该使用它,但是如果存在某些情况你确实希望获得某种反馈,例如:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
断言还为您提供了另一个机会,可以轻松地嘲笑微软的UI设计技巧.我的意思是:一个带有三个按钮的对话框Abort,Retry,Ignore,以及如何在标题栏中解释它们的说明!
Assert允许您断言条件(post或pre)适用于您的代码.这是记录您的意图的一种方式,如果您的意图不符合,调试器会通过对话通知您.
与断点不同,Assert与您的代码一起使用,可用于添加有关您的意图的其他详细信息.
断言可以帮助您在测试和发布之间提供单独的消息传递行为.例如,
Debug.Assert(x > 2)
如果您正在运行"调试"构建而不是发布版本,则只会触发中断.这个行为有一个完整的例子在这里
首先,Assert()
方法可用于Trace
和Debug
类.
Debug.Assert()
仅在调试模式下执行.
Trace.Assert()
正在调试和发布模式下执行.
这是一个例子:
int i = 1 + 3; // Debug.Assert method in Debug mode fails, since i == 4 Debug.Assert(i == 3); Debug.WriteLine(i == 3, "i is equal to 3"); // Trace.Assert method in Release mode is not failing. Trace.Assert(i == 4); Trace.WriteLine(i == 4, "i is equla to 4"); Console.WriteLine("Press a key to continue..."); Console.ReadLine();
在调试模式下运行此代码,然后在发布模式下运行.
您会注意到在调试模式下,您的代码Debug.Assert
语句失败,您将看到一个消息框,显示应用程序的当前堆栈跟踪.由于Trace.Assert()
条件为真,因此在发布模式下不会发生这种情况(i == 4)
.
WriteLine()
方法只是为您提供了将信息记录到Visual Studio输出的选项.