2
try
{
  using (MapDataContainer ent = new MapDataContainer()) //is an autogen'd EF object
  {
     //do some stuff, assume it throws an error
  }
}
catch(Exception ex) //catching outside using not sure if IDispose called
{
  //handle error
}

通常、EFオブジェクトでIDisposeと呼ばれる使用法を理解しています。それで、それが例外を投げたとしたら...これはメモリリークの可能性のあるシナリオですか?

4

3 に答える 3

6

大丈夫だよ。「使用する」ことは実際には試みです。最終的には変装します。

于 2012-05-18T19:01:51.040 に答える
2

usingステートメントは実際には

ResourceType resource = expression;
try {
   statement;
}
finally {
   if (resource != null) ((IDisposable)resource).Dispose();
}

ご覧のとおり、Disposeは常に呼び出されます。唯一の例外は、それがCLRエラーである場合ですが、その場合はとにかく運が悪いです。

于 2012-05-18T19:02:42.087 に答える
2

MSDNが言うように、usingステートメントはC#コンパイラによって変換され、IDisposable.Dispose()が呼び出されることを確認するために最後にブロックします。

{
  MapDataContainer ent = new MapDataContainer();
  try
  {
    ...
  }
  finally
  {
    if (ent != null)
      ((IDisposable)ent).Dispose();
  }
}

IDisposable.Dispose()が呼び出されない場合は、Environment.FailFastがステートメントブロックを使用して内部で呼び出された場合、またはMapDataContainer()のコンストラクターの内部または直後に例外がスローされた場合のみですが、これでもガベージコレクターの収集が妨げられることはありません。このオブジェクト。さらに、IDisposableを実装するオブジェクトは通常(必ずしもそうとは限りませんが)デストラクタでIDisposable.Dispose()を呼び出し、プログラマーが手動で呼び出すことを忘れたり、usingステートメントでラップしたりした場合でもアンマネージリソースが正しく解放されるようにします。

于 2012-05-18T19:17:47.173 に答える