我正在使用.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
,包括搜索返回的所有用户以及搜索结果集本身。
处置domain
和group
对象并不是什么大问题(使用using()
块会很容易)但是我如何处理每个结果?我是否真的必须遍历users
集合并处理每一个?
答案 0 :(得分:4)
IDisposable
合同就是合同。预计会被遵循。如果你不“需要调用Dispose”,他们就不会实施合同......
实际上,您无法确切知道Principal
的特定实例正在使用什么类型的对象。有时,您做必须处理它,有时您不。除非你知道Principal
的特定工具的某些内部结构,否则你真的没有在运行时讲述的方法。例如,如果Principle实例中的基础对象是DirectoryEntry
,那么您应该将其处置掉。但是,你没有真正的方法在运行时告诉底层对象是什么。即使您可以,简单地调用Dispose
也会更容易。