启用静态合同检查器以基于某些其他属性证明属性为非null

时间:2013-02-19 16:49:25

标签: c# code-contracts

假设以下代码:

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

代码合同的静态检查员抱怨return的{​​{1}}声明:

  

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

如果MethodProperty,我需要做些什么才能让静态检查器证明null永远不会是SomeFlag

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

public string Property
{
    get {
        Contract.Ensures(Contract.Result<string>() != null);
        return _field ?? String.Empty;
    }
}