18

このようなusingブロックを持つメソッドがある場合...

    public IEnumerable<Person> GetPersons()
    {
        using (var context = new linqAssignmentsDataContext())
        {
            return context.Persons.Where(p => p.LastName.Contans("dahl"));
        }
    }

... usingブロック内から値を返す場合でも、IDisposableオブジェクトは破棄されますか?

4

2 に答える 2

29

はい、そうです。オブジェクトの破棄は、return呼び出しに直面しても実行されるfinallyブロックで発生します。それは本質的に次のコードに拡張されます

var context = new linqAssignmentsDataContext();
try {
  return context.Persons.Where(p => p.LastName.Contans("dahl"));
} finally {
  if ( context != null ) {
    context.Dispose();
  }
}
于 2010-02-17T22:06:50.617 に答える
7

MSDNドキュメントから:

usingステートメントは、オブジェクトのメソッドの呼び出し中に例外が発生した場合でも、Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、finallyブロックでDisposeを呼び出すことで、同じ結果を得ることができます。実際、これはusingステートメントがコンパイラーによって変換される方法です。

したがって、オブジェクトは常に破棄されます。電源ケーブルを抜かない限り。

于 2010-02-17T22:08:45.697 に答える