#c# #using #named-scope
#c# #использование #named-scope
Вопрос:
Согласно библиотеке MSDN
using Statement (C# Reference)
Defines a scope, outside of which an object or objects will be disposed.
Но я получил этот код, размещенный здесь каким-то пользователем, и я запутался в этом: (пожалуйста, смотрите мой комментарий к коду)
using (OleDBConnection connection = new OleDBConnection(connectiongString))
{
if (connection.State != ConnectionState.Open)
connection.Open();
string sql = "INSERT INTO Student (Id, Name) VALUES (@idParameter, @nameParameter)";
using (OleDBCommand command = connection.CreateCommand())
{
command.CommandText = sql;
command.CommandType = CommandType.Text;
OleDBParameter idParameter = command.CreateParameter();
idParameter.DbType = System.Int32;
idParameter.Direction = Parameterdirection.Input;
idParameter.Name = "@idParameter";
idParameter.Value = studentId;
OleDBParameter nameParameter = command.CreateParameter();
try
{
command.ExecuteNonQuery();
}
finally
{
// Is it still necessary to dispose these objects here?
command.Dispose();
connection.Dispose();
}
}
}
Правильно ли используется using
инструкция в приведенном выше коде?
Я в замешательстве, может кто-нибудь, пожалуйста, объяснить, как использовать using
инструкцию и ее область видимости, а также когда, где и почему ее использовать. Спасибо..
Ответ №1:
Инструкция using — это сокращение для ручной установки try/finally
блока.
Итак
using( x ){
...
}
Это то же самое, что
try{
...
}finally{
if( x != null ){ x.Dispose(); }
}
И они будут генерировать тот же IL при компиляции.
Компилятор выдаст вам ошибку в случае, если x
не реализует IDisposable
.
Комментарии:
1. фактически то же самое с if(x != null){ ((IDisposable)x).Dispose(); } — с использованием инструкции (ссылка на C #) bit.ly/acmoOD
2. Мне грустно, что только потому, что я опубликовал свой ответ за минуту до вас, у меня (в настоящее время) вдвое больше голосов, это не сулит ничего хорошего для SO, ваш вопрос никоим образом не уступает моему, но из-за того, что вы недостаточно быстро нарисовали, он (вероятно) не поднимется выше моего.
3. Я думаю, что на данный момент SO работает именно так, и я не уверен, есть ли для этого быстрое «исправление». К сожалению, это способствует получению быстрых ответов вместо хорошо продуманных. Я часто ловлю себя на том, что пишу быстрый ответ, даже если знаю, что мне нужно будет отредактировать его позже, чтобы не быть окончательно запутанным. Я некоторое время думал об этом, и одно из моих предложений заключается в том, что после публикации вопроса ответы не будут отображаться в течение 10 минут, а затем через 10 минут все ответы, написанные за этот период времени, отображаются в случайном порядке с той же временной меткой. Может быть хорошей идеей 😉
4. Это может сместить фокус на то, чтобы на самом деле написать достаточно хороший ответ за эти 10 минут, чтобы он был лучше других, когда ответы будут показаны общественности, вместо того, чтобы просто публиковать его «там» как можно скорее, независимо от содержания. Я думаю, что ваш ответ на эти вопросы также хорош, так что благодаря этому, я думаю, у нас должно быть примерно одинаковое количество голосов. Я надеюсь, что сотрудники SO предпримут некоторые меры для устранения этих проблем после того, как они все обдумают.
Ответ №2:
finally
Блок (и, следовательно, в данном случае try
) является избыточным, вот что using
делает, он вызывает Dispose
IDisposable
объект, с помощью которого он инициализируется, когда using
блок заканчивается (независимо от исключений или их отсутствия).