Dispose
経由の関数を持つ C# クラスがありますIDisposable
。ブロック内で使用することを意図しているusing
ため、処理する高価なリソースをすぐに解放できます。
問題は、 が呼び出される前に例外がスローされたときにバグが発生し、プログラマーがorDispose
の使用を怠ったことです。using
finally
C++ では、これについて心配する必要はありませんでした。クラスのデストラクタへの呼び出しは、オブジェクトのスコープの最後に自動的に挿入されます。そのような事態を回避する唯一の方法は、 new 演算子を使用してオブジェクトをポインターの背後に保持することですが、プログラマーにとって余分な作業が必要になるのは、using
.
using
ブロックをC#で自動的に使用する方法はありますか?
どうもありがとう。
アップデート:
ファイナライザーの回答を受け入れない理由を説明したいと思います。これらの答えは技術的には正しいですが、C++ スタイルのデストラクタではありません。
これが私が見つけたバグであり、本質的なものに縮小されています...
try
{
PleaseDisposeMe a = new PleaseDisposeMe();
throw new Exception();
a.Dispose();
}
catch (Exception ex)
{
Log(ex);
}
// This next call will throw a time-out exception unless the GC
// runs a.Dispose in time.
PleaseDisposeMe b = new PleaseDisposeMe();
使用FXCop
することは素晴らしい提案ですが、それが私の唯一の答えである場合、私の質問は C# の人々への嘆願になるか、C++ を使用する必要があります。ネストされた 20 の using ステートメントはありますか?