关于c#契约类和接口中的嵌套类型

时间:2017-04-27 10:51:23

标签: c# c#-4.0

我正在寻找合同类,我看到了一些代码示例。我想知道它是什么。所以有一个这样的示例代码。

[ContractClass(typeof(ICaseConverterContracts))] 
public interface ICaseConverter 
{ 
    string Convert(string text); 
}
[ContractClassFor(typeof(ICaseConverter))] 
internal class ICaseConverterContracts : ICaseConverter 
{ 
    string ICaseConverter.Convert(string text) 
    { 
        Contract.Requires(text != null); 
        Contract.Ensures(Contract.Result<string>() != null); 
        return default(string); 
    }

    private ICaseConverterContracts() {} 
}

public class InvariantUpperCaseFormatter : ICaseConverter 
{ 
    public string Convert(string text)  
    { 
        return text.ToUpperInvariant(); 
    } 
}

这里有什么合同?

我创建了一个InvariantUpperCaseFormatter的新实例。

class Program
{
    static void Main(string[] args)
    {
        InvariantUpperCaseFormatter formatter = new InvariantUpperCaseFormatter();
        Console.Write(formatter.Convert(string.Empty));
    }
}

我将断点放在ICaseConverter.Convert(string text)类的方法ICaseConverterContracts中,但它没有中断。它是什么?自动检查名称是否为空?

1 个答案:

答案 0 :(得分:0)

您看到的代码是一段使用Code contracts (here) (and here)的代码。代码合同提供的一些工具在默认情况下是可用的,但是其他工具依赖于在构建代码时修改代码的IL重写器。因此,在您安装代码合同并通过指令激活它之前,将不会使用某些代码。

我认为你的问题有点过于宽泛。如果您有兴趣浏览我上面提供的链接。您发布的代码中的合同检查两件事:首先,它检查输入是否为null,然后检查输出是否也不是null