我在瀏覽.NET Framework的源代碼,試圖瞭解其他的問題,我看到這個代碼(PeerNearMe.cs
從System.Net.PeerToPeer.Collaboration
):設置字段值終於{}
private bool m_Disposed;
protected override void Dispose(bool disposing)
{
if (!m_Disposed){
try{
m_Disposed = true;
}
finally{
base.Dispose(disposing);
}
}
}
是否有任何理由將變量賦值放在try
區塊中?可能會以例外的方式失敗嗎?起初,我認爲這是因爲即使線程被終止,最終也會被執行:Thread.Abort()
:
未完成的finally塊在線程被中止之前執行。
在這種情況下我期望 try塊包括所有方法中:
try {
if (!m_disposed)
m_disposed = true;
}
finally {
base.Dispose(disposing)
}
然而they也說:
調用中止可能會阻止如果線程正在中止的線程位於代碼的受保護區域中,例如catch塊,finally塊或約束執行區。如果調用Abort的線程持有中止線程所需的鎖定,則會發生死鎖。
IMO調用基類的虛擬方法是點點在這種情況下跳躍在黑暗。
總之:該代碼的這一點是什麼?它真的試圖實現什麼?如果是因爲Thread.Abort()
那麼是不是錯了?
編輯:如果它真的Thread.Abort()
只是因爲那麼如果if (!m_Disposed) {
之後,但之前try {
發生中止它不會做其工作。請注意,Dispose()
必須對多個呼叫具有彈性,並且無需執行任何操作(無論何時調用)。
反諷 - MSDN建議避免_和領域,他們匈牙利命名法已經在內部完成了。 – niksofteng
@dotnetkid,轉換隻是轉換。只要整個組織遵循它,它就可以工作。 – qxg
也可能是這種情況,此代碼的以前版本在'm_disposed = true;'語句之前有更多語句。而try/finally塊只是一個剩餘的。 –