我应该处理XmlNodeList

Pet*_*den 3 .net c#

在下面的代码中,我得到一个XmlNodeList返回值XmlDocument.SelectNodes()

foreach (XmlNode node in doc.SelectNodes(xPath))
{
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

事实证明,XmlNodeList实现IDisposable.这是否意味着每次我想迭代I的返回值时XmlDocument.SelectNodes()应该将它放在局部变量中并确保它被处理掉(即把它放在一个using块中)?

像这样:

using(XmlNodeList nodes = doc.SelectNodes(xPath))
{ 
    foreach (XmlNode node in nodes)
    {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

System.Xml命名空间是,嗯,不稳定.最好的方式我可以把它.XmlNodeList是一个抽象类,它继承了IDisposable并实现了一次性模式,但本身并没有做任何事情.

有三个内部类派生自XmlNodeList.其中一个实际上覆盖了Dispose(bool)方法XmlElementList.该类具有XmlElementListener类型的私有字段.还有另一个内部类,不是那么明显它的作用,但它似乎"倾听"列出变化.Dispose方法(等待它)取消订阅两个事件处理程序.

这打破了本书中的所有规则,滥用IDisposable 永远不正确.不幸的是,你将不得不走路,几乎不可能解开这个以查看该监听器是否被实例化,以及如果你不调用Dispose(),这些事件处理程序是否会导致程序中持久的泄漏.你最好叫它.

.NET Framework中有很多很棒的代码.好的代码总是需要糟糕的代码才能让好的代码显而易见.这是System.Xml的工作.