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