Wil*_*ler 35 .net .net-4.0 code-contracts
为了充分理解并利用随新的.NET Framework 4.0提供的新功能和增强功能,我想得到代码契约的实际应用示例.
我想获得一个代码示例,其中包含一个简短的解释,以帮助我启动并运行它.
Ric*_*uen 23
来自"代码合同用户手册":
契约允许您在代码中表达前提条件,后置条件和对象不变量,以进行运行时检查,静态分析和文档.
代码合同用于静态验证 ; 想象一下,如果 - 在编译时 - 你不仅捕获了语法错误,还捕获了逻辑错误.这是静态程序验证的愿景.
您可以使用合同(和静态验证)来降低测试成本......特别是回归测试.举个例子,假设我编写了一些满足某些业务需求的代码......但后来,性能需求发生了变化,我需要进行优化.如果我第一次写合同,那么 - 当我的新优化代码被验证时 - 如果它不再符合原始合同,我将在IDE中收到错误消息,就像我有编译时错误一样.因此,您几乎可以立即找到并解决该错误,其成本低于一轮测试.
Tho*_*rin 14
在即将出版的C#深度版第二版中有一个关于代码合同的免费章节.有些人叫Jon Skeet,你们中的一些人可能对他很熟悉:)
至于实际用法.您可以在代码中的任何位置使用它们,但特别是如果您正在开发许多人将使用的框架/ API类型库,我希望它们非常方便.与在运行时发现您没有处理某些边缘情况相比,代码的静态验证可以节省大量时间.
您可以随心所欲地记录您的方法用法,但是人们会真正阅读该文档吗?是否允许方法y中的字符串参数x为null,或者不是?代码合同可以提供该信息,从而避免猜测.
以下是这种情况的一个例子:
static int CountWhitespace(string text)
{
Contract.Requires<ArgumentNullException>(text != null, "text");
return text.Count(char.IsWhiteSpace);
}
Run Code Online (Sandbox Code Playgroud)
如果有人试图传递一个字符串,CountWhitespace那么验证将会抱怨.此外,它将在运行时抛出ArgumentNullException.
我最近才将我的私有类库转换为.NET 4.0,但我计划尽快添加代码契约.
你有没有见过,NullReferenceException并希望编译器可以在编译时警告你,以避免找到困难的方法 - 程序崩溃?
使用代码合同,您可以编写如下内容:
Contract.Requires(foo != null);
Run Code Online (Sandbox Code Playgroud)
这不仅仅是运行时检查 - 您可以对其进行设置,以便在使用可能为null的参数调用此函数时,您将收到编译错误.
这是一个真实世界的例子:
Address GetAddress(Customer customer)
{
Contract.Requires<ArgumentNullException>(customer != null, "customer");
return addressBook.FindCustomer(customer);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10111 次 |
| 最近记录: |