C# – Assert()方法是做什么的? 它仍然有用吗?
我正在debugging断点,我意识到断言调用? 我认为这只是unit testing。 它比断点还有什么作用呢? 既然我可以断点,为什么我应该使用断言?
在debugging编译中, Assert
将布尔条件作为参数,如果条件为false,则显示错误对话框。 如果条件成立,程序就不会中断。
如果你在Release中编译,所有的Debug.Assert
被自动忽略。
从代码完成
8防守编程
8.2断言
一个断言是在开发过程中使用的代码 – 通常是一个例程或macros – 允许程序在运行时检查自己。 当一个断言是真实的,这意味着一切都按预期运作。 当它是错误的,这意味着它已经检测到代码中的意外错误。 例如,如果系统假定客户信息文件永远不会有超过50,000条logging,则程序可能包含断言logging数小于或等于50,000的断言。 只要logging数小于或等于5万,断言就会保持沉默。 如果遇到超过50,000条logging,则会大声“声明”程序中有错误。
断言在大型复杂程序和高可靠性程序中特别有用。 它们使程序员能够更快速地消除不匹配的接口假设,修改代码时出现的错误等等。
一个断言通常需要两个参数:一个布尔expression式,描述假设是假的假设,如果不是假的,则显示一条消息。
(……)
通常情况下,您不希望用户在生产代码中看到断言消息; 断言主要用于开发和维护过程中。 断言通常在开发时编译到代码中,并编译成生产代码。 在发展过程中,断言消除了相互矛盾的假设,意外的情况,传递给日常事务的不良价值,等等。 在生产过程中,它们是从代码中编译的,所以断言不会降低系统性能。
当你不想断开每一行代码来检查variables时,你应该使用它,但是如果存在某些情况,你确实想得到某种反馈,例如:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
Assert也给了你另一个笑话,微笑着用户界面devise技巧。 我的意思是:带有三个button中止,重试,忽略的对话框,以及如何在标题栏中解释它们的解释!
Assert允许你声明一个条件(post或pre)适用于你的代码。 这是一种logging你的意图的方式,如果你的意图不符合,让debugging器通过对话框通知你。
与断点不同的是,Assert与您的代码一起使用,可以用来添加关于您的意图的更多细节。
断言可以帮助您在testing和发布之间给出单独的消息传递行为。 例如,
Debug.Assert(x > 2)
只会触发一个中断,如果你正在运行一个“debugging”构build,而不是一个发布版本。 这里有一个完整的例子
我想到的方法是Debug.Assert是一种方法来build立一个方法应该如何被调用的合同,侧重于关于参数(而不是仅仅是types)的值的细节。 例如,如果您不应该在第二个参数中发送空值,请在该参数周围添加Assert以告知消费者不要这样做。
它可以防止有人使用你的代码在头脑中的方式。 但是,它也允许这种骨头的方式进行生产,而不是给客户一个坏消息(假设你构build了一个Release版本)。
devise合同(DbC)中的断言很重要,据我所知,这是由Meyer,Bertand引入/认可的。 面向对象的软件构造。
一个重要的特点是不能产生副作用,例如你可以用if语句(防御性编程)处理exception或采取不同的行动。
断言用于检查合同的前/后条件,客户/供应商关系 – 客户必须确保符合供应商的前提条件。 发送£5,供应商必须确保满足后续条件。 交付12朵玫瑰。 (只是简单的解释客户端/供应商 – 可以接受更less,交付更多,但关于断言)。 C#还引入了Trace.Assert(),它可以用于发布代码。
要回答这个问题,他们仍然是有用的,但可以增加复杂性+可读性到代码和时间+难以维护。 我们还应该使用它们吗? 是的,我们都会用它们吗? 可能不会,或者不像迈尔所描述的那样。
(即使是我学习这种技术的OU Java课程,也只是展示了一些简单的例子,其余的代码并没有在大部分代码上强制执行DbC声明规则,但是被假定用来保证程序的正确性!
首先, Assert()
方法可用于Trace
和Debug
类。
Debug.Assert()
仅在debugging模式下执行。
Trace.Assert()
正在Debug和Release模式下执行。
这里是一个例子:
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();
以debugging模式运行此代码,然后以释放模式运行。
您会注意到,在debugging模式下,您的代码Debug.Assert
语句失败,您会看到一个消息框,显示应用程序的当前堆栈跟踪。 由于Trace.Assert()
条件为真(i == 4)
所以在发行模式中不会发生这种情况。
WriteLine()
方法只是给你一个将信息logging到Visual Studio输出的选项。