我试图加快代码合约的速度。这是另一个对我没有意义的问题:
这是不变量:
[ContractInvariantMethod]
void Invariant() {
Contract.Invariant(this._uiRoot.RowDefinitions!=null);
}
然后,在Method中是这段代码:
int colunmn = 0;
foreach (UIElement uiElement in row.Where(element => element!=null))
{
if (uiElement != null)
{
uiElement.SetValue(Grid.ColumnProperty, colunmn++);
uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
_uiRoot.Children.Add(uiElement);
}
}
然后我得到一个警告,即尽管是Invariant,_uiRoot.RowDefinitions可能为null。我不明白为什么CodeContracts会认为如果在每次公共方法调用和构造函数之后检查它。有问题的代码是一个自定义表单设计器,它在许多不同的方法中使用uiRoot.RowDefinitions,这就是我想把它放入Invariant的原因。我认为这足以阻止警告。
答案 0 :(得分:1)
我认为不变量只能在公共财产访问上运行。是否可以向RowDefinitions属性本身添加合约?你的不变量不能证明财产不会为空;您可以调用该类型的方法,在您的不变量运行后将其设置为null。