2009-05-06 32 views
1

我正在寫一些控制檯應用程序來移動SQLite數據庫之間的一些數據。用於連接和各種預處理語句中的類implenent IDisposable的,所以我使用using塊實例化這些對象,像這樣:如何在課堂中共享IDisposable資源?

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString)) 
{ 
    sqlite_conn.Open(); 
    using (SQLiteCommand sqlite_cmd = new SQLiteCommand()) 
    { 
     sqlite_cmd.Connection = sqlite_conn; 
     sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;"; 
     sqlite_cmd.ExecuteNonQuery(); 
    } 
    sqlite_conn.Close(); 
}  

不過,我需要能夠在一個方法來創建這些連接,然後用其他方法調用它們。對於我將這些連接作爲實例變量進行存儲的最乾淨和最容易混淆的方式是什麼?我想確保他們的.Dispose()方法以智能的方式被調用,但是看不到一種確保所有操作都發生在單個塊的上下文中的好方法。

我意識到這是一個C#newb問題,所以請定製你的答案。如果你有一個建議的解決方案,我會喜歡它,如果你包含一個代碼示例來說明。

編輯:我的用例是一個控制檯應用程序。有人傳入源和目標連接字符串,並且控制檯應用程序執行操作。我真的讓我的控制檯類節目本身實現IDisposable這樣?:

class Program : IDisposable 
{ 
    private SQLiteConnection sourceConnection; 
    private SQLiteConnection destinationConnection; 

    public void Dispose() 
    { 
     sourceConnection.Dispose(); 
     destinationConnection.Dispose(); 
    } 
} 

回答

2

我需要能夠在一個方法來創建這些連接,然後打電話給他們的其他方法。對於我將這些連接作爲實例變量進行存儲的最乾淨和最容易混淆的方式是什麼?

在這種情況下,您保留這些實例變量的類應該自己實現IDisposable,並且在處理時應確保連接也被丟棄。

此外,當你需要一次就可以重新寫這樣一來,將它們分組,並減少代碼嵌套多個IDisposables:

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString)) 
using (SQLiteCommand sqlite_cmd = new SQLiteCommand()) 
{ 
    sqlite_conn.Open(); 

    sqlite_cmd.Connection = sqlite_conn; 
    sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;"; 
    sqlite_cmd.ExecuteNonQuery(); 
} // no need to call .Close(): IDisposable normally handles it for you 
+0

對我完全有用和有價值的信息。然而,它並沒有展示我需要的那種類型設計的一個好例子。在控制檯應用程序中,我是否會爲Program類本身實現IDisposable?我會在我的原始問題中添加詳細信息。 – danieltalsky 2009-05-06 01:37:07

1

你可以讓你的類實現IDisposable,並確保您清理Dispose方法中的連接等。然後調用你的類的方法可以使用(MyClass c ...)。

1

一種方法是讓你的班級實施IDisposable。在你的類的Dispose方法中,調用連接的Dispose方法和命令等。然後你可以在一個using塊中使用你的類的一個實例。