C #-Assert ()方法是做什么的? 它还有用吗?

我正在使用断点进行调试,并且我实现了断言调用?我以为它只用于单元测试。除了断点,它还能做什么?既然可以断点,为什么要使用 Assert?

188162 次浏览

在调试编译中,Assert接受布尔条件作为参数,并在条件为 false 时显示错误对话框。如果条件为真,则程序不会中断。

如果你在发行版中编译,所有的 Debug.Assert都会被自动删除。

Assert 允许您断言应用于代码中的条件(post 或 pre)。这是一种记录您的意图的方法,如果您的意图没有得到满足,调试器将通过对话框通知您。

与断点不同,Assert 与代码一起使用,可用于添加有关您的意图的其他详细信息。

断言可以帮助您在测试和发布之间提供单独的消息传递行为,

Debug.Assert(x > 2)

只有在运行“调试”构建而不是发布构建时才会触发中断。 这里有这种行为的完整例子 < a href = “ http://en.cSharp-online.net/Assert”rel = “ noReferrer”>

当你不想每一行代码都要断点检查变量时,你应该使用它,但是如果出现某些情况,你确实需要得到一些反馈,例如:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Assert 还为您提供了另一个机会,让您对微软的 UI 设计技能发笑。我的意思是: 一个有三个按钮的对话框,即“中止”、“重试”、“忽略”,以及如何在标题栏中解释它们的说明!

来自 代码完成

8防御性编程

8.2声称

断言是在开发过程中使用的代码,通常是一个例程 或宏ーー它允许程序在运行时自我检查 断言为 true,这意味着一切都按预期运行。 如果为 false,则表示它在 例如,如果系统假设客户信息 档案不会有超过50,000条记录,该程序可能 包含记录数小于或等于的断言 至50,000。只要记录的数量小于或等于 50,000,断言将保持沉默。如果遇到超过 50,000张唱片,然而,它将大声“断言”有一个 程序中的错误。

断言在大型、复杂的程序和 在高可靠性程序中。它们使程序员能够更快地 清除不匹配的接口假设、修改代码时出现的错误等等。

一个断言通常有两个参数: 一个布尔表达式 描述了这个假设应该是正确的 如果不是就显示出来。

(...)

通常,您不希望用户在 产品代码; 断言主要用于开发期间 断言通常编译到代码中 开发时间,并编译出生产代码 发展,断言冲洗出矛盾的假设, 意外情况、传递给例程的错误值等等。 在生产过程中,它们是从代码中编译出来的,以便 断言不会降低系统性能。

我认为它是 Debug。断言是一种建立关于如何调用方法的契约的方法,重点是关于参数值的细节(而不仅仅是类型)。例如,如果不应该在第二个参数中发送 null,那么应该在该参数周围添加 Assert,以告诉使用者不要这样做。

它可以防止有人愚蠢地使用你的代码。但是它也允许这种愚蠢的方式进入生产环境,而不会给客户带来不好的消息(假设您构建了一个发布版本)。

断言在契约式设计(DbC)中占有重要地位,据我所知,它是由 Meyer,Bertand 引入/认可的。一九九七年。面向对象的软件构建。

一个重要的特性是,它们不能产生副作用,例如,你可以处理一个异常,或者使用 if 语句(防御性编程)采取不同的行动。

断言被用来检查合同的前/后条件,客户/供应商关系-客户必须确保供应商的前提条件得到满足,例如发送5和供应商必须确保后条件得到满足,例如发送12朵玫瑰。 (只需简单解释客户/供应商-可以接受更少,交付更多,但关于断言)。 C # 还引入了 Trace.Assert () ,它可以用于发布代码。

要回答这个问题,是的,他们仍然有用,但可以增加代码的复杂性 + 可读性和时间 + 难以维护。 - 我们还要用吗?-是的, 我们都会使用它们吗? 可能不会,或者不会达到迈耶所描述的程度。

(甚至我学习这项技术的 OU Java 课程也只是展示了一些简单的例子,剩下的代码并没有在大多数代码上强制执行 DbC 断言规则,而是被假定用来确保程序的正确性

首先,Assert()方法可用于 TraceDebug类。
Debug.Assert()仅在调试模式下执行。
Trace.Assert()正在调试和发布模式下执行。 < br >

这里有一个例子:

        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();

在调试模式下运行此代码,然后在发布模式下运行。

enter image description here

您将注意到,在调试模式下,代码 Debug.Assert语句失败,您将得到一个显示应用程序当前堆栈跟踪的消息框。在发布模式下不会发生这种情况,因为 Trace.Assert()条件为真 (i == 4)

WriteLine()方法只是提供了将信息记录到 VisualStudio 输出的选项。 enter image description here