これに関するMSDNドキュメントに何も見つかりません。
つまり、次のように言うだけで十分です。
using(PrincipalSearcher searcher = ...)
{
foreach (var principal in searcher.FindAll())
{
... do something ...
} // The PrincipalSearchResult<T> returned by searcher.FindAll is disposed here
}
これは私が見たほとんどの例が行うことです、または私がすべきことです:
using(PrincipalSearcher searcher = ...)
{
foreach(var principal in searcher.FindAll())
{
using (principal)
{
// ... do something ...
}
}
}
後者(反復中に各アイテムを明示的に破棄する)は「より安全」に見えます。つまり、すべてのIDisposableオブジェクトを明示的に破棄するためのガイドラインに準拠していますが、少し面倒です。たとえば、検索結果を反復処理するためにLINQを使用することはできません。
@Rupのコメントに応えて:
親イテレータから1つの結果を返すyieldイテレータを記述できます
はい、それはLINQを有効にするために機能すると思います。次の拡張メソッドのようなもの:
public static IEnumerable<T> EnumerateAndDispose<T>(this IEnumerable<T> collection) where T : IDisposable
{
foreach (T item in collection)
{
using (item)
{
yield return item;
}
}
}
これは次のように使用できます。
searcher.FindAll().EnumerateAndDispose().Select(... use LINQ ...)
しかし、それは必要ですか?