题 什么时候应该使用C#4.0附带的代码合同? [关闭]


我正在经历一个关于SO的问题 c#4.0的新功能 和jon skeet的答案有C#4.0的Code Contracts功能..但我真的不明白何时使用它们..任何建议......


18
2017-12-09 04:22


起源




答案:


只要有可能。例如,在类似方法的开头使用guard子句的任何地方

public void Write(TextWriter tw, object o) {
    if(tw == null) {
        throw new ArgumentNullException("tw");
    }
    if(o == null) {
        throw new ArgumentNullException("o");
    }
    tw.WriteLine(o.ToString());
}

你应该改用

public void Write(TextWriter tw, object o) {
    Contract.Requires(tw != null);
    Contract.Requires(o != null);
    tw.WriteLine(o.ToString());
}

什么是美丽的 Contract 是因为它们是公开的,并且可以成为文档的一部分而不需要额外的工作,因为保护条款不公开,并且只能通过一些繁重的工作进入文档。因此,随着 Contract 您可以在代码中更清楚地表达要求和承诺。


25
2017-12-09 04:31



除了上面使用Contracts检查前提条件之外,类似地它们可以用于验证后置条件 - 例如,在部分/完整方法体执行之后,断言某个变量/对象是否处于正确状态。此外,合同也可以静态评估(在编译时)。 - VinayC
@VinayC:是的,这就是我在“你的代码中更清楚地表达承诺”所暗示的内容。谢谢你为我详细说明。 - jason
给你们两个+1;我不能说得更好。 - koenmetsu
值得一提的是,如果您正在编写新代码,CC团队的建议是您不应该使用 Requires<T>,但很简单 Requires。该 <T> version仅用于替换legacy if ... throw 需要保持异常兼容的代码。 - porges


合同的真正美妙之处在于你不必硬连接那些丑陋的参数名称字符串......

if(tw == null) throw new ArgumentNullException("tw");

5
2017-12-14 21:43



好吧,你不需要CC来使这个代码更好。你可以轻松地编写一些辅助方法àla Must.Be.NotNull(_ => someExpr); 这是一个“更好”的个人偏好问题,因此这不是使用CC的真正优势。 - stakx