代码合同和表单控件

时间:2011-04-25 21:58:20

标签: .net winforms code-contracts

我正试图抓住Code Contracts,因为我认为这个概念在生成更强大的代码方面有很大的希望,但到目前为止,我仍然不清楚相当多的事情或者看起来很麻烦。

我目前面临的最大问题之一是如何正确处理表单控件。通过在静态检查选项中选择“隐式非空义务”,我得到一条消息,为我访问的当前表单中的每个控件推荐Contract.Requires([control] != null)规则;这有点无意义,因为我知道控件将始终存在,因为它们是在表单的InitializeComponent()方法中创建的。

我知道静态检查器无法知道这一点,但必须有一种摆脱这些消息的方法(如果只是因为它们使列表混乱) - 至少我希望如此 - 除了显而易见的添加所有这些推荐的检查(或者更确切地说是Contract.Assume()次调用),这会使我的代码混乱,同时有效(逻辑上)冗余。

处理此问题的正确方法是什么?为所有控件添加不变规则,要求它们始终为非null?那些我知道的对象成员会一直在那里,比如ComboBox.Items

感谢您分享对此的任何见解。

1 个答案:

答案 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申请合同。