Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET4.0中,代码契约的实际用途是什么?_.net_.net 4.0_Code Contracts - Fatal编程技术网

在.NET4.0中,代码契约的实际用途是什么?

在.NET4.0中,代码契约的实际用途是什么?,.net,.net-4.0,code-contracts,.net,.net 4.0,Code Contracts,为了充分理解和利用新的.NET Framework 4.0带来的新功能和增强功能,我想举一个实际应用的例子 有谁有应用此功能的好例子吗 我想获得一个带有简要说明的代码示例,以帮助我使用它。在即将出版的书中有一个示例。有个叫乔恩·斯基特的家伙,你们中的一些人可能对他很熟悉:) 至于实际用途。您可以在代码中的任何地方使用它们,但特别是如果您正在开发很多人将要使用的框架/API类型库,我希望它们会非常方便。与在运行时发现您没有处理某些边缘情况相比,代码的静态验证节省了大量时间 您可以随心所欲地记录您的

为了充分理解和利用新的.NET Framework 4.0带来的新功能和增强功能,我想举一个实际应用的例子

  • 有谁有应用此功能的好例子吗
  • 我想获得一个带有简要说明的代码示例,以帮助我使用它。

    在即将出版的书中有一个示例。有个叫乔恩·斯基特的家伙,你们中的一些人可能对他很熟悉:)

    至于实际用途。您可以在代码中的任何地方使用它们,但特别是如果您正在开发很多人将要使用的框架/API类型库,我希望它们会非常方便。与在运行时发现您没有处理某些边缘情况相比,代码的静态验证节省了大量时间

    您可以随心所欲地记录您的方法使用情况,但人们真的会阅读这些文档吗?方法y中的字符串参数x是否允许为空?代码契约可以提供这些信息,从而消除等式中的猜测

    下面是这样一个例子:

    static int CountWhitespace(string text)
    {
        Contract.Requires<ArgumentNullException>(text != null, "text");
        return text.Count(char.IsWhiteSpace);
    }
    
    static int CountWhitespace(字符串文本)
    {
    Contract.Requires(text!=null,“text”);
    返回text.Count(char.IsWhiteSpace);
    }
    
    如果有人试图向
    CountWhitespace
    传递一个可能为空的字符串,验证将发出投诉。此外,它将在运行时抛出ArgumentNullException

    我最近才将我的私有类库转换为.NET 4.0,但我计划很快将代码契约添加到其中。

    来自:

    契约允许您在运行时的代码中表示前置条件、后置条件和对象不变量 检查、静态分析和文档

    代码合同用于:;想象一下,如果在编译时,您不仅捕获了语法错误,还捕获了逻辑错误。这是静态程序验证的愿景

    现实世界的例子
    您可以使用契约(和静态验证)来降低测试成本。。。特别是回归测试。举个例子,假设我写了一些代码来满足一些业务需求。。。但后来,性能需要改变,我需要优化。如果我首先编写一个契约,那么——当我的新优化代码被验证时——如果它不再满足原始契约,我将在IDE中得到一条错误消息,就像我有一个编译时错误一样。因此,您几乎可以立即发现并解决该错误,这比一轮测试的成本要低。

    您是否见过
    NullReferenceException
    并希望编译器能够在编译时警告您这一点,以避免发现困难的方法-程序崩溃

    使用代码契约,您可以编写以下内容:

    Contract.Requires(foo != null);
    
    这不仅仅是一个运行时检查-您可以设置它,以便如果您使用可能为null的参数调用此函数,您将得到一个编译错误

    下面是一个真实的例子:

    Address GetAddress(Customer customer)
    {
        Contract.Requires<ArgumentNullException>(customer != null, "customer");
        return addressBook.FindCustomer(customer);
    }
    
    地址GetAddress(客户)
    {
    合同要求(客户!=null,“客户”);
    返回地址簿。FindCustomer(客户);
    }
    
    在.Net中有很多地方使用合同。
    >>你有一个真实世界的例子吗,如OP所要求的?我链接的PDF文章中有很多例子?我想我可以把它们粘贴进去,但最好还是通读一遍。+1用于显示
    Contract.Requires()
    。替换if(x)throw y块的非常有用的方法。Sweet,即使开发人员没有安装合同工具,这个(throw error)是否有效?所提供的链接中不再提供所提到的PDF。它只是重定向到该书的网页本身,而该网页不再提供免费下载的章节。您是否有OP要求的真实示例?为什么需要在第二个参数中再次将customer作为字符串写入?@Will Marcouiller:这不是必需的。如果提供,它将在错误消息中使用。谢谢:)另外,JML4是Java的静态验证器,它允许您在注释中编写前置条件和后置条件(本质上是一个简单的契约)。对于那些感兴趣的人:提供.NET Framework源代码以及代码契约的使用绝对符合真实世界示例的要求。=)(+1)