【问题标题】:Contract.Requires usage合同。需要使用
【发布时间】:2011-12-01 04:42:54
【问题描述】:

这是我的问题。我是合同设计的忠实拥护者,我正在使用这个概念,尤其是在开发可供其他开发人员使用的库时。我刚刚发现了一种新的方法是:Contract.Requires 而不是Exception: 所以不要有:

public void SomeMethod(string name){
   if(name==null) throw new NullArgumentException("Null values not supported");
} 

我现在有:

public void SomeMethod(string name){
   Contract.Requires(name != null);
}

编辑:我在 VS2010 的调试模式下工作。

问题:Contract.Requires 不执行任何操作,即使 namenull

MSDN 文档说:

为封闭方法指定一个前置条件契约或 属性。

但如果条件不满足,则不指定任何内容!

我还注意到other Contract.Requires 重载会引发异常,显示消息...但是Contract.Requires(Boolean) 是干什么用的?

编辑下面的答案强调必须安装插件才能拥有Contract API 的全部功能,但是希望他们的代码在不同平台上表现相同的 Mono 用户呢?

【问题讨论】:

标签: c# design-by-contract


【解决方案1】:

您应该执行以下操作:

  1. 按照 nfechner 的说明安装 Code Contracts 插件
  2. 转到项目属性的“代码合同”文件夹
  3. 检查“执行运行时合同检查”
  4. 将“组装模式”切换为“需要标准合同”
  5. Contract.Requires<SomeException> 替换您的Contract.Requires(第一个抛出System.Diagnostics.ContractException,而第二个抛出您指定的异常,这对公共方法很重要)

这是基本设置。更准确的配置,refer to the manual

如果你使用 Mono,Contract 类可能是空的。我没有这样做,但合同手册的第七章似乎解释了如何提供您自己的实现。

【讨论】:

  • +1 获取这些提示。在这种情况下,我宁愿坚持例外。 MONO 有类似的工具吗?
  • 我不仅对在 MONO 中使用它感兴趣,而且对从 Windows 到 Linux 的可移植性感兴趣,反之亦然
  • 我不确定它是如何工作的,但我认为你应该尝试实现自定义合约运行时。这应该不是很困难。我希望实现易于移植。如果您这样做并且如果您有 VS Professional+,那么您将获得 compile-time 合同检查的好处,这是很有价值的。我会试一试。
  • @GETah:代码契约插件执行编译后步骤,重写程序集中的 IL 以包含运行时检查。如果您的程序集与 Mono 兼容,它将在 Windows 和 Linux 上执行Contract.Requires(...) 检查。唯一的问题是在 Linux 上编译代码,IL 重写器不可用。如果您在 Windows 上进行所有开发,那么代码契约不会以任何方式影响跨平台兼容性。
【解决方案2】:

来自Contract class docs

重要

您必须安装 Visual Studio 加载项才能强制执行合同。 Code Contracts Premium Edition 加载项允许您指定静态和运行时 检查项目属性页面上的代码合同。如果你这样做 不启用运行时检查,合约如Contract.Ensures 如果合同是,方法将不会在运行时抛出异常 违反。 Visual Studio 加载项不随 Visual Studio 提供 2010 或 Windows SDK。

【讨论】:

  • 小费+1,但这仅在一方面解决了问题。请查看我对该问题的更新
【解决方案3】:

使用这样的消息通常有助于准确说明您所做的事情。

例如,您没有在原始消息中提及是否安装了 VS 插件,也没有在项目属性下启用它,或者您实际上是在调试与发布模式下运行等。

回复 Contract.RequiresContract.Requires<Exception>

推荐Contract.Requires。 根据说明书

如果您的代码必须在失败时抛出特定异常 特定的前提条件,您可以使用泛型重载形式 以下。 (在您提交此表格之前,请阅读第 5.1 节 代码。你不能在不运行合约工具的情况下使用Requires < Exn <Exn>> 在所有版本上。如果这样做,您每次都会遇到运行时失败。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多