2009-10-11 51 views
10

我想了解XMLReader.Createnew XMLTextReader()之間的區別來讀取XML。爲什麼我會選擇一個呢?
是否有性能差異?XMLReader.Create()和新的XMLTextReader()之間的區別

我知道XMLReader是XMLTextReader的抽象類型,至少這是我之前閱讀的內容,但我在某處看到人們建議使用XMLReader.Create()方法而不是新的XMLReader()實例。

在此先感謝...

此致。

回答

13

XmlReader.Create允許您指定XmlReaderSettings,其中XmlTextReader構造函數重載都沒有。

+0

謝謝,它幫了我很多。 – Tarik 2009-10-11 22:30:35

+0

這似乎不是唯一的區別,我只是遇到了一個問題,沒有設置可以使XmlReader.Create工作,但XmlTextReader工作得很好: http://stackoverflow.com/questions/34257204/different-behaviour- between-new-xmltextreader-and-xmlreader-create – 2015-12-13 22:36:04

1

有關此類代碼爲何存在的一般答案,您可能需要查看Factory Method Pattern。使用工廠方法和抽象類/接口可以幫助您通過不將自己綁定到特定的實現來編寫更通用的代碼。這可以幫助您更輕鬆地利用新功能或在不同情況下使用代碼。

+0

謝謝,我不知道。 – Tarik 2009-10-11 22:31:58

+0

*諷刺* 哦,是的,它使人們非常高興地發現在多個環​​境中的不平凡的錯誤。 – 2015-12-13 22:37:27

+1

說真的。只是一句警告:工廠模式可以迅速變爲邪惡並打開主人。首先,您立即放寬編譯時的安全性。其次,在許多版本上保持一致性會變得非常痛苦。我見過一些案例(其中一些是我的;-)),工廠模式成爲系統中主要設計缺陷的必需品。 不要誤解我的意思,我只是說,在某些情況下,它們可能是隱藏某些東西的最佳方式,但在其他情況下,您只想知道:-) – 2015-12-13 22:49:40

3

微軟的答案很簡單:

儘管Microsoft .NET Framework包括XmlTextWriter類,這是XmlWriter的類的實現,在2.0版本中,建議您使用Create方法創建新XmlWriter對象。 Create方法允許您指定在創建的XmlWriter對象上支持的功能,並且還可以充分利用2.0版本中引入的新功能。

但是這個答案漏掉了最重要的區別:

如果你所說的「新的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'。

+0

有沒有辦法將XmlReader放入「v1compat 「模式? – 2015-12-13 22:51:06