我正试图抓住Code Contracts,因为我认为这个概念在生成更强大的代码方面有很大的希望,但到目前为止,我仍然不清楚相当多的事情或者看起来很麻烦。
我目前面临的最大问题之一是如何正确处理表单控件。通过在静态检查选项中选择“隐式非空义务”,我得到一条消息,为我访问的当前表单中的每个控件推荐Contract.Requires([control] != null)
规则;这有点无意义,因为我知道控件将始终存在,因为它们是在表单的InitializeComponent()
方法中创建的。
我知道静态检查器无法知道这一点,但必须有一种摆脱这些消息的方法(如果只是因为它们使列表混乱) - 至少我希望如此 - 除了显而易见的添加所有这些推荐的检查(或者更确切地说是Contract.Assume()
次调用),这会使我的代码混乱,同时有效(逻辑上)冗余。
处理此问题的正确方法是什么?为所有控件添加不变规则,要求它们始终为非null?那些我知道的对象成员会一直在那里,比如ComboBox.Items
?
感谢您分享对此的任何见解。
答案 0 :(得分:0)
处理它的最简单方法是添加像这样的对象不变量:
[ContractInvariantMethod]
private void Invariants()
{
Contract.Invariant(control1 != null);
Contract.Invariant(control2 != null);
// etc
}
我认为在Assume
调用之后你还需要InitializeComponent
这些不是空的,因为代码契约不知道里面发生了什么(代码合同需要这样做)证明不变量在构造函数的末尾持有。)
一旦你完成了这一点,静态检查器将知道这些不变量在构造函数的末尾保持(即控件不为null),并且在任何其他方法中它们将始终不为null。
对于ComboBox.Items
等其他内容,您现在必须Assume
,因为他们在BCL中没有合同。您可以在代码合同论坛上this thread申请合同。