首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >抛出异常vs Contract.Requires<T>?

抛出异常vs Contract.Requires<T>?
EN

Stack Overflow用户
提问于 2013-02-21 07:08:21
回答 2查看 7.3K关注 0票数 18

我想知道我是应该抛出异常还是应该调用Contract.Requires

例如:

代码语言:javascript
复制
public static void Function(String str)
{
    if (str == null) throw new ArgumentNullException("str", "Input string cannot be null.");

    // ...
}

vs

代码语言:javascript
复制
public static void Function(String str)
{
    Contract.Requires<ArgumentNullException>(str != null, "Input string cannot be null.");

    // ...
}

因为Contract.Requires不需要CONTRACTS_FULL符号,所以我也可以将它保留在我的发布版本中。

这是我的考虑:

缺点:您不能调用自定义异常类型构造函数的重载版本。根本没有办法将额外的参数传递给构造函数。

专业版:静态工具支持(例如,通知调用者违反合同)。

我应该使用哪一个,以及在什么样的情况下?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-27 06:28:18

if-then-throwRequires<TException>之间的基本权衡,如CodeContract用户指南中所述,是如何使用发行版构建的。

案例1:只使用if-then-throw,不使用Requires<TException>。在这种情况下,您可以在不运行dll/exe上的约定工具的情况下构建您的发行版。这样做的好处是构建速度更快,而且不会有工具引入bug的风险。第二个好处是团队成员可以选择不使用CodeContract工具。缺点是您没有获得requires的约定继承,并且您的约定不一定对工具可见(除非您使用EndContract)。通过使用程序集模式指定这种情况:自定义参数验证

Case2:您决定始终在您的发行版上运行CodeContract工具。这让你可以使用Requires<TException>,你可以继承合同,包括接口的插装等。你的合同是干净的和工具可识别的。缺点是,构建代码的每个人都必须安装CodeContracts工具。您可以在Contract property窗格中使用assembly : Standard指定这种情况。

希望这能把事情弄清楚。

票数 8
EN

Stack Overflow用户

发布于 2013-03-01 22:40:24

我不确定这两种方法之间有什么天翻地覆的区别,但这里是我更喜欢合同的两个原因……

1)代码要整洁得多,因为您在方法的顶部编写了一条语句,显示了该方法所基于的假设。如果假设被违反,你不会用实现阻塞代码。

2)在编写代码时,您可以从Visual Studio获得的好处中挑选代码契约,并提示您要调用的方法需要什么。这有助于确保向方法发送有效的参数,而不必跳转到方法定义来检查那里的代码。

一旦代码被编译并运行,我不认为有任何显著的区别。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14991647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档