2

いくつかのブロック内の文字列に対して必要な作業を行うために、いくつかXmlReaderXmlWriterオブジェクトを使用しています。try...catch

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

ただし、コード分析では、これらのオブジェクトが破棄されていないという不満があり、メソッドを呼び出す必要がありますDispose()

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

このテクニックに欠点はありますか?

4

3 に答える 3

4

使用しないのには十分な理由がありますusing

  • オブジェクトの存続期間が現在のブロックより長く存続する必要がある場合

回避する理由はほとんどありませんusing

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

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

また、単純な拡張メソッドを使用すると、構文がすっきりときれいになることにも注意してください。

于 2011-07-02T13:29:03.613 に答える
1

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

結局、これらはすべて同等です。

  1. を使用usingします。これが推奨されます。
  2. ブロックを呼び出しClosefinally静的分析の警告を抑制します。
  3. を呼び出しDisposeますfinally((IDisposable)NewReader).Dispose();
于 2011-07-02T12:28:08.017 に答える
1

C#usingステートメントは常にあなたを要求Disposeします。大まかに言うと、次のようになります。

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

したがって、それを自分でラップfinallyしても、何の価値もありません。CloseDisposeはしばしば同等ですが、常にそうであるとは限りません。このFxCopは正しいので、常に呼び出す必要がDisposeあります。これを行う(またはステートメントにこれを行わせる)場合、手動でusing呼び出す理由はありません。Close

于 2011-07-02T12:28:20.907 に答える