你試過嗎?
using(var stream = new FileStream(archivePath, FileMode.Open))
using(var reader = XmlReader.Create(stream, readerSettings))
{
}
我找不到明確指出,XmlReader
會調用底層的流處理上它被放置在文檔中的任何東西。另外,我總是使用它,如上所示,我從來沒有遇到過問題。
瀏覽反射器當創建XmlTextReaderImpl
時,我也沒有發現它在流上調用Dispose()
的實例。該XmlTextReaderImpl
沒有實現Dispose()
及其Close()
方法是這樣的:
internal void Close(bool closeInput)
{
if (this.parsingFunction != ParsingFunction.ReaderClosed)
{
while (this.InEntity)
{
this.PopParsingState();
}
this.ps.Close(closeInput);
this.curNode = NodeData.None;
this.parsingFunction = ParsingFunction.ReaderClosed;
this.reportedEncoding = null;
this.reportedBaseUri = string.Empty;
this.readState = ReadState.Closed;
this.fullAttrCleanup = false;
this.ResetAttributes();
}
}
說實話,沒有。我認爲XmlReader就像StreamReader,一旦完成就會關閉內部流。使用兩個使用語句只是有點笨拙。 – 2012-03-23 19:01:54
軼事,但我看到的大多數例子都使用了兩個「使用」的例子。 – 2012-03-23 19:04:03
@TOMMYWANG:那麼你可能會這樣想,但是我找不到代碼中的任何地方(使用反射器),其中'XmlTextReaderImpl'(這是'XmlReader.Create()'實際返回的內容)處理該流。如果它確實關閉了流,那麼當爲多個閱讀器使用一個流時會遇到問題(如果我想讓流保持活動狀態,爲什麼讀者應該決定我不能?),因此需要採取安全的做法沒有。我不同意它是「笨拙的」,但「笨拙」比「破碎」更好。 – 2012-03-23 19:05:06