簡體   English   中英

在c#中處置非托管對象

[英]Disposing of unmanaged objects in c#

假設我有一個MyCustomDatabaseAccess作為數據成員的類。 MyCustomDatabaseAccess有一個Dispose()方法。 MyCustomDatabaseAccess是訪問數據庫的中間件類。

public class MyClass {
   private MyCustomDatabaseAccess db_access;
}

MyClass是否需要實現IDisposable接口?

我現在的解決方案是做這樣的事情:

    public class MyClass {
       private MyCustomDatabaseAccess db_access;

       public void GetDBResults () {
          db_access = new MyCustomDatabaseAccess();
          DataTable dt = db_access.ExecuteStoredProc(param1, param2, etc..);

          //do stuff with results

          db_access.Dispose();

    }

}

從我在MSDN上閱讀的內容來看,另一種確保正確處理此對象的方法是讓MyClass實現IDisposable接口,然后實現Dispose()函數,然后在調用MyClass對象的類中調用它。 有關詳細信息,請參閱此處http://www.devx.com/dotnet/Article/33167/0/page/3

哪種方式更可取,為什么? 謝謝!

我建議使用以下兩種方法之一:

  1. 將IDisposable對象包裝在using塊中。
  2. 保持對類中IDisposable對象的引用,並讓您的類實現IDisposable。 在類的Dispose方法中處理對象。

您應該選擇哪個取決於對象所需的生命周期。

  • 如果您只需要在單個方法調用期間使用它,那么第一個選項 - 使用塊 - 是更可取的,因為它更簡單,更難以出錯。 使用塊(幾乎)保證一旦不再需要對象就會為您調用Dispose - 即使在拋出異常的情況下也是如此。
  • 如果一次性對象的持續時間必須長於單個方法調用的持續時間,那么您不能使用第一個選項,因此您應該使用第二個選項 - 即您的類應該實現IDisposable。

如果你真的要保持與數據庫的連接(而不僅僅是你想在這里發布的示例代碼),那么你現在正在做正確的事情。 那就是打開數據庫連接,查詢數據並關閉/處理它。

另一方面,如果您的資源占用大量內存但對於盡快關閉/處置時間不是很重要,則應使用IDisposable.Dispose()方法。 當你的對象不再被引用而GC需要內存時,你的對象將被收集,Dispose()方法將被關閉,它將處理你的非托管大對象。

我認為你只需要確保你的物品被丟棄。

如果你在你的方法中這樣做,即使出現意外錯誤,我認為你還可以。 如果您堅持使用類中的非托管資源,那么實現IDisposable是一種確保在對象完成時有機會處置資源的方法,或者為用戶提供明確處理資源的方法。

如果您只是在方法中創建和使用資源而不在類中保留引用,那么只要您確保將它們放在方法中(通過手動操作,或者更容易,通過在using塊中包裝) ),那么你應該沒問題我想。

是的,實現IDisposable就是告訴客戶你的代碼“嘿,你需要在這個對象上調用dispose,因為它維護了對非托管資源的引用。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM