C#代码合同:为什么不能证明这个简单的条件?

时间:2010-08-18 23:33:58

标签: c# code-contracts

我正在对代码合同进行简单的测试。以下代码处于winform状态。这当然通过了:

    private void Test(Form form)
    {
        Contract.Requires(!string.IsNullOrEmpty(form.Name));

        MessageBox.Show(form.Name);
    }

    protected override void OnLoad(EventArgs e)
    {
        if (!string.IsNullOrEmpty(Name))
            Test(this);

        base.OnLoad(e);
    }

但是,我只添加了一个非常简单的间接层,它说“需要未经证实”:

    private bool Valid(string str)
    {
        return !string.IsNullOrEmpty(str);
    }

    protected override void OnLoad(EventArgs e)
    {
        if (Valid(Name))
            Test(this);

        base.OnLoad(e);
    }

这似乎证明是微不足道的。为什么不起作用?

2 个答案:

答案 0 :(得分:6)

您的Valid方法没有任何合同。你可以在那里表达合同,这可能只是代码相同,真的......但代码合同不会假设。您的实现可能会发生变化 - 您还没有告诉代码契约该方法意味着要做什么,因此它不会从实现中承担任何内容。

答案 1 :(得分:1)

你真的需要一种方法来呼叫string.IsNullOrEmpty(str)吗?由于String.IsNullOrEmpty(string)已经在BCL中标记为[Pure],并且由于包装器是无关的,如果直接调用它,整个问题就会消失。

如果您对此方法的态度非常强烈,那么这可能适用于您当前代码的一种方法是更改​​Test方法的合同:

private void Test(Form form)
{
    Contract.Requires(Valid(form.Name));

    MessageBox.Show(form.Name);
}

[Pure]
private bool Valid(string str)
{
    return !string.IsNullOrEmpty(str);
}

现在静态分析仪不应该抱怨。