代码合同在.NET 4.0中的实际用法是什么?

为了充分理解和利用新的.NET Framework 4.0的新function和增强function,我希望得到一个真实应用代码合同的例子。

  1. 任何人都有这个function的应用很好的例子?

我想得到一个简单的解释代码示例,以帮助我起床并运行它。

从代码合约用户手册 :

合约允许您在代码中表示前提条件,后置条件和对象不variables,以用于运行时检查,静态分析和文档。

代码合同用于静态validation ; 想象一下,如果在编译的时候,你不仅发现了语法错误,而且还发现了逻辑错误 。 这是静态程序validation的愿景。

真实世界的例子

您可以使用合同(和静态validation)来降低testing成本…特别是回归testing。 举一个例子,假设我编写了一些满足一些业务需求的代码,但后来,性能需要改变,我需要优化。 如果我第一次写合同,那么 – 当我的新的优化代码被validation – 如果它不再履行原始合同,我会在我的IDE中得到一个错误消息,就像我有一个编译时错误。 因此,您几乎可以立即发现并解决该错误,其成本低于一轮testing。

在即将出版的“ C#深度”第二版中有关于代码合约的免费章节 。 通过一个叫Jon Skeet的家伙,你们中的一些人可能会熟悉他:)

至于实际用法。 你可以在你的代码中的任何地方使用它们,但是特别是如果你正在开发许多人将要使用的框架/ APItypes库,我期望它们非常方便。 你的代码的静态validation比在运行时发现你没有处理一些边界情况要节省很多时间。

您可以logging您的方法使用情况,但是人们是否会真正阅读该文档? 是否允许在方法y中的string参数x为空,或不是? 代码合同可以提供这些信息,从而使猜测无法进行。

以下是这种情况的一个例子:

static int CountWhitespace(string text) { Contract.Requires<ArgumentNullException>(text != null, "text"); return text.Count(char.IsWhiteSpace); } 

如果有人试图将string传递给CountWhitespace (可能为null),则validation将会投诉。 另外,它会在运行时抛出一个ArgumentNullException。

我只是最近才把我的私有类库转换为.NET 4.0,但我打算很快添加代码合约。

在.Net中有很多地方使用契约。 >> <<来源

你有没有见过一个NullReferenceException并希望编译器可以在编译时警告你,避免发现困难的方式 – 与你的程序崩溃?

通过代码合同,您可以编写如下内容:

 Contract.Requires(foo != null); 

这不仅仅是一个运行时检查 – 你可以设置它,所以如果你用一个可能为空的参数来调用这个函数,你会得到一个编译错误。

这是一个真实世界的例子:

 Address GetAddress(Customer customer) { Contract.Requires<ArgumentNullException>(customer != null, "customer"); return addressBook.FindCustomer(customer); }