Как преобразовать блок try-catch-finally в оператор using в c#? - PullRequest
1 голос
/ 25 февраля 2020

Скажем, мы создаем объект IDisposable, и у нас есть блок try-catch-finally

var disposable= CreateIDisposable();
try{
  // do something with the disposable.
}catch(Exception e){
  // do something with the exception
}finally{
  disposable.Dispose();
}

Как мне преобразовать его в блок использования?

Если бы это было

var disposable= CreateIDisposable();
try{
  // do something with the disposable.
}finally{
  disposable.Dispose();
}

Я бы преобразовал в

using(var disposable= CreateIDisposable()){
     // do something with the disposable.
}

Как бы я сделал это с блоком catch?

try{
  using(var disposable= CreateIDisposable()){
     // do something with the disposable.
   }
}catch(Exception e){
  // do something with the exception
}

1 Ответ

3 голосов
/ 25 февраля 2020

Ты рядом. Это наоборот.

На самом деле, CLR не имеет try / catch / finally. Он имеет try / catch, try / finally и try / filter (это то, что он делает, когда выражение when используется в catch). try / catch / finally в C# - это просто try / catch в блоке try try / finally.

Так что если вы разверните это и конвертируйте try / finally в using, вы получите это:

using (var disposable = CreateIDisposable())
{
    try
    {
        // do something with the disposable.
    }
    catch (Exception e)
    {
        // do something with the exception
    }
}
...