当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#-Assert()方法有什么作用?它还有用吗?》经验,为你挑选了7个好方法。

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



1> Patrick Desj..:

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

如果你在Release中编译,那么所有Debug.Assert的都会被自动省略.


断言不是救生艇,它们是冰山探测系统.由于用户没有操纵船只,因此释放代码中的断言只是告诉他们他们注定要失败; 它不会让他们避开冰山.
国际海事组织,从发布代码中省略断言就像在停靠时进行救生艇演习,然后在航行时将救生艇留在后面.:)
Trace.Assert for release mode显然是参考:http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.assert.aspx http://msdn.microsoft.com/en-us/library/ e63efys0.aspx
如何在Release模式下获得Debug.Assert的相同行为?
@HamishGrubijan你为什么要在发布模式下使用`Debug.Assert`?
关于何时使用其中一个,请参阅[此答案](http://stackoverflow.com/a/5031211/533837) - 我同意这一点.简而言之,断言主要是测试_your自己的假设_,在_your自己的代码中进行,包括但不限于私有函数调用,以找到你在代码中出错的地方_.例外情况是任何人都可以调用的方法中的假设,例如,由第三方提供的代码调用的公共方法,或者当某些事情出错时_无论假设是否正确(例如网络错误).
但是在你知道问题的时候早点失败似乎更好; 不那么混乱.但在那种情况下,我猜测抛出错误或使用代码合同会更好.Trace.Assert也适用于生产代码,但确实使用包含友好消息的重载,并注意用户可以忽略错误.
我喜欢将'Assert`视为对类固醇的评论.1)将您的假设传达给未来的程序员(包括您自己)是一种简洁的方式; 2)它对Release没有性能影响; 3)与传统评论相比,它变得陈旧的可能性要小得多.

2> juan..:

从代码完成

8防御性编程

8.2断言

断言是在开发期间使用的代码 - 通常是例程或宏 - 允许程序在运行时检查自身.当断言为真时,这意味着一切都按预期运行.当它为假时,这意味着它已在代码中检测到意外错误.例如,如果系统假定客户信息文件永远不会有超过50,000条记录,则程序可能包含一条断言,即记录数量小于或等于50,000.只要记录数小于或等于50,000,断言就会保持沉默.但是,如果它遇到超过50,000条记录,它将大声"断言"程序中存在错误.

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

断言通常需要两个参数:一个布尔表达式,用于描述假定应该为true的假设,以及一个要显示的消息(如果不是).

(......)

通常,您不希望用户在生产代码中看到断言消息; 断言主要用于开发和维护期间.断言通常在开发时编译到代码中,并从代码中编译生产.在开发过程中,断言会清除相互矛盾的假设,意外情况,传递给例程的错误值等等.在生产过程中,它们是从代码中编译出来的,因此断言不会降低系统性能.



3> thelsdj..:

当你不想断断每一小段代码来检查变量时,你应该使用它,但是如果存在某些情况你确实希望获得某种反馈,例如:

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


@JoshDesmond`System.Diagnostics`

4> Joe..:

断言还为您提供了另一个机会,可以轻松地嘲笑微软的UI设计技巧.我的意思是:一个带有三个按钮的对话框Abort,Retry,Ignore,以及如何在标题栏中解释它们的说明!


中止/重试/忽略是经典的!它是否曾经导致Windows 3.1一直显示这个断言?
@Joe这是应该只有开发人员才能看到的东西,而不是最终用户,所以更新它可能是一个极低优先级的项目.如果烦恼,可以修改Debug.Listeners或Trace.Listeners集合,将默认处理程序替换为任何您想要的处理程序.
好吧,现在是2019年,相同的对话框/按钮仍在这里!

5> Jeff Yates..:

Assert允许您断言条件(post或pre)适用于您的代码.这是记录您的意图的一种方式,如果您的意图不符合,调试器会通过对话通知您.

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



6> Ryan..:

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

Debug.Assert(x > 2)

如果您正在运行"调试"构建而不是发布版本,则只会触发中断.这个行为有一个完整的例子在这里



7> Serge Volosh..:

首先,Assert()方法可用于TraceDebug类.
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).

WriteLine() 方法只是为您提供了将信息记录到Visual Studio输出的选项. 在此输入图像描述

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有