@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;
}
}