我读过here,不检查对象终结符或实现Dispose方法的任何方法的不变量,但它没有说明原因。我怀疑原因是当处理对象时,不变条件可能不再成立,因此可能使终结器或处理方法失败。
如果我的推理是正确的,那是否意味着我不应该在终结器中使用Contract.Ensures()
并处理方法(或者任何代码合同)?
我的具体示例是使用Contract.Ensures()
确保退出IsDisposed
方法时true
属性为Dispose()
。
public class ExampleClass : IDisposable
{
public bool IsDisposed { get; set; }
~SomeClass()
{
Dispose(false);
}
public void Dispose()
{
Contract.Ensures(IsDisposed);
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
Contract.Ensures(IsDisposed);
if (!IsDisposed)
{
if (disposing)
{
// Other code here
}
IsDisposed = true;
}
}
}
答案 0 :(得分:1)
您可以而且应该在Dispose和finalizer方法中使用Ensures。这些适用于您的代码。不应用不变量,因为正如你所说,终结器/ Dispose方法经常使对象无效,不再满足对象不变量。