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();
    }
}

Code Contracts 的静态检查器抱怨以下return声明Method

可能在空引用“this.Property”上调用方法

我必须做什么才能使静态检查器证明Property永远不可能nullif SomeFlagis true

4

2 回答 2

0

证明它不为空的唯一方法是证明它不为空。理想情况下,如果要转换为自动属性,则可以使用不变量。对于此示例,您可以重写属性以确保 null 不是可能的结果:

public string Property
{
    get {
        Contract.Ensures(Contract.Result<string>() != null);
        return _field ?? String.Empty;
    }
}
于 2013-08-22T18:30:59.923 回答
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 回答