【发布时间】:2010-12-05 19:59:19
【问题描述】:
我想了解XMLReader.Create 和new XMLTextReader() 之间的区别来读取XML。为什么我会选择一个而不是另一个?
有性能差异吗?
我知道 XMLReader 是 XMLTextReader 的一种抽象类型,至少我之前读到过,但我在某处看到有人建议使用 XMLReader.Create() 方法而不是新的 XMLReader() 实例。
提前谢谢...
真诚的。
【问题讨论】:
我想了解XMLReader.Create 和new XMLTextReader() 之间的区别来读取XML。为什么我会选择一个而不是另一个?
有性能差异吗?
我知道 XMLReader 是 XMLTextReader 的一种抽象类型,至少我之前读到过,但我在某处看到有人建议使用 XMLReader.Create() 方法而不是新的 XMLReader() 实例。
提前谢谢...
真诚的。
【问题讨论】:
XmlReader.Create 允许您指定 XmlReaderSettings,XmlTextReader 构造函数重载都没有。
【讨论】:
对于为什么这种代码存在的一般答案,您可能需要查看Factory Method Pattern。使用工厂方法和抽象类/接口可以帮助您编写更通用的代码,而无需将自己束缚于特定的实现。这有助于使您的代码更容易利用新功能或在不同情况下使用。
【讨论】:
微软的回答很简单:
虽然 Microsoft .NET Framework 包含 XmlTextWriter 类,它是 XmlWriter 类的一个实现,但在 2.0 版本中,建议您使用 Create 方法来创建新的 XmlWriter 对象。 Create 方法允许您在创建的 XmlWriter 对象上指定要支持的功能,它还允许您充分利用 2.0 版本中引入的新功能。
但是这个答案忽略了最重要的区别:
如果您调用“new XmlTextReader”,它将被设置为“v1compat”模式,这将导致它在某些情况下具有非常糟糕的流式传输行为,可能导致 OutOfMemoryExceptions!有关更多信息,请参阅Why is my new XmlTextReader(stream) reading in many megabytes into memory rather than streaming properly?。
建议:除非您确实需要 .NET 1.1 行为,否则您永远不应该调用“new XmlTextReader”,而是始终调用“XmlReader.Create”。
【讨论】: