我正在调试断点,我意识到断言调用?我以为它只适用于单元测试。它比断点更有用吗?既然我可以断点,我为什么要使用Assert?
答案 0 :(得分:181)
在调试编译中,Assert
将布尔条件作为参数,如果条件为false,则显示错误对话框。如果条件为真,程序将继续进行而不会中断。
如果您在发布中进行编译,则会自动忽略所有Debug.Assert
。
答案 1 :(得分:89)
8防御性编程
8.2断言
断言是在开发过程中使用的代码 - 通常是例程 或宏 - 允许程序在运行时自行检查。当一个 断言是真的,这意味着一切都按预期运作。 当它为假时,这意味着它已检测到意外错误 码。例如,如果系统假定客户信息 该程序可能永远不会有超过50,000条记录 包含一个断言记录数小于或等于的断言 到50,000。只要记录数小于或等于 50,000,断言将是沉默。如果遇到的话多于 但是,它会大声“断言”有一条记录 程序中的错误。
断言在大而复杂的程序中特别有用 在高可靠性计划中。它们使程序员能够更快地完成任务 清除不匹配的接口假设,修改代码时出现的错误,等等。
断言通常需要两个参数:布尔表达式 描述了应该是真实的假设和消息 如果不是则显示。
(...)
通常,您不希望用户看到断言消息 生产代码;断言主要用于开发期间 和维护。断言通常编译到代码中 开发时间并编译出生产代码。中 发展,断言消除了矛盾的假设, 意外情况,传递给例程的错误值,等等。 在生产过程中,它们是从代码中编译出来的 断言不会降低系统性能。
答案 2 :(得分:37)
当你不想断断每一小段代码来检查变量时,你应该使用它,但是如果某些情况存在,你确实希望获得某种反馈,例如:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
答案 3 :(得分:11)
Assert还为您提供了另一个轻松了解微软UI设计技巧的机会。我的意思是:一个带有三个按钮的对话框Abort,Retry,Ignore,以及如何在标题栏中解释它们的说明!
答案 4 :(得分:9)
Assert允许您在代码中声明条件(post或pre)。这是记录您的意图的一种方式,如果您的意图不符合,调试器会通过对话通知您。
与断点不同,Assert与您的代码一起使用,可用于添加有关您的意图的其他详细信息。
答案 5 :(得分:9)
Assert可以帮助您在测试和发布之间提供单独的消息传递行为。例如,
Debug.Assert(x > 2)
将仅触发中断。 这个行为有一个完整的例子here
答案 6 :(得分:6)
首先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)
。
答案 7 :(得分:3)
我认为它的方式是Debug.Assert是一种建立关于如何调用方法的契约的方法,重点关注有关参数值(而不仅仅是类型)的细节。例如,如果您不应该在第二个参数中发送null,则在该参数周围添加Assert以告知消费者不要这样做。
它可以防止有人以愚蠢的方式使用您的代码。但它也允许以愚蠢的方式进行生产,而不是向客户提供令人讨厌的消息(假设你构建了一个Release版本)。
答案 8 :(得分:3)
断言在设计合同(DbC)中占有重要地位,据我所知,Meyer,Bertand介绍/认可。面向对象的软件构建。
一个重要的特征是它们不能产生副作用,例如你可以使用if语句处理异常或采取不同的行动(防御性编程)。
断言用于检查合同的前/后条件,客户/供应商关系 - 客户必须确保满足供应商的前提条件,例如。发送5英镑,供应商必须确保满足后置条件,例如。提供12朵玫瑰。 (只是对客户/供应商的简单解释 - 可以接受更少并提供更多,但关于断言)。 C#还引入了Trace.Assert(),它可以用于发布代码。
回答问题是,它们仍然有用,但可以增加代码和时间的复杂性+可读性+难以维护。 我们还应该使用它们吗?是, 我们都会用它们吗?可能不是,或者不是Meyer所描述的程度。
(即使我学习这种技术的OU Java课程只显示了简单的例子,其余的代码没有对大多数代码强制执行DbC断言规则,但是假设它被用来确保程序的正确性!)