1

次のコードを想定します。

public class CC3
{
    private string _field;
    private bool _someFlag;

    public string Property
    {
        get { return _field; }
    }

    public bool SomeFlag
    {
        get { return _someFlag; }
    }

    public void SetField()
    {
        _field = " foo ";
        _someFlag = true;
    }

    public string Method()
    {
        Contract.Requires(SomeFlag);
        return Property.Trim();
    }
}

returnCode Contracts の静的チェッカーは、次のステートメントについて不平を言いMethodます:

null 参照 'this.Property' でメソッドを呼び出している可能性があります

Property静的チェッカーが is の場合に決して存在しないことを証明できるようにするには、nullどうすればよいSomeFlagですtrueか?

4

2 に答える 2

0

以下を使用して、静的解析を支援できますContract.Assume

public string Method()
{
    Contract.Requires(SomeFlag);
    Contract.Assume(Property != null);
    return Property.Trim();
}

Contract.Requiresまたは、実際にチェックをそれ自体でとして追加します。結局のところ、現時点では手動で真であることを証明できるからといって、コードが変更されたときに常に真であることを保証することはできません。SomeFlag実際、真であることが実際に要件であるかどうかを検討してください。おそらく、これはよりクリーンなソリューションです。

public string Method()
{
    Contract.Requires(Property != null);
    return Property.Trim();
}
于 2013-02-19T23:00:12.727 に答える
0

null でないことを証明する唯一の方法は、null でないことを証明することです。自動プロパティに変換する場合、理想的には不変式を使用できます。この例では、プロパティを書き直して、null が可能な結果にならないようにすることができます。

public string Property
{
    get {
        Contract.Ensures(Contract.Result<string>() != null);
        return _field ?? String.Empty;
    }
}
于 2013-08-22T18:30:59.923 に答える