我遇到过多个似乎是模式的案例:
Contract.Ensures(Contract.Result<BlahType>() != null);
...
BlahType Blah = new BlahType();
...
...
return Blah;
并且抱怨。
在所有情况下,该字段都是私有的,并且该方法中的任何其他内容都不会混淆。 (这些都是延迟初始化,因为数据必须来自磁盘。)
当然我可以添加一个Contract.Assume,但我不喜欢那种答案。
答案 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 。