2013-05-31 34 views
1

我讀here不檢查對象終結器或實現Dispose方法的任何方法的不變量,但它沒有說明原因。我懷疑這是因爲在處理對象時不變的條件可能不再成立,因此可能會導致終結器或處置方法失敗。Contract.Ensures應該用於finalizer和Dispose方法嗎?

如果我的推理是正確的,這是否意味着我不應該在終結器中使用Contract.Ensures()並且處置方法(或任何代碼合同)?

我的具體示例是使用Contract.Ensures()確保在退出Dispose()方法時IsDisposed屬性爲true

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; 
     } 
    } 
} 

回答

1

您可以也應該在Dispose和finalizer方法中使用Ensures。這些應用於您的代碼。不變量不適用,因爲正如你所說,一個終結器/ Dispose方法通常會使對象失效,不再滿足對象不變量。

相關問題