2012-07-25 51 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

相關問題