在 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
。当您调用 DirectoryEntry
的 Children
属性 时,它实际上会创建新的 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);
}
}
}
}
在这个问题中: 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
。当您调用 DirectoryEntry
的 Children
属性 时,它实际上会创建新的 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);
}
}
}
}