有沒有辦法來檢測一個對象是否調用了GC.SuppressFinalize?我可以檢測一個對象是否調用了GC.SuppressFinalize?
我有一個對象,它看起來像這樣(省略掉了清晰全面的Dispose模式):
public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;
public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}
如果ownsResource
構造函數的參數是false
,那麼將終結無關 - 這樣這似乎是合理的(如果有點古怪)從構造函數中調用GC.SuppressFinalize
。但是,因爲這種行爲很古怪,所以我很想在XML文檔註釋中記下它......如果我試圖對它進行評論,那麼我應該爲它寫一個單元測試。
不過,雖然System.GC有方法來設置對象的finalizability(SuppressFinalize,ReRegisterForFinalize),我看不出有什麼方法來得到對象的finalizability。有沒有什麼方法可以查詢GC.SuppressFinalize是否在給定的實例上被調用,缺少購買Typemock或寫我自己的CLR主機?
一些BCL類實際上是從其構造函數中執行SuppressFinalize,例如, SqlConnection(儘管我沒有看到任何有條件的)。 – 2011-01-08 16:42:38