2

在 .net 中使用 DirectorySearcher 时,这两个语句是否相等?

两者相同:

Dim ds As New DirectorySearcher
' code to setup the searcher

第一个声明

ds.FindOne()

第二个声明

ds.SizeLimit = 1
ds.FindAll()

...除了显然 FindOne() 返回一个 SearchResult 对象和 FindAll() 返回一个 SearchResultCollection 对象

4

2 回答 2

5

Yes, that would be almost the same.

Almost, because in .NET 2.0 (not sure if it's been fixed in more recent versions), the .FindOne() call had some issues with leaking memory, so best practice is (or was) to always use .FindAll() and iterate over your results.

Marc

于 2009-07-16T05:45:13.603 回答
4

@marc_s 是对的,除了 FindOne 内存泄漏错误在 .NET 1.x 中并在 .NET 2.0 中修复。

发生这种情况是因为 FindOne 的 .NET 1.x 实现在后台调用 FindAll,并且并不总是处理 FindAll 返回的 SearchResultCollection:

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

在上面的代码中,如果集合为空(未找到结果),则不会调用 collection1.Dispose,从而导致内存泄漏,如FindAll 的 MSDN 文档的备注部分所述。

您可以在 .NET 2.0 中安全地使用 FindOne。或者,如果您使用 FindAll,则需要确保处理返回的 SearchResultCollection,否则您将有相同的内存泄漏,例如:

public SearchResult MyFindOne()
{
    using(SearchResultCollection results = this.FindAll(false))
    {
        if(results.Count > 0) return results[0];
        return null;
    }
}
于 2009-07-16T06:18:19.340 回答