考虑以下IDisposable课程:
class MyClass : IDisposable
{
public bool IsDisposed { get; private set; } = false;
public void Dispose()
{
IsDisposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
这个类中的每个方法,包括Dispose(),应该以这样的检查开头:
if (IsDisposed)
{
throw new ObjectDisposedException(...);
}
Run Code Online (Sandbox Code Playgroud)
由于在所有方法中写这个都很乏味和重复,我想使用契约不变量:
public class MyClass : IDisposable
{
...
[ContractInvariantMethod]
private void objectInvariant()
{
Contract.Invariant(!IsDisposed)
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这只能确保IsDisposed 在每个公共方法的末尾都是false ,不包括Dispose().
一旦Dispose()被调用,检查应该在每个方法的开头(包括Dispose())完成.否则,在方法运行期间,obejct将处于无效状态,可能导致困难的错误.
因此,契约不变量并不真正可用IDisposable.或者我错过了什么?
是否有可能强制invaraiants也被用作前提条件,还是我真的必须!IsDisposed手动为所有方法写相同的前提条件()?
您似乎误解了不变量。从文档中:
对象不变量是指只要该对象对客户端可见,该条件对于类的每个实例都应该为真。
(强调我的)在您调用 后,您的对象很可能对客户端可见Dispose,从而使该对象“无效”。但它实际上是您的对象具有的有效状态IsDisposed == true。
您确实在寻找先决条件。
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |