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)ですか?また、BCLでString.IsNullOrEmpty(string)すでにマークされ[Pure]ているため、またラッパーは無関係であるため、直接呼び出すと問題全体が解消されます。

このメソッドについて本当に強く感じている場合、これが現在のコードで機能する1つの方法は、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 に答える