В документации 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:
вы можете написать итератор производительности, который возвратил один результат из родительского итератора
Да, я думаю, что это поможет работать с 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 ...)
Но нужно ли это?