2012-07-25 41 views
0

我已经打多的情况下,似乎是一个模式:代码合同编译器如何认为这可能为空?

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

,并抱怨。

在所有情况下,该领域是私人的,没有别的方法与它混淆。 (这些都是延迟初始化,因为数据必须来自磁盘。)

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

+3

完整(最小)代码导致行为? – 2012-07-25 20:41:26

+1

我不能用你提供的代码重现这一点,你确定没有别的东西在修改'Blah'? – 2012-07-25 20:48:11

+0

其他任何'返回'? – 2012-07-25 20:55:14

回答

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方法片段,键入cimTABTAB
  • 其他代码合同片段可以找到here
  • 在C#中,私有/受保护的字段和局部变量以小写字母(骆驼大小写)标识符的第一个字母书写。见here for more information。这使您的代码更具可读性和可理解性。
+0

在整个对象中,我会同意你的看法,但这是一种方法。你是说静态检查器看不到任何例程调用可能会混淆它吗? – 2012-07-27 16:50:28

+0

你在谈论一个(私人)领域,所以这就是我可以想出的一个领域。但是你显然是在谈论一个局部变量,完全不同的东西。你可以添加更多的代码/上下文来表明问题吗?随着你显示的代码,我不能再现你的问题。我的静态检查器没有抱怨。 – Virtlink 2012-07-27 19:41:37

+0

你能解释为什么当方法访问'this.blah'时你需要抑制CA1822吗?我也遇到过这个,但是不明白为什么。 – Ergwun 2016-04-14 11:54:16