web-dev-qa-db-ja.com

usingステートメント内で例外が発生しても、オブジェクトは破棄されますか?

Usingステートメント内で例外が発生しても、オブジェクトは破棄されますか?

私が尋ねている理由は、コードブロック全体を囲むか、内部のusingステートメント内で試行を行うかを決定しようとしているためです。特定の例外は、catchブロック内の設計によって再スローされていることに留意してください。

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

はい、そうします。

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

に相当

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

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

編集する

この質問に答えた後、ブログに IDisposable and Using 構成に関する詳細な投稿を書きました。

47
Anders Abel

はい。 usingステートメントは、およそ次の構文に変換されます。

IDisposable x;
try
{
    ...
}
finally
{
    x.Dispose();
}
8
spender

はい、そうです。これは、try-finallyでコードをラップする(そして、finallyで破棄する)ようなものです。

6
Phil Lambert

usingステートメントにより、完全で適切なdisposeパターンが生成されるため、答えは「はい」です。

2
Oded