在 foreach 期间处理

Disposing during foreach

在这个问题中: Looping through DirectoryEntry or any object hierarchy - C#

遍历 LDAP 树的建议答案是

DirectoryEntry root = new DirectoryEntry(someDN);

DoSomething(root);

function DoSomething(DirectoryEntry de){
    // Do some work here against the directory entry
    if (de.Children != null) {
        foreach (DirectoryEntry child in de.Children) {
            DoSomething(child);
        }
    }
}

我的问题是:您是否需要在每次迭代结束时对每个子项调用 Dispose()?还是 foreach 循环会处理对 Dispose() 的必要调用?还是在 foreach 循环中根本不需要它们(因为循环可能会重新使用原本想要 Dispose() 的资源)

是的,您需要在每个 child 上调用 Dispose。当您调用 DirectoryEntryChildren 属性 时,它实际上会创建新的 DirectoryEntries 实例。当您枚举该实例时,它会一个接一个地提取 child 个条目(不是一次提取所有条目),并且不会 Dispose 个条目(也不会重用它们)。由于 DirectoryEntry 基本上是 COM object - 处理它非常重要(它拥有非托管资源)。所以正确的方法是这样的:

function DoSomething(DirectoryEntry de){
    // Do some work here against the directory entry
    if (de.Children != null) {
        foreach (DirectoryEntry child in de.Children) {
            using (child) {
                DoSomething(child);
            }
        }
    }
}