代码合同编译器如何认为这可能为空?

时间:2012-07-25 20:39:37

标签: c# code-contracts

我遇到过多个似乎是模式的案例:

Contract.Ensures(Contract.Result<BlahType>() != null);
...
BlahType Blah = new BlahType();
...
...
return Blah;

并且抱怨。

在所有情况下,该字段都是私有的,并且该方法中的任何其他内容都不会混淆。 (这些都是延迟初始化,因为数据必须来自磁盘。)

当然我可以添加一个Contract.Assume,但我不喜欢那种答案。

1 个答案:

答案 0 :(得分:0)

你可以说服静态检查器一个字段永远不是null(或任何其他条件)的唯一方法是使它成为一个不变量。在您的类中的每个方法的返回时检查不变方法中的不变量,因此检查器可以假定它们保持不变。所以,添加到班级的底部:

#region Invariants
[ContractInvariantMethod]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
    "CA1822:MarkMembersAsStatic",
    Justification = "Required for code contracts.")]
private void ObjectInvariant()
{
    Contract.Invariant(this.blah != null);
}
#endregion

注意:

  • 不变方法是任何private void方法,没有应用ContractInvariantMethod属性的参数。您可以在其中放置多个不变量。
  • 要快速获取ObjectInvariant方法摘要,请键入cim TAB TAB
  • 可以找到其他代码合约代码段here
  • 在C#中,私有/受保护字段和局部变量使用小写的标识符的第一个字母(Camel case)编写。见here for more information。这使您的代码更具可读性和可理解性。