代码协定(四)——安装和使用

前面已经介绍过,代码协定相关函数是.Net 4.0的一部分,内置在在名字空间System.Diagnostics.Contracts中,都是一些静态函数。但是,使用的时候我们就会发现它们并没有按照我们预期的方式所工作,如下函数就能正常运行而不报异常。

    static void Main(string[] args)
    {
        Contract.Requires(false);
    }

实际上,代码协定的大部分功能是在链接的时候通过Code Contracts Dev来进行代码注入才有效果的,默认情况下只有假定和断言(我所测试过的)是有效果的。

启用代码协定的功能步骤如下:

首先,安装Code Contracts for .NET插件。

    

安装了该插件后,我们就可以在项目的属性页上发现多了一个Code Contracts的标签:

    

勾上"Perform Runtime Check"选项,只是可以看到右侧的下拉框有五个选项,这里分别介绍一下它们的区别:

  1. Full表示执行所有的代码协定语句。
  2. Pre and Post表示执行前置和后置条件检查,即Contract.Require和Contract.Ensures。
  3. Preconditions 表示只执行前置条件检查,即Contract.Require。
  4. ReleaseRequires 表示执行public类的public方法的前置条件检查。
  5. None表示不执行代码协定检查,即不进行代码协定注入。

之所以有这些选项,是因为代码协定的代码注入运行时候是有开销的,影响运行性能。另外,链接的时候注入代码也是影响程序的生成时间的。我们可以在需要检验功能的时候放开代码检查,需要性能的时候关闭检查,非常方便,而传统的手动抛异常的方式就做不到这一点。

值得一提的是,它是可以在Debug版本和Release版本中选择不同的开关的。我们在Debug版本中开启必要的代码检查,而在Release版本中关闭检查。需要注意的是,public类的public方法的入参检查(前置条件协定)是有必要的,即使在Release版本中也也应该存在。我的个人建议是在Debug版本中平时使用Pre and Post选项(注入代码也是影响程序的生成时间的,故只在有必要的时候才使用Full的方式),在Release版本中使用ReleaseRequires选项。

另外,在安装了Code Contracts for .NET插件后,它也顺带安装了一些代码片段,方便我们快速输入,非常给力。例如Contract.Require函数可以直接通过"cr"+Tab键输入,Contract.Ensures可以通过"ce"+Tab键输入。

    

    

另外,微软还提供了一个Code Contracts Editor Extensions插件实现编辑器扩展,可以显示出函数的前置条件和后置条件,非常方便。这个插件我以前用过,不过在VS2013上使用过的时候老出错,不知道为什么。感兴趣的朋友可以试一下。

    

原文地址:https://www.cnblogs.com/TianFang/p/3485005.html