Если исключение происходит в операторе using, объект все еще удаляется? - PullRequest
46 голосов
/ 29 ноября 2011

Если в операторе using возникает исключение, объект все еще удаляется?

Причина, по которой я спрашиваю, состоит в том, что я пытаюсь решить, делать ли попытку, пойманную вокруг всего блока кода или внутри внутреннего оператора using. Принимая во внимание, что некоторые исключения повторно создаются в рамках блока захвата.

using (SPSite spSite = new SPSite(url))
{
   // Get the Web
   using (SPWeb spWeb = spSite.OpenWeb())
   {
       // Exception occurs here
   }
}

Ответы [ 4 ]

46 голосов
/ 29 ноября 2011

Да, они будут.

using(SPWeb spWeb = spSite.OpenWeb())
{
  // Some Code
}

эквивалентно

{
  SPWeb spWeb = spSite.OpenWeb();
  try
  {

    // Some Code
  }
  finally
  {
    if (spWeb != null)
    {
       spWeb.Dispose();
    }
  }
}

Редактировать

После ответа на этот вопрос я написал более подробный пост о IDisposable и использование конструкции в моем блоге.

8 голосов
/ 29 ноября 2011

Да. Оператор using переводит примерно в следующую конструкцию:

IDisposable x;
try
{
    ...
}
finally
{
    x.Dispose();
}
6 голосов
/ 29 ноября 2011

Да, это так.Это все равно, что обернуть ваш код в try-finally (и уничтожить в finally).

2 голосов
/ 29 ноября 2011

Оператор using вызывает создание полного и правильного шаблона dispose, поэтому ответ - да.

...