Подтвердить что ты не робот

Confused с использованием "использования" Statement С#

Согласно Библиотека 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 и его область охвата и когда, где и зачем его использовать. Спасибо..

4b9b3361

Ответ 1

Оператор using является сокращением для ручной установки блока try/finally.

Итак,

using( x ){
  ...
}

То же, что и

try{
  ...
}finally{
  if( x != null ){ x.Dispose(); }
}

И они сгенерируют тот же IL при компиляции.

Компилятор даст вам ошибку в случае, если x не реализует IDisposable.

Ответ 2

Блок finally (и, следовательно, в этом случае try) является избыточным, что делает using, он вызывает Dispose в объекте IDisposable, с которым он инициализируется, когда using (независимо от исключений или их отсутствия).