gpt4 book ai didi

.net - PrincipalSearchResult 是否自动处理其集合中的所有元素?

转载 作者:行者123 更新时间:2023-12-03 23:32:43 27 4
gpt4 key购买 nike

在 MSDN 文档中找不到关于此的任何内容。

IE。这样做就足够了,说:

using(PrincipalSearcher searcher = ...)
{
foreach (var principal in searcher.FindAll())
{
... do something ...
} // The PrincipalSearchResult<T> returned by searcher.FindAll is disposed here
}

这是我见过的大多数例子所做的,或者我应该做的:
using(PrincipalSearcher searcher = ...)
{
foreach(var principal in searcher.FindAll())
{
using (principal)
{
// ... do something ...
}
}
}

后者(在迭代期间显式处理每个项目)看起来“更安全” - 即符合明确处理所有 IDisposable 对象的指南 - 但它有点困惑;例如,它排除了使用 LINQ 来迭代搜索结果。

回应@Rup 的评论:

you could write a yield iterator that returned one result from the parent iterator



是的,我认为这有助于启用 LINQ。类似于以下扩展方法:
public static IEnumerable<T> EnumerateAndDispose<T>(this IEnumerable<T> collection) where T : IDisposable
{
foreach (T item in collection)
{
using (item)
{
yield return item;
}
}
}

可以用作:
searcher.FindAll().EnumerateAndDispose().Select(... use LINQ ...)

但有必要吗?

最佳答案

一般来说,在许多情况下,不调用 Dispose() 不会导致大问题:编写良好的一次性对象将实现在终结器中清理事物所需的相同逻辑。
(免责声明:我不是说“不要调用 dispose”:这是有原因的!例如,Finalization 可能会在很晚之后发生。我只是在这里描述了后果)。

但是,AD 对象是一个明显的异常(exception);特别是,SearchResultCollection因遭受此问题而闻名(引用资料:MSDN(类文档和其他文章)和 Active Directory: Designing, Deploying, and Running Active Directory)。似乎由于技术原因,在其终结器中无法释放资源,因此不调用 dispose 会导致内存泄漏。

正如 Scott 和 Joe 所指出的,许多 MSDN 示例不会对集合中的项目调用 dispose;然而,Ryan Dunn,前 Windows Azure 技术布道者和 The .NET Developers Guide to Directory Services Programming 的合著者,建议对 this blog post 中的每个项目使用调用 dispose。 .从帖子:

In general, always explicitly call Dispose() on the following object types:

  • DirectoryEntry
  • SearchResultCollection (from .FindAll())
  • DirectorySearcher (if you have not explicitly set a SearchRoot)


我相信,这是最接近“权威来源”的方法;不过我个人的看法是:
  • 如果可以,请调用 dispose。它不会有任何坏处,特别是如果您可以使用 Joe 的扩展方法恢复 LINQ 功能
  • 去使用反射器/ilspy/ildasm 和/或像 dotTrace 这样的内存配置文件真正了解正在发生的事情(基本上,斯科特已经做过,但更深入)
  • 关于.net - PrincipalSearchResult<T> 是否自动处理其集合中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10715159/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com