18

我有以下方法:

private void DoSomething(CoolClass coolClass)
{
    if (coolClass == null)
    {
        throw new ArgumentNullException("coolClass");
    }
    coolClass.Name = "Pepe";
}

使用代码契约,我们可以这样写:

private void DoSomething(CoolClass coolClass)
{
    Contract.Requires<ArgumentNullException>(coolClass != null, "IS NULLL!");
    coolClass.Name = "Pepe";
}

第二种方法更短更简单。我遇到的问题是,当您构建它时,在运行时它不会抛出异常,它会显示:

描述:必须使用代码协定二进制重写器 (CCRewrite) 重写程序集(可能是“CodeContractsTest”),因为它正在调用 Contract.Requires 并且定义了 CONTRACTS_FULL 符号。从项目中删除任何显式定义的 CONTRACTS_FULL 符号并重新构建。CCRewrite 可以从http://go.microsoft.com/fwlink/?LinkID=169180下载。安装重写器后,可以在 Visual Studio 中从代码合同窗格上的项目属性页面启用它。确保启用“执行运行时合同检查”,这将定义 CONTRACTS_FULL。

除非您使用 VS 从此处下载 .net 的 CodeContracts 。

然后你检查项目中的“运行时检查”,这样当你在运行时构建它时,就会抛出异常。

我们的应用程序是使用 Jenkins 和 PowerShell 脚本构建的。有什么方法可以通过简单的命令或属性或简单的方式检查运行时并引发异常?

4

2 回答 2

5

通过更改以下项目属性,我可以消除运行时出现此异常。

右键单击项目 -> 属性 -> 代码合同(选项卡)将组装模式更改为“标准合同要求”并选中复选框 - 执行运行时合同检查

于 2016-06-10T09:57:52.053 回答
4

如果您喜欢简单,为什么不直接编写您自己的方法版本?

public class CustomContract
{
    public static void Requires<TException>( bool Predicate, string Message )
        where TException : Exception, new()
    {
       if ( !Predicate )
       {
          Debug.WriteLine( Message );
          throw new TException();
       }
    }
}  

使用 Code Contracts 只是为了拥有一个友好的 API 听起来就像用大炮射击麻雀一样。

于 2013-09-13T19:26:39.457 回答