启用静态合同检查器以基于其他属性来证明属性为非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"调用方法。房地产
如果SomeFlag
是true
,我必须做什么才能让静态检查器证明Property
永远不可能是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;
}
}