【发布时间】:2013-07-01 15:36:38
【问题描述】:
我有一个包含许多方法的类和一个名为 _isLoaded 的私有只读 bool 字段,它的对应属性为:public bool IsLoaded:
class MyClass
{
readonly bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
}
public void Method1()
{
//does whatever
}
public void Method2()
{
//does another thing
}
public void Load()
{
//does a lot of things and then...
_isLoaded = true;
}
}
我知道有一些对象不变方法可以确保在调用任何公共方法后,某些对象仍保持一致状态。就像,如果我把这个添加到我的班级:
[ContractInvariantMethod]
void checkState()
{
Contract.Invariant(!_isLoaded);
}
现在,我的问题是:有没有办法告诉运行时不要只为一个特定的公共方法(在我的例子中为 Load)调用带有 ContractInvariantMethod 注释的方法,所以我可以确定只有那个方法会正在改变我的领域的状态?
(或其他达到相同目的的方法)
谢谢。
编辑:
@Liel
非常感谢您的回答!
当我们只需要担心一个领域时,这种模式非常有效。我还添加了这个合同后置条件:
public abstract class BaseMyClass
{
private bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
}
public virtual void Load()
{
Contract.Ensures(IsLoaded);
_isLoaded = true;
}
}
public class MyClass : BaseMyClass
{
public override void Load()
{
//does a lot of things and then...
base.Load();
}
}
不幸的是,静态检查器不够聪明,无法确定我必须调用 base.Load() 来满足后置条件。这表明我可以 Contract.Assume(IsLoaded)... 显然,静态检查器远非完美。
【问题讨论】:
-
如果我的回答对您有帮助,您可以随时接受它作为回答,或者至少投赞成票以表示感谢。 :)
标签: c# code-contracts