2013-02-12 88 views
6

我正在用.NET的System.DirectoryServices.AccountManagement命名空间做一些Active Directory工作。我注意到Principal实现了IDisposable,这导致了一种头痛,因为所有的都在那个命名空间中继承了Principal我真的需要在每个Principal上调用Dispose()吗?

E.g.考虑下面的代码让所有的用户组中:

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

在该段每一个类型实现IDisposable,包括所有由搜索并设置自己的搜索结果返回用户。

处理domaingroup对象并不是什么大事(对using()块来说很容易),但是我对每个结果做了什么?我是否真的需要循环收集并处理每一个?

+0

FWIW,[GroupPrincipal.GetMembers](http://msdn.microsoft.com/en-us/library/bb339975.aspx)仅显示正在处理的组。我找不到任何明确声明“会员一生所有权”合同的文档(还没有):+1,因为我确实发现了这个特定的合同(或者可能缺乏这个合同),这很有趣。但是,这是我的[关于IDisposable合同的一般视图](http://stackoverflow.com/a/14781766/166390)。 – 2013-02-12 21:19:28

+2

这里的答案可能有所帮助:http://stackoverflow.com/a/14627265/2258 – 2013-02-12 21:26:03

回答

4

IDisposable合同就是这样一个合同。预计将遵循。如果您没有“需要调用Dispose”,他们就不会执行合同...

实际上,您无法真正知道某个特定实例使用的对象类型是什么有时,您必须处置它,有时候你不要。除非你知道某个特定实现的内部部分,否则你实际上没有办法在运行时告诉它。例如,如果Principle实例中的基础对象是DirectoryEntry,那么您应该处置它。但是,您并没有真正的方法来在运行时告诉底层对象是什么。即使你可能,简单地称为Dispose似乎更容易。

+2

对,我知道所有东西都需要处置。我只是觉得我在“负责”这个问题上感到困惑。我通常的假设是,如果我实例化一个对象,我负责清理它,但显然不适用于这些类。 MSDN文档完全没有帮助:他们的大多数样本根本没有Dispose()调用。 – 2013-02-12 23:59:46