Consider the following IDisposable
class:
class MyClass : IDisposable
{
public bool IsDisposed { get; private set; } = false;
public void Dispose()
{
IsDisposed = true;
}
}
这个类中的每个方法,包括Dispose()
,都应该以以下方式开始检查:
if (IsDisposed)
{
throw new ObjectDisposedException(...);
}
由于在所有方法中编写此内容很繁琐且重复,因此我希望使用合同不变式:
public class MyClass : IDisposable
{
...
[ContractInvariantMethod]
private void objectInvariant()
{
Contract.Invariant(!IsDisposed)
}
...
}
然而,这仅确保在每个公共方法结束时IsDisposed为false(不包括
Dispose()
)。一旦调用
Dispose()
,应在每个方法的开头(包括Dispose()
)进行检查。否则,在方法运行期间,对象将处于无效状态,可能导致难以调试的错误。因此,契约不变量对于
IDisposable
并不真正可用。或者我有所遗漏?是否可以强制不变量也用作前置条件,还是我真的必须手动向所有方法编写相同的前置条件(
!IsDisposed
)?