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?
I originally came to the site to ask the same question, but seeing your question gave me the motivation to break out ILSpy and figure out myself if it does do it.
First The dispose function of the search result:
From there I checked
resultSet.Dispose()
(in my case resultSet was aADDNLinkedAttrSet
)You can see the foreach loops where it is itterating over all of the members it has. So it is doing the Dispose for you on each member.
So, yes it does dispose all of the members, and then some.