在foreach期间处置

时间:2016-12-29 11:24:52

标签: c# active-directory resource-cleanup

在这个问题中: 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()的资源)

1 个答案:

答案 0 :(得分:2)

是的,你需要给每个孩子打电话Dispose。当您调用Children的{​​{1}}属性时,它实际上会创建新的DirectoryEntry实例。当您枚举该实例时,它会逐个拉出子条目(并非一次全部拉出),并且它们不会DirectoryEntries它们(也不会重复使用它们)。由于Dispose基本上是COM对象 - 处理它(它拥有非托管资源)非常重要。所以正确的方法是这样的:

DirectoryEntry