2015-09-05 1 views
0

я наткнулся на фрагмент кода, как следующее:"using" statement in C# - Это вложенный try/finally?

using (IDbCommand selectCommand = this.createCommand(selectSQL)) 
using (IDataReader theData = selectCommand.ExecuteReader()) 
{ 
    while (theData.Read()) 
    { 
    Phone aPhone = new Phone(...some code here...); 
    thePhones.Add(aPhone); 
    } 
} 

Теперь я пытаюсь научиться using заявление в связи с этим в интерпретируя выше кода в старом try/finally заявлении. По моему мнению, оператор using интерпретирует код после скобок как try. В этом случае try должен приложить все вещи после (IDbCommand selectCommand = this.createCommand(selectSQL)). Однако в этом коде есть еще одно заявление using сразу же после первого using.

Правильно ли их интерпретировать как Вложенноеtry/finally заявление в этом контексте?

+2

'using' инструкция не имеет ничего о try/catch https://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+0

Я согласен с @FabioLuz. Это не имеет ничего общего с попыткой поймать. Я обычно обертываю свои заявления с помощью try/catch. – Anonymous

+1

@FabioLuz. Этот вопрос также не имеет ничего о try/catch, только try/finally :) –

ответ

3

Использование операторов будет автоматически вызывать Dispose() для любого объекта IDisposable внутри декларации. Важно отметить, что это не замена каких-либо заявлений try/catch/finally, которые могут потребоваться вашему собственному коду. Оператор using гарантирует, что Dispose() будет вызываться, если какой-либо код внутри его блока выбрасывается или нет. Это чрезвычайно важно, когда используются объекты ввода-вывода, такие как сетевые вызовы, чтение потока, вызовы базы данных и т. Д. Это гарантирует, что у вас нет утечек памяти или заблокированных файлов.

using (IDbCommand selectCommand = this.createCommand(selectSQL)) 
{ 
    //an exception or not will call Dispose() on selectCommand 

    using (IDataReader theData = selectCommand.ExecuteReader()) 
    { 
     //an exception or not will call Dispose() on theData 

     while (theData.Read()) 
     { 
      Phone aPhone = new Phone(...some code here...); 
      thePhones.Add(aPhone); 
     } 
    } 
} 

«эквивалентный» для выполнения этого кода без использования заявлений будет:

var selectCommand = this.createCommand(selectSQL); 
try 
{ 
    var theData = selectCommand.ExecuteReader(); 
    try 
    { 
     while (theData.Read()) 
     { 
      Phone aPhone = new Phone(...some code here...); 
      thePhones.Add(aPhone); 
     } 
    } 
    finally 
    { 
     if (theData != null) 
     { 
      theData.Dispose(); 
     } 
    } 
} 
finally 
{ 
    if (selectCommand != null) 
    { 
     selectCommand.Dispose(); 
    } 
} 

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

+0

@ Zotta Я не понимаю, что вы meen, все три ответа говорят одно и то же, даже если вы не используете фигурные скобки, используемые операторы все еще вложены. –

+0

Обратите внимание, что 'использование' немного сложнее, чем показано, поскольку оно сохраняет/проверяет исходное значение, но для целей этого вопроса это упрощение не имеет значения. –

0
using (IDbCommand selectCommand = this.createCommand(selectSQL)) 
using (IDataReader theData = selectCommand.ExecuteReader()) 
{ 
} 

Во время компиляции будут преобразованы в

using (IDbCommand selectCommand = this.createCommand(selectSQL)) 
{ 
    using (IDataReader theData = selectCommand.ExecuteReader()) 
    { 
    } 
} 

Только что. И это не связано, чтобы попытаться поймать ни в чем

0

Да, ваш код интерпретируется как

using (IDbCommand selectCommand = this.createCommand(selectSQL)) 
{ 
    using (IDataReader theData = selectCommand.ExecuteReader()) 
    { 
     while (theData.Read()) 
     { 
     Phone aPhone = new Phone(...some code here...); 
     thePhones.Add(aPhone); 
     } 
    } 
} 

, которые можно было бы думать как «вложенными TRY/наконец блоков»

Использование множественного using заявления просто как с несколькими if заявления, вы могли бы сделать

if(foo) 
if(bar) 
{ 
    DoStuff() 
} 

Что такое же, как

if(foo) 
{ 
    if(bar) 
    { 
     DoStuff() 
    } 
}