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

foreach (XmlNode node in doc.SelectNodes(xPath))
{
    // Do stuff
}

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

像这样:
using(XmlNodeList nodes = doc.SelectNodes(xPath))
{
    foreach (XmlNode node in nodes)
    {
        // Do stuff
    }
}

最佳答案

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

有从 XmlNodeList 派生的三个内部类。其中之一实际上覆盖了 Dispose(bool) 方法 XmlElementList。该类有一个 XmlElementListener 类型的私有(private)字段。另一个内部类,它的作用并不那么明显,但它似乎“倾听”以列出更改。 Dispose 方法(等待它)取消订阅两个事件处理程序。

这打破了书中的每一条规则,为此滥用 IDisposable 永远是不正确的。不幸的是,您将不得不走走,几乎不可能解开这一点,以查看该监听器是否曾经被实例化,以及如果您不调用 Dispose(),这些事件处理程序是否会在您的程序中导致长期泄漏。你最好调用它。

.NET Framework 中有很多很棒的代码。好的代码总是需要坏的代码,才能让好代码的好坏一目了然。那是 System.Xml 的工作。

关于c# - 我应该处理 XmlNodeList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19304826/

10-12 12:42