Can't find anything in the MSDN documentation on this.
I.e. is it enough to do, say:
using(PrincipalSearcher searcher = ...)
{
foreach (var principal in searcher.FindAll())
{
... do something ...
} // The PrincipalSearchResult<T> returned by searcher.FindAll is disposed here
}
which is what most examples I've seen do, or should I do:
using(PrincipalSearcher searcher = ...)
{
foreach(var principal in searcher.FindAll())
{
using (principal)
{
// ... do something ...
}
}
}
The latter (explicitly disposing each item during iteration) looks "safer" - i.e. conforms to the guideline to explicitly dispose all IDisposable objects - but it's a bit messy; for example, it precludes the use of LINQ to iterate over search results.
In response to @Rup's comment:
you could write a yield iterator that returned one result from the parent iterator
Yes, I think that would work to enable LINQ. Something like the following extension method:
public static IEnumerable<T> EnumerateAndDispose<T>(this IEnumerable<T> collection) where T : IDisposable
{
foreach (T item in collection)
{
using (item)
{
yield return item;
}
}
}
which can be used as:
searcher.FindAll().EnumerateAndDispose().Select(... use LINQ ...)
But is it necessary?