代码合同静态检查引用类型和空引用

时间:2016-04-11 07:54:16

标签: c# .net code-contracts

Code Concts静态分析无法检查单个分支方法中的显式return new ...(不具有任何条件但只有一个return的方法),如下所示:

static public Tuple<int> Foo()
{
    return new Tuple<int>(42);
}

仍然警告我

  

警告:CodeContracts:可能在空引用上调用方法。你期望SomeClassName.Foo()返回非null吗?

我确实可以使用

帮助静态检查器
Contract.Ensures(Contract.Result<Tuple<int>>() != null);

明确但它看起来像是一个巨大的开销。

所以我的问题是:我是否遗漏了某些事情,或者即使是这样一些微不足道的案件,我也有责任Ensure

1 个答案:

答案 0 :(得分:1)

当调用其他方法时,代码契约依赖于明确声明的内容。正如你的建议,在某些情况下它可能会解决这个问题,但总的来说,你真的想要吗?对于这样一个简单的例子,它确实有意义,但一般来说,仅仅因为一个方法目前没有返回null,这并不意味着作者明确地保证了这一点。

这是合同的来源,而不仅仅是描述代码的作用,它描述的是你保证代码会做什么,这是一个稍微不同的东西。所以回答你的问题,是的,尽管这对于琐碎的案件来说有点开销,但是你必须Ensure这些琐碎的案例。