第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C#中完成/處理模式

在C#中完成/處理模式

慕田峪4524236 2019-06-17 16:41:18
在C#中完成/處理模式C#2008我在這方面的工作已經(jīng)有一段時間了,我仍然對一些問題感到困惑。我的問題如下我知道,只有在處理非托管資源時才需要終結(jié)器。但是,如果使用調(diào)用非托管資源的托管資源,還需要實現(xiàn)終結(jié)器嗎?但是,如果您開發(fā)的類不直接或間接地使用任何非托管資源,那么您能否實現(xiàn)IDisposable以便您的類的客戶端可以使用“Using語句”?實現(xiàn)IDisposable只是為了使您的類的客戶端能夠使用Using語句,這是否是可以接受的?using(myClass objClass = new myClass()){     // Do stuff here}我在下面開發(fā)了這個簡單的代碼來演示Finish/Dispose模式:public class NoGateway : IDisposable{     private WebClient wc = null;     public NoGateway()     {         wc = new WebClient();         wc.DownloadStringCompleted += wc_DownloadStringCompleted;     }     // Start the Async call to find if NoGateway is true or false     public void NoGatewayStatus()     {         // Start the Async's download             // Do other work here         wc.DownloadStringAsync(new Uri(www.xxxx.xxx));     }     private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)     {         // Do work here     }     // Dispose of the NoGateway object     public void Dispose()     {         wc.DownloadStringCompleted -= wc_DownloadStringCompleted;         wc.Dispose();         GC.SuppressFinalize(this);     }}關(guān)于源代碼的問題:這里我沒有添加終結(jié)器,通常情況下,終結(jié)器將由GC調(diào)用,終結(jié)器將調(diào)用Dispose。由于我沒有終結(jié)器,什么時候調(diào)用Dispose方法?是必須調(diào)用它的類的客戶端嗎?因此,我在示例中的類名為NoGateway,客戶機可以像這樣使用和處理該類:using(NoGateway objNoGateway = new NoGateway()){     // Do stuff here   }當執(zhí)行到達Using塊的末尾時,是否會自動調(diào)用Dispose方法,或者客戶端是否必須手動調(diào)用Dispose方法?E.NoGateway objNoGateway = new NoGateway();// Do stuff with objectobjNoGateway.Dispose(); // finished with it我在我的NoGateway班級,等級。因為WebClient實現(xiàn)了IDisposable接口,這是否意味著WebClient間接使用非托管資源?在這方面是否有嚴格的規(guī)則可以遵循?如何知道類使用非托管資源?
查看完整描述

3 回答

?
達令說

TA貢獻1821條經(jīng)驗 獲得超6個贊

官方實施模式IDisposable很難理解。我相信這個是更好:

public class BetterDisposableClass : IDisposable {

  public void Dispose() {
    CleanUpManagedResources();
    CleanUpNativeResources();
    GC.SuppressFinalize(this);
  }

  protected virtual void CleanUpManagedResources() { 
    // ...
  }
  protected virtual void CleanUpNativeResources() {
    // ...
  }

  ~BetterDisposableClass() {
    CleanUpNativeResources();
  }}

更好解決辦法是制定一條規(guī)則必須為需要處理的任何非托管資源創(chuàng)建包裝類:

public class NativeDisposable : IDisposable {

  public void Dispose() {
    CleanUpNativeResource();
    GC.SuppressFinalize(this);
  }

  protected virtual void CleanUpNativeResource() {
    // ...
  }

  ~NativeDisposable() {
    CleanUpNativeResource();
  }}

帶著SafeHandle以及它的導(dǎo)數(shù),這些類應(yīng)該是非常罕見.

對于不直接處理非托管資源的一次性類,即使在存在繼承的情況下,結(jié)果也是強大的:他們不需要再關(guān)心非托管資源了..他們會簡約執(zhí)行和理解:

public class ManagedDisposable : IDisposable {

  public virtual void Dispose() {
    // dispose of managed resources
  }}


查看完整回答
反對 回復(fù) 2019-06-17
  • 3 回答
  • 0 關(guān)注
  • 472 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號