Запутался, используя "использование" оператора C # - PullRequest
12 голосов
/ 26 октября 2010

Согласно MSDN Library

using Statement (C# Reference)<br> 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 и его область видимости, а также когда, где и зачем его использовать.Спасибо ..

Ответы [ 2 ]

11 голосов
/ 26 октября 2010

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

So

using( x ){
  ...
}

То же, что и

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

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

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

11 голосов
/ 26 октября 2010

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

...