我正在调试断点,我意识到断言调用?我以为它只适用于单元测试.它比断点更有用吗?既然我可以断点,我为什么要使用断言?
Pat*_*ins 192
在调试编译中,Assert
将布尔条件作为参数,如果条件为false,则显示错误对话框.如果条件为真,程序将继续进行而不会中断.
如果你在Release中编译,那么所有Debug.Assert
的都会被自动省略.
jua*_*uan 93
从代码完成
8防御性编程
8.2断言
断言是在开发期间使用的代码 - 通常是例程或宏 - 允许程序在运行时检查自身.当断言为真时,这意味着一切都按预期运行.当它为假时,这意味着它已在代码中检测到意外错误.例如,如果系统假定客户信息文件永远不会有超过50,000条记录,则程序可能包含一条断言,即记录数量小于或等于50,000.只要记录数小于或等于50,000,断言就会保持沉默.但是,如果它遇到超过50,000条记录,它将大声"断言"程序中存在错误.
断言在大型复杂程序和高可靠性程序中特别有用.它们使程序员能够更快地清除不匹配的接口假设,修改代码时出现的错误,等等.
断言通常需要两个参数:一个布尔表达式,用于描述假定应该为true的假设,以及一个要显示的消息(如果不是).
(......)
通常,您不希望用户在生产代码中看到断言消息; 断言主要用于开发和维护期间.断言通常在开发时编译到代码中,并从代码中编译生产.在开发过程中,断言会清除相互矛盾的假设,意外情况,传递给例程的错误值等等.在生产过程中,它们是从代码中编译出来的,因此断言不会降低系统性能.
the*_*sdj 38
当你不想断断每一小段代码来检查变量时,你应该使用它,但是如果存在某些情况你确实希望获得某种反馈,例如:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
Run Code Online (Sandbox Code Playgroud)
Joe*_*Joe 14
断言还为您提供了另一个机会,可以轻松地嘲笑微软的UI设计技巧.我的意思是:一个带有三个按钮的对话框Abort,Retry,Ignore,以及如何在标题栏中解释它们的说明!
Jef*_*tes 10
Assert允许您断言条件(post或pre)适用于您的代码.这是记录您的意图的一种方式,如果您的意图不符合,调试器会通过对话通知您.
与断点不同,Assert与您的代码一起使用,可用于添加有关您的意图的其他详细信息.
首先,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();
Run Code Online (Sandbox Code Playgroud)
在调试模式下运行此代码,然后在发布模式下运行.
您会注意到在调试模式下,您的代码Debug.Assert
语句失败,您将看到一个消息框,显示应用程序的当前堆栈跟踪.由于Trace.Assert()
条件为真,因此在发布模式下不会发生这种情况(i == 4)
.
WriteLine()
方法只是为您提供了将信息记录到Visual Studio输出的选项.
小智 5
断言在契约设计 (DbC) 中占有重要地位,据我所知,它是由 Meyer, Bertand 引入/认可的。1997. 面向对象的软件构造。
一个重要的特性是它们不能产生副作用,例如您可以使用 if 语句处理异常或采取不同的行动方案(防御性编程)。
断言用于检查合同的前/后条件、客户/供应商关系 - 客户必须确保满足供应商的先决条件,例如。发送 5 英镑,供应商必须确保满足后置条件,例如。送出 12 朵玫瑰。(只是对客户/供应商的简单解释 - 可以接受更少并提供更多,但关于断言)。C# 还引入了 Trace.Assert(),可用于发布代码。
要回答这个问题,是的,它们仍然有用,但会增加代码的复杂性+可读性和时间+难以维护。我们还应该使用它们吗?是的,我们都会使用它们吗?可能不会,或者不会达到迈耶描述的程度。
(即使是我学习这项技术的 OU Java 课程也只展示了简单的示例,其余代码并未对大多数代码强制执行 DbC 断言规则,而是假定用于确保程序正确性!)
归档时间: |
|
查看次数: |
146767 次 |
最近记录: |