2011-02-17 43 views
2


我很想了解代码合同的优点。我写了下面的代码(来自PEX +代码合同介绍)来挖掘它。代码合同和异常抛出差异

public static string TrimAfter(string value, string suffix) 
     { 
      // <pex> 
      Contract.Requires(suffix != (string)null); 
      Contract.Requires 
       (value.IndexOf(suffix) >= 0 && value.Length >= value.IndexOf(suffix)); 
      Contract.Requires(value != (string)null); 
      // </pex> 

      int index = value.IndexOf(suffix); 
      if (index < 0) 
       return value; 

      return value.Substring(0, index); 
     } 

我用null的参数调用了这个方法,并且它被编译了。 因此,我不清楚为什么它会抛出Exceptions更好。 如果代码合同真的有任何其他功能,你们可以解释一下吗? :) 在此先感谢。

+0

你为什么要将空值转换为字符串?这是没有必要的。 – Massif 2011-02-17 12:59:12

回答

2
  1. 根据你的VS版本(Premium或Ultimate,如果我没有记错的话),你可以得到编译时检查。
    这个问题使静态检查器感到高兴,这是相当多的工作。而且我不确定这是否值得大多数项目的努力。但是也许一个受限制的子集,比如空值检查可以很好地工作。
  2. 可以从中自动生成文档。
  3. 它代码较短,使人们更有可能使用它。
    我的主要观点。我很懒,如果写检查变得更容易,我更可能添加额外的检查。特别是我发现旧样式参数null检查有点冗长。
  4. 如果需要,您可以指定一个异常,以便获得与旧检查相同的向外行为。

另一方面,它不应该很难解析IL识别前置条件检查和生成文档的使用的旧标准模式。

1

我要去猜测,但是,从文档:

一个Visual Studio添加 - 使您可以指定要执行的代码合同分析的级别。分析人员可以确认合同格式良好(类型检查和名称解析),并且可以生成Microsoft中间语言(MSIL)格式的合同的编译形式。在Visual Studio中创建合同可让您利用该工具提供的标准IntelliSense。

工具可用here

3

除了作出的其他观点之外,契约可以应用于接口(你不能用常规的例外来实现),并且通过继承来强制执行(其他一些你很难处理的例外情况)。