2009-07-16 37 views

回答

5

是的,那几乎是一样的。

几乎因为在.NET 2.0中(不确定是否已经修复了更新版本),.FindOne()调用在内存泄漏方面存在一些问题,所以最好的做法是(或者)总是使用.FindAll ()并遍历结果。

马克

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不会被调用如果该集合为空(未找到结果),则会导致内存泄漏,如the MSDN documentation for FindAll的备注部分所述。

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

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

感谢额外的信息...非常有价值! – davidsleeps 2009-07-16 10:30:07