假设以下代码:
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'上调用方法
如果Method
为Property
,我需要做些什么才能让静态检查器证明null
永远不会是SomeFlag
?
答案 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;
}
}