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

时间:2008-10-02 17:24:28

标签: c# assert

我正在调试断点,我意识到断言调用?我以为它只适用于单元测试。它比断点更有用吗?既然我可以断点,我为什么要使用Assert?

9 个答案:

答案 0 :(得分:181)

在调试编译中,Assert将布尔条件作为参数,如果条件为false,则显示错误对话框。如果条件为真,程序将继续进行而不会中断。

如果您在发布中进行编译,则会自动忽略所有Debug.Assert

答案 1 :(得分:89)

来自Code Complete

  

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)

如果您正在运行“debug”构建而不是发布版本,

将仅触发中断。 这个行为有一个完整的例子here

答案 6 :(得分:6)

首先Assert()方法适用于TraceDebugDebug.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();

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

enter image description here

您会注意到在调试模式下,您的代码Debug.Assert语句失败,您会看到一个消息框,显示应用程序的当前堆栈跟踪。由于Trace.Assert()条件为真(i == 4)

,因此在发布模式下不会发生这种情况

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

答案 7 :(得分:3)

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

它可以防止有人以愚蠢的方式使用您的代码。但它也允许以愚蠢的方式进行生产,而不是向客户提供令人讨厌的消息(假设你构建了一个Release版本)。

答案 8 :(得分:3)

断言在设计合同(DbC)中占有重要地位,据我所知,Meyer,Bertand介绍/认可。面向对象的软件构建。

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

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

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

(即使我学习这种技术的OU Java课程只显示了简单的例子,其余的代码没有对大多数代码强制执行DbC断言规则,但是假设它被用来确保程序的正确性!)