我真的需要在每个校长上调用Dispose()吗?

时间:2013-02-12 21:07:25

标签: .net resources dispose iprincipal groupprincipal

我正在使用.NET的System.DirectoryServices.AccountManagement命名空间进行一些Active Directory工作。我注意到Principal实现了IDisposable,这导致了一种令人头痛的问题,因为该命名空间中的所有都继承了Principal

E.g。考虑以下代码以获取组中的所有用户:

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

该代码段中的每个类型都会实现IDisposable,包括搜索返回的所有用户以及搜索结果集本身。

处置domaingroup对象并不是什么大问题(使用using()块会很容易)但是我如何处理每个结果?我是否真的必须遍历users集合并处理每一个?

1 个答案:

答案 0 :(得分:4)

IDisposable合同就是合同。预计会被遵循。如果你不“需要调用Dispose”,他们就不会实施合同......

实际上,您无法确切知道Principal的特定实例正在使用什么类型的对象。有时,您必须处理它,有时您。除非你知道Principal的特定工具的某些内部结构,否则你真的没有在运行时讲述的方法。例如,如果Principle实例中的基础对象是DirectoryEntry,那么您应该将其处置掉。但是,你没有真正的方法在运行时告诉底层对象是什么。即使您可以,简单地调用Dispose也会更容易。