[英]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
哪種方式更可取,為什么? 謝謝!
我建議使用以下兩種方法之一:
您應該選擇哪個取決於對象所需的生命周期。
如果你真的要保持與數據庫的連接(而不僅僅是你想在這里發布的示例代碼),那么你現在正在做正確的事情。 那就是打開數據庫連接,查詢數據並關閉/處理它。
另一方面,如果您的資源占用大量內存但對於盡快關閉/處置時間不是很重要,則應使用IDisposable.Dispose()方法。 當你的對象不再被引用而GC需要內存時,你的對象將被收集,Dispose()方法將被關閉,它將處理你的非托管大對象。
我認為你只需要確保你的物品被丟棄。
如果你在你的方法中這樣做,即使出現意外錯誤,我認為你還可以。 如果您堅持使用類中的非托管資源,那么實現IDisposable是一種確保在對象完成時有機會處置資源的方法,或者為用戶提供明確處理資源的方法。
如果您只是在方法中創建和使用資源而不在類中保留引用,那么只要您確保將它們放在方法中(通過手動操作,或者更容易,通過在using塊中包裝) ),那么你應該沒問題我想。
是的,實現IDisposable就是告訴客戶你的代碼“嘿,你需要在這個對象上調用dispose,因為它維護了對非托管資源的引用。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.