代码合同&抛出差异的例外

时间:2011-02-17 12:56:04

标签: .net c#-4.0 code-contracts


我想要了解Code Contracts的优势。我已经编写了以下代码(来自PEX + Code Contract介绍)来挖掘它。

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);
        }

我用nulls参数调用了这个方法,它被编译了。 所以我不清楚为什么抛出异常会更好。 如果Code Contracts真的有任何其他功能,你能解释一下吗? :) 提前谢谢。

4 个答案:

答案 0 :(得分:3)

除了提出的其他要点之外,合同可以应用于界面(你不能通过常规例外),并通过继承强制执行(其他一些你很难用常规做的事情)例外)。

答案 1 :(得分:2)

  1. 根据您的VS版本(Premium或Ultimate,如果我没记错),您可以进行编译时检查 这个问题是让静态检查器开心的相当多的工作。我不确定大多数程序是否值得付出努力。但也许一个有限的子集,如空值检查可能会很好。
  2. 可以自动生成文档。
  3. 这是更短的代码,让人们更有可能使用它 对我来说重点。我很懒,如果写检查变得容易,我更有可能添加额外的检查。特别是我发现旧样式参数null检查有点冗长。
  4. 如果需要,您可以指定例外,因此您可以获得与旧支票相同的外向行为。
  5. 另一方面,解析IL识别旧标准模式以进行前置条件检查并使用生成文档时,应该不难。

答案 2 :(得分:1)

为了不让它编译,您需要使用静态检查器的高级版代码合同:http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

答案 3 :(得分:1)

我猜,但是,从文档:

  

Visual Studio加载项允许您指定要执行的代码协定分析级别。分析器可以确认合同格式正确(类型检查和名称解析),并可以生成Microsoft中间语言(MSIL)格式的合同的编译形式。在Visual Studio中创作合同使您可以利用该工具提供的标准IntelliSense。

可以使用工具here