2015-12-04 2 views
3

У меня есть следующий код:SQL конструктор соединения вне с помощью заявления

SqlConnection Connect = new SqlConnection(IST_DBConnect.SQLConnectionString); 
SqlCommand command = new SqlCommand(sqlCommandString, Connect); 
RequestRow Result = new RequestRow(); 
Connect.Open(); 
using (Connect) 
... 

Это не мой код, я бы написать создание SQL Connection в использовании заявление, это код моего друга , Я точно не уверен, что это будет правильно утилизировать объект соединения SQL, если что-то пойдет не так в конструкторе или в методе Open. Поэтому мой вопрос заключается в том, создан ли объект соединения, и метод open генерирует исключение => соединение никогда не открывается, будет ли это правильно установлено?

Спасибо.

+0

Пройдите по этой ссылке http://stackoverflow.com/questions/75401/uses-of-using-in-c-sharp –

+0

В 'using' заявления внутренне реализации' finally' блока, и даже в случае исключения, он гарантирует, что объект «правильно расположен» – Yogi

ответ

4

От documentation;

Как правило, при использовании IDisposable объект, вы должны объявить и Instantiate это в с помощью операторов.

и

Вы можете создать экземпляр объекта ресурса, а затем передать переменную с помощью заявления, , но это не лучшая практика. В этом случае объект остается в области видимости после того, как элемент управления оставит блок использования даже , хотя он, вероятно, больше не будет иметь доступа к своим неуправляемым ресурсам. Другими словами, он больше не будет полностью инициализирован. Если вы пытаетесь использовать объект за пределами используемого блока, вы рискуете вызвать исключение . По этой причине обычно лучше создать экземпляр объекта в инструкции using и ограничить его область применения используемым блоком.

Основываясь на вашем примере, если нечто идет неправильно в конструктор, из Open метода, нет ничего usingможет сделать, так как вы используете его в качестве ресурса после вы его инициализации.

Уверенный, что это лучший способ;

using(var Connect = new SqlConnection(IST_DBConnect.SQLConnectionString)) 
using(var command = Connect.CreateCommand()) 
{ 
    // 
} // <-- Both Connect and command will disposed here no matter exception is thrown or not