DirectorySearcher.SizeLimit = 1 для FindAll () равно FindOne () [DirectoryServices / .net] - PullRequest
2 голосов
/ 16 июля 2009

При использовании DirectorySearcher в .net равны ли эти два оператора?

То же самое для обоих:

Dim ds As New DirectorySearcher
' code to setup the searcher

Первое высказывание

ds.FindOne()

Второе утверждение

ds.SizeLimit = 1
ds.FindAll()

... за исключением того, что FindOne () возвращает объект SearchResult, а FindAll () возвращает объект SearchResultCollection

Ответы [ 2 ]

5 голосов
/ 16 июля 2009

Да, это было бы почти то же самое.

Почти, потому что в .NET 2.0 (не уверен, было ли это исправлено в более поздних версиях), вызов .FindOne () имел некоторые проблемы с утечкой памяти, поэтому рекомендуется всегда (или было) использовать .FindAll ( ) и переберите ваши результаты.

Марк

4 голосов
/ 16 июля 2009

@ marc_s прав, за исключением того, что ошибка утечки памяти FindOne была в .NET 1.x и исправлена ​​в .NET 2.0.

Это произошло потому, что реализация .NET 1.x FindOne вызывает FindAll под прикрытием и не всегда располагает коллекцией SearchResultCollection, возвращаемой FindAll:

public SearchResult FindOne()
{
    SearchResultCollection collection1 = this.FindAll(false);
    foreach (SearchResult result1 in collection1)
    {
       collection1.Dispose();
       return result1;
    }
    return null;
}

В приведенном выше коде collection1. Dispose не будет вызываться, если коллекция пуста (результат не найден), что приводит к утечке памяти, как описано в разделе примечаний документации MSDN для FindAll .

Вы можете безопасно использовать FindOne в .NET 2.0. Или, если вы используете FindAll, вам нужно убедиться, что вы удалили возвращенную SearchResultCollection, или у вас будет та же утечка памяти, например ::

public SearchResult MyFindOne()
{
    using(SearchResultCollection results = this.FindAll(false))
    {
        if(results.Count > 0) return results[0];
        return null;
    }
}
...