2011-07-02 7 views
2

私はいくつかのtry...catchブロック内の文字列のいくつかの必要な作業を行うためにいくつかのXmlReaderXmlWriterオブジェクトを使用しています。明示的にIDisposableに変換

ので、私もfinallyブロックを追加し、NewReader.Close();NewWriter.Close();を実行しています私は、表記using (XmlReader NewReader = XmlReader.Create(...))を使用してれる好ましい構文であることを知っているが、私は本当に好きではありません。

しかし、コード解析は、これらのオブジェクトが処分されていないと訴えているので、何とかDispose()メソッドを呼び出す必要があります。

これらのクラスでは、Dispose()メソッドが明示的に実装されているため、((IDisposable)(NewReader)).Dispose();((IDisposable)(NewWriter)).Dispose();を使用する必要があります。

この手法には何らかの欠点がありますか?

+7

なぜusingステートメントを使用したくないのですか?それはあなたがする必要があるすべてを行いますが、fxcopの警告は表示されません。*また、try-finallyを使用するより簡潔です。 – s1mm0t

答えて

1

C#using文は常にあなたのためDisposeを呼び出します。それはroughtly以下に変換します。

XmlReader NewReader = XmlReader.Create(...); 
try 
{ 
    // do stuff on NewReader 
} 
finally 
{ 
    ((IDisposable)NewReader).Dispose(); 
} 

のでyouselfは、任意の値を追加しませんfinallyでそれを包みます。 CloseDisposeはよく似ていますが、必ずしもそうではありません。このFxCopが正しいので、常にDisposeを呼び出す必要があります。これを行うときにはusingステートメントでこれを行うようにしてください。Closeを手動で呼び出す理由はありません。

1

usingステートメントは、実際には好ましい解決策です。これはC#の慣用句です。これらのクラスは、すでにCloseの終了セマンティクスを持つメソッドを提供しているため、IDisposableを明示的に実装しています。私の賭けはDisposeCloseに、あるいはその逆になることです。 しかし、それにはカウントしないでください。とにかくDisposeと呼ぶべきです。最後に

、すべてこれらは等価である:好ましい

  1. 使用using、。
  2. finallyブロックのCloseを呼び出し、静的解析の警告を抑制します。 finally
  3. コールDispose((IDisposable)NewReader).Dispose();
+0

残念ながら、 'Close'と' Dispose'は必ずしも同じように動作するとは限りません。隠されたインスタンスを再オープンできるという明白な違いの他に、配置されたインスタンスはできませんが、 'Close'(' SqlConnection'など)を呼び出すときにファイナライズを抑制しないオブジェクトもあります。 GCの余分な圧力。 – Steven

+0

良い点スティーブン、私はそれに応じて更新しました。 –

4

usingを使用しないための十分な理由があります:オブジェクトの寿命は現在のブロック

よりも長いとusingを避けるための貧しい理由があるが生き残るために必要がある場合があります場合は

  • は:

    • 「私は本当に好きではありません」

    コードに正当な理由がありますか?

    また、単純な拡張方法を使用すると、構文がきれいになり、もう一度きれいになることに注意してください。

関連する問題