Active Directory 内のユーザやグループの検索で 4「クエリを実行して結果を取得する」のコード部分に using を使ってます。
DirectorySearcher.FindAll メソッドは SearchResultCollection オブジェクトを返します。
SearchResultCollection クラスは SearchResult クラスのコレクションクラスです。
SearchResult クラスは Object クラスから継承されているだけのクラスです。
ヘルプの解説には次のように書かれてます。
SearchResult クラスのインスタンスは、DirectoryEntry クラスのインスタンスに非常に似ています。大きな違いは、DirectoryEntry クラスは新しいオブジェクトにアクセスするたびに Active Directory ドメイン サービス階層から情報を取得しますが、SearchResult のデータは DirectorySearcher クラスで実行したクエリが返す SearchResultCollection の中で既に利用できるようになっていることです。
DirectoryEntry クラスは、IDisposable インターフェイスを実装した Component クラスから継承されてるので、そこが大きな違いとして表れてるんでしょうかね。
Object クラスから継承されているだけの(というより IDisposable インターフェイスを実装してない) SearchResult クラスですが、そのコレクションクラスである SearchResultCollection クラスは、MarshalByRefObject クラスから継承され ICollection、IEnumerable、IDisposable インターフェイスを実装してます。
using が使えるのは SearchResultCollection クラスが IDisposable インターフェイスを実装したクラスだからですね。
ヘルプの解説には次のように書かれてます。
実装上の制約により、そのアンマネージ リソースがガベージ コレクションされた場合、SearchResultCollection クラスは一部のアンマネージ リソースを解放できません。メモリ リークを回避するには、SearchResultCollection オブジェクトが不要になったときに Dispose メソッドを呼び出す必要があります。
コレクションクラスが IDisposable インターフェイスを実装してるってなんか変わってるなぁ。
COMである ADSI の検索ハンドルの値を保持してる(IntPtr 型の Handle プロパティ)からかぁ。
コレクションクラスのインスタンスを返すところに using 使うのは違和感あるけどちゃんと使わないといけないですね。