2016-03-02 8 views
0

Я знаю, что использование SqlConnection внутри используемого блока, как показано ниже, закроет соединение в конце используемого блока.Объекты с SqlConnecions как частные поля закрываются, если объект находится в блоке использования?

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

Я хочу знать, если объект, который имеет SqlConnection частное поле, и используется в использовании заявлении также закрыть соединение следующим образом:

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

public class DatabaseManager 
{ 
    private SqlConnection _connection; 

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

Это не атрибут, это просто личное поле. Вы должны реализовать IDisposable в DatabaseManager и удалить соединение. – Dennis

ответ

2

Если я вас правильно понял, то Класс DatabaseManager используется внутри оператора using, поэтому он должен реализовать IDisposable и, следовательно, имеет собственный метод Dispose.

В этом случае объект SqlConnection будет расположен только если метод Dispose в вашем DatabaseManager классе вызывает Dispose метод, SqlConnection объекта. В этом нет никакой магии. Ваш код должен правильно управлять SqlConnection или у вас возникнут проблемы.

+0

DatabaseManager не реализует IDisposable, не так ли? –

+1

Если вы собираетесь использовать его в инструкции 'using', это необходимо. Компилятор не позволит вам использовать его в инструкции 'using', если он не реализует' IDisposable'. И учитывая то, что вы пытаетесь сделать, это определенно должно быть. –

+0

Не забудьте закрыть соединение sql в методе dispose вашего класса DatabaseManager, как сказал Тони. – RiceRiceBaby

2

Он может, но вам нужно написать код, чтобы сделать это. Вот ваш пример с DatabaseManager, который теперь реализует IDisposable. До того, как оператор using предоставил вам ошибку времени компиляции, поскольку она не реализовала это.

Также _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

Эта ссылка на статью MSDN о том, как реализовать одноразовый шаблон, удобна и что-то, что я раньше не читал. –

 Смежные вопросы

  • Нет связанных вопросов^_^