4

我正在对代码合同进行简单的测试。下面的代码是一个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);
    }

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

4

2 回答 2

6

你的Valid方法没有任何合同。你可以在那里表达一个合同,这可能只是相同的代码,真的......但代码合同不会假设这一点。你的实现可能会改变——你没有告诉代码契约该方法是什么的,所以它不假设任何来自实现的东西。

于 2010-08-18T23:36:20.760 回答
1

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

如果您真的对这种方法有强烈的感觉,那么这可能适用于您当前代码的一种方法是更改​​您的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);
}

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

于 2016-02-13T00:56:36.710 回答