我想知道我是应该抛出异常还是应该调用Contract.Requires
例如:
public static void Function(String str)
{
if (str == null) throw new ArgumentNullException("str", "Input string cannot be null.");
// ...
}
vs
public static void Function(String str)
{
Contract.Requires<ArgumentNullException>(str != null, "Input string cannot be null.");
// ...
}
因为Contract.Requires
不需要CONTRACTS_FULL
符号,所以我也可以将它保留在我的发布版本中。
这是我的考虑:
缺点:您不能调用自定义异常类型构造函数的重载版本。根本没有办法将额外的参数传递给构造函数。
专业版:静态工具支持(例如,通知调用者违反合同)。
我应该使用哪一个,以及在什么样的情况下?
发布于 2013-04-27 06:28:18
if-then-throw
和Requires<TException>
之间的基本权衡,如CodeContract用户指南中所述,是如何使用发行版构建的。
案例1:只使用if-then-throw
,不使用Requires<TException>
。在这种情况下,您可以在不运行dll/exe上的约定工具的情况下构建您的发行版。这样做的好处是构建速度更快,而且不会有工具引入bug的风险。第二个好处是团队成员可以选择不使用CodeContract工具。缺点是您没有获得requires的约定继承,并且您的约定不一定对工具可见(除非您使用EndContract
)。通过使用程序集模式指定这种情况:自定义参数验证
Case2:您决定始终在您的发行版上运行CodeContract工具。这让你可以使用Requires<TException>
,你可以继承合同,包括接口的插装等。你的合同是干净的和工具可识别的。缺点是,构建代码的每个人都必须安装CodeContracts工具。您可以在Contract property窗格中使用assembly : Standard指定这种情况。
希望这能把事情弄清楚。
发布于 2013-03-01 22:40:24
我不确定这两种方法之间有什么天翻地覆的区别,但这里是我更喜欢合同的两个原因……
1)代码要整洁得多,因为您在方法的顶部编写了一条语句,显示了该方法所基于的假设。如果假设被违反,你不会用实现阻塞代码。
2)在编写代码时,您可以从Visual Studio获得的好处中挑选代码契约,并提示您要调用的方法需要什么。这有助于确保向方法发送有效的参数,而不必跳转到方法定义来检查那里的代码。
一旦代码被编译并运行,我不认为有任何显著的区别。
希望这能有所帮助。
https://stackoverflow.com/questions/14991647
复制相似问题