Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XMLReader.Create()和new XMLTextReader()之间的差异_C#_Xml - Fatal编程技术网

C# XMLReader.Create()和new XMLTextReader()之间的差异

C# XMLReader.Create()和new XMLTextReader()之间的差异,c#,xml,C#,Xml,我想了解XMLReader.Create和newXMLTextReader()读取XML之间的区别。为什么我要选择一个而不是另一个? 是否存在性能差异 我知道XMLReader是XMLTextReader的一种抽象类型,至少我以前读过,但我看到有人建议使用XMLReader.Create()方法,而不是新的XMLReader()实例 先谢谢你 诚恳地说。XmlReader.Create允许您指定XmlTextReader构造函数重载都不能指定的内容。要了解为什么这类代码会出现的一般答案,您可能需

我想了解
XMLReader.Create
newXMLTextReader()
读取XML之间的区别。为什么我要选择一个而不是另一个?
是否存在性能差异

我知道XMLReader是XMLTextReader的一种抽象类型,至少我以前读过,但我看到有人建议使用XMLReader.Create()方法,而不是新的XMLReader()实例

先谢谢你


诚恳地说。

XmlReader.Create
允许您指定
XmlTextReader
构造函数重载都不能指定的内容。

要了解为什么这类代码会出现的一般答案,您可能需要看一下。使用工厂方法和抽象类/接口可以帮助您编写更通用的代码,而不必将自己绑定到特定的实现。这有助于使您的代码更容易利用新功能或在不同情况下使用。

Microsoft的答案很简单:

尽管Microsoft.NET Framework在2.0版本中包含XmlTextWriter类,它是XmlWriter类的实现,但建议您使用Create方法创建新的XmlWriter对象。Create方法允许您指定要在创建的XmlWriter对象上支持的功能,还允许您充分利用2.0版本中引入的新功能

但这个答案忽略了最重要的区别:

如果调用“new XmlTextReader”,它将被设置为“v1compat”模式,这将导致它在某些情况下具有非常糟糕的流行为,可能导致OutOfMemoryException!更多信息请参见


建议:除非您真的需要.NET 1.1行为,否则您永远不应该调用“new XmlTextReader”,而应该始终调用“XmlReader.Create”。

这似乎不是唯一的区别,我遇到了一个问题,没有设置可以使XmlReader.Create工作,但XmlTextReader工作得很好:哦,是的,而且,在多个环境中发现不平凡的bug真是一件乐事。只是警告一句:工厂模式可能很快变得邪恶并攻击他们的主人。首先,您立即失去了编译时安全性。其次,在许多版本上保持一致性可能会变得非常痛苦。我见过这样的案例(其中一些是我的;-),工厂模式由于系统中的主要设计缺陷而成为必要。不要误解我的意思,我想说的是,在某些情况下,它们可能是隐藏某些内容的最佳方式,但在其他情况下,您只想知道:-)有没有办法将XmlReader置于“v1Compt”模式?默认情况下,XmlTextReader也容易受到XXE攻击,除非您显式设置DtdProcessing=probible。默认情况下,XmlReader已禁用。看见