2009-07-16 2 views
2

.net에서 DirectorySearcher를 사용하는 경우이 두 명령문은 같은 값입니까?은 FindOne() [DirectoryServices/.net]과 동일한 FindAll()에 대해 DirectorySearcher.SizeLimit = 1입니다.

모두 동일 :

Dim ds As New DirectorySearcher 
' code to setup the searcher 

먼저 문

ds.FindOne() 

분명히 FindOne()가 같은 SearchResult 객체와 findall은을 반환하는 것을 제외하고 두 번째 문

ds.SizeLimit = 1 
ds.FindAll() 

() SearchResultCollection 개체를 반환합니다.

답변

5

예, 거의 같습니다.

거의. NET 2.0 (최신 버전에서 수정되었는지 확실하지 않음) .FindOne() 호출에 메모리 누수 문제가 있으므로, 모범 사례는 항상 .FindAll을 사용하는 것입니다.()를 반복하고 결과를 반복합니다.

마크

4

@marc_s는 FindOne 메모리 누수 버그는 .NET 1.x에서에 있었고, .NET 2.0에서 해결 된 것을 제외하고, 권리입니다. 호출되지 않습니다

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

위의 코드 collection1.Dispose에서 : FindOne의 .NET 1.x의 구현이 내부적으로 findall은을 호출하고 항상 findall은에 의해 반환 된 SearchResultCollection을 처리하지 않기 때문에

그것은 무슨 일이 있었 컬렉션이 비어있는 경우 (결과가 없음) 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