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()方法可用于TraceDebug类。
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输出的选项。 在这里输入图像说明