.net - 我真的需要在每个Principal上调用Dispose()吗?

标签 .net resources dispose iprincipal groupprincipal

我正在使用.NET的System.DirectoryServices.AccountManagement命名空间进行一些Active Directory工作。我注意到Principal实现了IDisposable,这引起了一些麻烦,因为该命名空间中的所有内容都继承了Principal

例如。考虑以下代码以获取组中的所有用户:

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

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

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

最佳答案

IDisposable契约(Contract)就是那个契约(Contract)。预计将被遵循。如果您“不需要调用Dispose”,他们将不会执行契约(Contract)。

实际上,您无法真正分辨出Principal的特定实例正在使用哪种类型的对象。有时候,您必须处置它,有时则不需要。除非您知道Principal特定实现的某些内部知识,否则您实际上无法在运行时进行告知。例如,如果Principle实例中的基础对象是DirectoryEntry,则应将其处置。但是,您没有真正的方法在运行时告诉该基础对象是什么。即使可以,简单地调用Dispose似乎也更容易。

关于.net - 我真的需要在每个Principal上调用Dispose()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841844/

相关文章:

c# - StreamReader 和 Dispose

vb.net - SqlCommand(使用语句/处置问题)

.net - 缺少调试|项目的任何 CPU 构建配置并在 Windows x64 上默认为调试|x86

c# - 全屏窗口形式但带有标题栏

.net - 翻译数据库字符串

Qt:如何关闭配置文件中的资源压缩?

c# - 如果使用 Autofac.Extras.Quartz,则依赖注入(inject)不起作用

ios - Swift 开发过程中,资源文件放在哪里?

jsp - 如何使用相对路径而不包含上下文根名称?

c# - 在终结器中抛出异常以强制执行 Dispose 调用 :