Удаляет ли PrincipalSearchResult автоматически все элементы в своей коллекции?

Ничего не могу найти в документации 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 ...)

Но так ли это необходимо?

13
задан Joe 23 May 2012 в 09:22
поделиться