2009-07-16 10 views

Antwort

5

Ja, das wäre fast das Gleiche.

Fast, weil in .NET 2.0 (nicht sicher, ob es in neueren Versionen behoben wurde) hatte der Aufruf .FindOne() einige Probleme mit Speicherverlust, so Best Practice ist (oder war) immer .FindAll verwenden() und iteriere über deine Ergebnisse.

Marc

4

@marc_s ist richtig, mit der Ausnahme, dass der FindOne Speicherverlust Fehler in .NET 1.x war und fixiert ist .NET 2.0 in.

Es geschah, weil die .NET 1.x Implementierung von FindOne ruft FindAll unter die Decke und verfügen nicht immer die Searchresultcollection von FindAll zurückgegeben:

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

In dem obigen Code collection1.Dispose wird nicht aufgerufen wenn die Sammlung leer ist (kein Ergebnis gefunden wird), was zu einem Speicherverlust führt, wie in dem Abschnitt Bemerkungen von the MSDN documentation for FindAll beschrieben.

Sie können FindOne in .NET 2.0 sicher verwenden. Oder wenn Sie FindAll verwenden, müssen Sie Sie die zurückSearchResultCollection stellen Sie sicher entsorgen, oder Sie werden den gleichen Speicherleck, z.B .:

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

Dank für die zusätzliche Informationen ... sehr wertvoll! – davidsleeps