溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么實現(xiàn)一個IDisposable接口

發(fā)布時間:2021-07-07 17:33:29 來源:億速云 閱讀:142 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家?guī)碛嘘PC#中怎么實現(xiàn)一個IDisposable接口,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

C#語言有很多值得學習的地方,這里我們主要介紹C#實現(xiàn)IDisposable接口,包括介紹標準的Dispose模式等方面。

通過C#實現(xiàn)IDisposable接口你可以完成了兩個事務:你為客戶端及時地釋放自己持有的所有受控資源提供了機制;你為客戶端提供了一種釋放非受控資源的標準途徑。這是一個很大的進步。當你在類型中實現(xiàn)了Idisposable接口的時候,客戶端可以避免終結操作的開銷,你的類就成為.NET世界中的"良民"了。

但是在你建立的這種機制中仍然存在一些問題。怎樣在衍生類清理自己資源的時候同時也讓基類能夠清理資源?如果衍生類重載了終結操作,或者添加了自己的C#實現(xiàn)IDisposable接口,那么這些方法必須調用基類,否則,基類就不能正確地進行清理操作。同樣,finalize(終結操作)和Dispose參與分擔了一些相同的職責。

Finalize方法和Dispose方法的代碼幾乎相同。而且在重載接口函數(shù)后并不像你預料的那樣工作。標準的Dispose模式中的第三個方法是一個受保護的虛擬輔助函數(shù),它分解出這些共同的事務,并給衍生類添加一個用于釋放資源的"鉤子(hook)"。基類包含了核心接口的代碼。作為對Dispose()或終結操作的響應,該虛擬函數(shù)為衍生類清除資源提供了"鉤子":

protected virtual void Dispose( bool isDisposing );

這個重載的方法實現(xiàn)支持finalize和Dispose的必要事務,由于它是虛擬的,它為所有的衍生類提供了一個入口點。衍生類可以重載這個方法,為清除自己的資源提供適當?shù)膶崿F(xiàn),同時還可以調用基類版本。當isDisposing為真(true)的時候,你可以清除受控和非受控資源,當 isDisposing為假(false)的時候,你只能清除非受控資源。在這兩種情況下,你都可以調用基類的Dispose(bool)方法,讓它清除自己的資源。

下面有一個簡短的例子,它演示了你在實現(xiàn)這種模式的時候所提供的代碼框架。MyResourceHog類演示了C#實現(xiàn)IDisposable接口、終結器的代碼,并建立了一個虛擬的Dispose方法:

publicclassMyResourceHog:IDisposable  {  //已經被處理過的標記  privatebool_alreadyDisposed=false;  //終結器。調用虛擬的Dispose方法  ~MyResourceHog()  {  Dispose(false);  }   //IDisposable的實現(xiàn)  //調用虛擬的Dispose方法。禁止Finalization(終結操作)  publicvoidDispose()  {  Dispose(true);  GC.SuppressFinalize(true);  }   //虛擬的Dispose方法  protectedvirtualvoidDispose(boolisDisposing)  {  //不要多次處理  if(_alreadyDisposed)  return;  if(isDisposing)  {  //TODO:此處釋放受控資源  }  //TODO:此處釋放非受控資源。設置被處理過標記  _alreadyDisposed=true;  }  }

在受控環(huán)境中,你不必為自己建立的每個類型編寫終結器,你只需要為存儲非受控類型,或者包含了C#實現(xiàn)IDisposable接口的成員的類型編寫終結器。即使你只需要Disposable接口,不需要finalizer,也應該同時實現(xiàn)整個模式。否則,你會使衍生類的標準 Dispose思想的實現(xiàn)變得很復雜,從而限制了衍生類的功能。請遵循前面談到的標準的Dispose思想,這將使你、你的類的用戶、從你的類型建立衍生類的用戶的生活更加輕松。

上述就是小編為大家分享的C#中怎么實現(xiàn)一個IDisposable接口了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI