2009-07-16 34 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