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

本文关键字:属性 其他 证明 null 检查 合同 静态 于其他 启用 | 更新日期: 2023-09-27 18:00:13

假设以下代码:

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

代码契约的静态检查器抱怨Method:的return语句

可能对null引用"this"调用方法。房地产

如果SomeFlagtrue,我必须做什么才能让静态检查器证明Property永远不可能是null

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

您可以使用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();
}

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

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