2010-01-07 50 views
3

完成在回答一個previous question有人這樣做可以清理一個SqlConnection的建議:建立在C#中IDisposable的類時,與

擁有的SqlConnection類的成員變量,但使課堂IDisposable接口和處置當

我已經把這個建議(下)的實現,但要檢查這個實現是正確的類設置關閉SqlConnection(顯然目前還不做任何事情,除了開放的連接,但這個想法是在t中會有方法在這裏將使用連接,並且能夠依賴它存在並且正在打開)。

public class DatabaseRecord : IDisposable 
{ 
    protected SqlConnection connection; 

    public DatabaseRecord() 
    { 
     connection = new SqlConnection("ConnectionString"); 
     connection.Open(); 
    } 

    // IDisposable implementation 

    private bool disposed; 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 


    private void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       connection.Dispose(); 
      } 
      disposed = true; 
     } 

    } 

    // Destructor 
    ~DatabaseRecord() 
    { 
     Dispose(false); 
    } 
} 

這項工作?使用DatabaseRecord實例的類是否需要做任何特殊的事情,或者一旦實例不再被使用/引用,會自動調用Dispose?在需要連接的每個單獨方法體中使用using (var connection = new SqlConnection("...")) { }效率更高嗎?

回答

4

SqlConnection是一個託管資源,應該放置在if (disposing)塊內。使用你的類的類應該處理它,理想情況下是using塊。對於SqlConnections,這是否比單獨的using塊更好取決於此類的其他方法以及它們的使用方式。

+0

感謝您的答案。我想可能連接應該在'if(disposing)'塊中被關閉(我剛剛編輯了這個問題,所以它是基於你的響應),但最終決定不是因爲我希望它也可以在析構函數被調用(顯然它並不像那樣工作!)... 我希望這個類的消費者可能忘了類IDisposable的本質。他們需要使用'using'或直接調用'Dispose'使我回到其他實現(在每個方法中使用(新的SqlConnection()){}')。 – vitch 2010-01-07 13:54:19

1

這將起作用,多個使用語句會更有效率。使用DatabaseRecord類的代碼可以在using語句中執行,以便在離開循環時自動清除它。

然而,一個建議是在Dispose方法中檢查Connection對象的狀態,並在調用dispose之前仍然打開時關閉它。

+0

感謝您的答覆:)我認爲,根據這些類的使用量,我寧願在DatabaseRecord類中使用它,即使效率稍微低一點。 Re。關閉連接,就像其他人提到的那樣,在SqlConnection.Dispose中有這樣做的邏輯...... – vitch 2010-01-07 13:59:11

2

connection.Dispose()應該移動到if (disposing) { ... }塊。由於Dispose()將在連接打開時關閉連接,因此不需要撥打Close()

+0

謝謝你的提問 - 我在問題中修復了代碼:) – vitch 2010-01-07 13:55:41

+0

我還有一點評論:爲什麼這個類需要析構函數?你的類不包含非託管資源,所以你不應該爲它實現析構函數/ Finalize()。析構函數會導致一些GC性能損失。我對麼? – 2010-01-08 09:57:01

+0

我不知道!我希望使用析構函數可以防止我的類的用戶不得不明確地'Dispose'(或使用''''),但似乎並非如此... – vitch 2010-01-08 11:04:10

3

所有我見過的建議說,DbConnection S的關係四處尋找最短的時間內保持,所以格式化我寧願在代碼中,我檢討,看看是

using (var connection = new SqlConnection("...")) { ... } 
+0

這就是我最初的樣子接近它,我現在正在傾向於再次的方法 - 謝謝:) – vitch 2010-01-07 13:56:38