ここで、オブジェクトのファイナライザーや 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;
}
}
}