【问题标题】:Code Contracts and form controls代码契约和表单控件
【发布时间】:2011-04-25 21:58:19
【问题描述】:

我正在尝试掌握代码合同,因为我认为这个概念在生成更健壮的代码方面很有希望,但到目前为止,我仍然不清楚或看起来很麻烦。

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

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

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

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

【问题讨论】:

    标签: .net winforms code-contracts


    【解决方案1】:

    处理它的最简单方法是像这样添加对象不变量:

    [ContractInvariantMethod]
    private void Invariants()
    {
        Contract.Invariant(control1 != null);
        Contract.Invariant(control2 != null);
        // etc
    }
    

    我认为您还需要 AssumeInitializeComponent 调用之后这些不是空的,因为代码契约不知道其中发生了什么(代码契约需要这样做来证明不变量在构造函数的末尾保持)。

    一旦你这样做了,静态检查器就会知道这些不变量在构造函数的末尾保持(即控件不为空),并且在任何其他方法中它们总是不为空。

    对于像ComboBox.Items 这样的其他内容,您现在必须使用Assume,因为他们在 BCL 中没有合同。您可以在代码合同论坛上的this thread 中请求添加合同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多