9

System.DirectoryServices.AccountManagement.NET の名前空間を使用して Active Directory の作業を行っています。その名前空間のすべてが を継承するため、それはある種の頭痛の種を引き起こすことに気付きPrincipalました。IDisposablePrincipal

たとえば、グループ内のすべてのユーザーを取得するには、次のコードを検討してください。

PrincipalContext domain = new PrincipalContext(ContextType.Domain);
GroupPrincipal group = GroupPrincipal.FindByIdentity(domain, "MyGroup");
PrincipalSearchResult<Principal> users = group.GetMembers();

IDisposable検索によって返されたすべてのユーザーと検索結果セット自体を含め、そのスニペットのすべてのタイプが を実装します。

domainandオブジェクトを破棄するgroupことは大したことではありません (using()ブロックを使えば簡単です) が、すべての結果についてはどうすればよいでしょうか? usersそのコレクションをループして、すべてを破棄する必要がありますか?

4

1 に答える 1

4

IDisposable契約はまさにそれ、契約です。従うことが予想されます。「Disposeを呼び出す必要がない」場合、彼らは契約を実装していなかったでしょう...

実際には、オブジェクトの特定のインスタンスがどのタイプのオブジェクトを使用しているかを実際に判断することPrincipal はできませ。の特定の実装の内部の一部を知っていない限り、実行時に伝える方法は本当にありませんPrincipal。たとえば、プリンシパル インスタンスの基になるオブジェクトが である場合はDirectoryEntry、それを破棄する必要があります。しかし、その基礎となるオブジェクトが何であるかを実行時に伝える実際の方法はありません。できたとしても、単純に を呼び出す方が簡単に思えますDispose

于 2013-02-12T21:58:51.337 に答える