2016-03-02 21 views
0

我知道在像下面這樣的使用塊內部使用SqlConnection會關閉使用塊末尾的連接。如果對象位於使用塊中,那麼將SqlConnecions作爲專用字段的對象會關閉?

using (var connection = factory.NewSqlConnection()) 
{ 
    //code 
} 

我想知道,如果有一個SqlConnection私人領域,一個using語句使用的對象也將關閉,像這樣的連接:

using (var db = factory.NewDatabaseManager()) 
{ 
    //code 
} 

public class DatabaseManager 
{ 
    private SqlConnection _connection; 

    public DatabaseManager(SqlConnection connection) 
    { 
     _connection = connection; 
    } 
} 
+1

這不是一個屬性,它只是一個私人領域。您應該在DatabaseManager中實現IDisposable並處理連接。 – Dennis

回答

2

如果我理解正確的話,則DatabaseManager類用於using語句中,因此它必須實現IDisposable,因此它有自己的Dispose方法。

在這種情況下,SqlConnection對象將只如果你的DatabaseManagerDispose方法調用SqlConnection對象的Dispose的方法除掉。沒有什麼魔法可以實現這一點。您的代碼必須正確管理SqlConnection,否則您將遇到問題。

+0

DatabaseManager不執行IDisposable,應該嗎? –

+1

如果你打算在'using'語句中使用它,它必須。編譯器不會讓你在'using'語句中使用它,除非它實現了'IDisposable'。考慮到你想要做什麼,它肯定應該。 –

+0

不要忘記像Tony說的那樣關閉DatabaseManager類的dispose方法上的sql連接。 – RiceRiceBaby

2

它可以但你必須編寫代碼來做到這一點。這裏是您的DatabaseManager現在實現IDisposable的例子。在使用語句會給你一個編譯時錯誤之前,因爲它沒有實現。

另外下面的_connection被稱爲field,而不是attribute,這是完全不同的東西。

在開始在類型中實現IDisposable之前,請參閱實現IDisposable的正確方法,就像它永遠不會拋出異常一樣。這是Microsoft take on the Dispose pattern,它是一個很好的清單,說明要做什麼以及要避免什麼。

using (DatabaseManager db = factory.NewDatabaseManager()) 
{ 
    //code 
} 

public class DatabaseManager : IDisposable 
{ 
    private SqlConnection _connection; 

    public DatabaseManager(SqlConnection connection) 
    { 
     _connection = connection; 
    } 

    // basic implementation of IDisposable 
    public void Dispose() { 
     _connection.Dispose(); 
    } 
} 
+1

關於如何實現Disposable模式的MSDN文章的鏈接很方便,而且我以前沒有讀過。 –

相關問題