我曾經很確定答案是「否」,如Overriding the Finalize method和Object.Finalize documentation中所解釋的那樣。是否允許終結器調用其他託管類的方法?
然而,儘管隨機通過FileStream
在反射器瀏覽,我發現它可以從一個終結實際調用了這樣一個方法:
private SafeFileHandle _handle;
~FileStream()
{
if (this._handle != null)
{
this.Dispose(false);
}
}
protected override void Dispose(bool disposing)
{
try
{
...
}
finally
{
if ((this._handle != null) && !this._handle.IsClosed) // <=== HERE
{
this._handle.Dispose(); // <=== AND HERE
}
[...]
}
}
我開始懷疑這是否會一直工作,由於在具體的方式它的寫法是否正確,因此,「不要觸摸終結者的託管類」只是一條可以被打破的指導方針,只要有充分的理由和必要的知識才能做到這一點。
我挖得更深一點,發現當「規則」被破壞時可能發生的最糟糕的情況是正在訪問的託管對象已經完成,或者可能在單獨的線程上並行完成。所以如果SafeFileHandle的終結器沒有做任何會導致後續調用Dispose失敗的事情,那麼上面應該沒問題吧?
問題:所以可能畢竟是在另一個管理類中的方法可以被稱爲從終結可靠情況呢?我一直認爲這是錯誤的,但是這個代碼表明這是可能的,並且可以有充足的理由來做到這一點。
獎金:觀察該SafeFileHandle
甚至不知道它正在從一個終結所謂,因爲這只是一個Dispose()
正常通話。基類SafeHandle
實際上有兩種私有方法,InternalDispose
和InternalFinalize
,在這種情況下將調用InternalDispose
。這不是問題嗎?爲什麼不呢?...