8

通常、私はそのようなことをしていました(単なる例):

using (Stream xmlStream = client.OpenRead(xmlUrl))
{
    using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
    {
    }
}

ただ行うのは良くありません:

using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl)))
{
}

しかし、この短い構文ですべてのリソースが破棄されるか (ストリーム)、それとも XmlTextReader だけになるかはわかりません。

ご回答ありがとうございます。

4

4 に答える 4

22

いいえ; コンストラクターが例外をスローしたStream場合、が破棄されることは保証されません。XmlTextReaderしかし、次のことができます。

using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
    // use xmlReader 
}
于 2010-03-09T12:26:31.673 に答える
2

リファレンスドキュメントには、破棄するオブジェクトをusingステートメントで宣言する必要があることが示されています。ストリームの宣言がないため、Disposeメソッドは呼び出されません。

ただし、あなたの場合は、ストリームを完全にスキップして、urlパラメーターを受け取るTextReaderのコンストラクターを使用できます。リーダーが廃棄されると、基になるストリームは閉じられます。

using (var xmlReader = new XmlTextReader( xmlUrl ))
{
   ...
}
于 2010-03-09T12:34:00.380 に答える
2

どうですか(私は今これを使用しています):

using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
...
}

2 番目の using は、最初の using を参照したものです。括弧は必要ありません。

于 2010-03-09T12:27:30.577 に答える