在以下代码中,我从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
}
}
答案 0 :(得分:6)
System.Xml命名空间是,呃,不稳定。最好的方式我可以把它。 XmlNodeList是一个抽象类,它继承了IDisposable并实现了一次性模式,但本身并没有做任何事情。
有三个内部类派生自XmlNodeList。其中一个实际上覆盖了Dispose(bool)方法XmlElementList。该类具有XmlElementListener类型的私有字段。还有另一个内部类,不是那么明显它的作用,但它似乎“倾听”列出变化。 Dispose方法(等待它)取消订阅两个事件处理程序。
这打破了本书中的所有规则,永远不会正确滥用IDisposable。不幸的是,你将不得不走路,几乎不可能解开这个以查看该监听器是否被实例化,以及如果你不调用Dispose(),这些事件处理程序是否会导致程序中持久的泄漏。你最好叫它。
.NET Framework中有很多很棒的代码。好的代码总是需要糟糕的代码才能让好的代码显而易见。这是System.Xml的工作。