1. ホーム
  2. データテーブル

[解決済み】DataSetとDataTableはDispose()すべきですか?

2022-04-10 17:53:55

質問

DataSet と DataTable は両方とも IDisposable を実装しているので、従来のベストプラクティスでは、それらの Dispose() メソッドを呼び出すべきでした。

しかし、これまで読んだ限りでは、DataSetとDataTableは実際にはアンマネージド・リソースを持っていないので、Dispose()は実際にはあまり意味がないようです。

それに using(DataSet myDataSet...) DataSetはDataTablesのコレクションを持っているからです。

したがって、安全のために、myDataSet.Tablesを繰り返し処理し、それぞれのDataTablesを破棄してから、DataSetを破棄する必要があります。

では、すべてのDataSetsとDataTablesに対してDispose()を呼び出すのは面倒なことなのでしょうか?

追記

DataSetはディスポーザブルにすべきとお考えの方へ。 一般に,ディスポーザブルのパターンとしては using または try..finally というのは、Dispose()が呼ばれることを保証したいからです。

しかし、これはコレクションの場合、すぐに醜態をさらすことになります。 たとえば、Dispose()のコールのひとつが例外をスローした場合、どうするのでしょうか? 次の要素のディスポーザブルを続けるために、それを飲み込みますか(これは "bad" ですね)?

それとも、myDataSet.Dispose()を呼び出すだけで、myDataSet.TablesのDataTablesを廃棄することは忘れた方がいいのでしょうか?

どのように解決するのですか?

ここでは、DataSetにDisposeが必要ない理由を説明するためのいくつかの議論を紹介します。

廃棄するかしないか? :

DataSetのDisposeメソッドは継承の副作用で存在するだけで、実際には最終化で何か役に立つことをするわけではありません。

DisposeはDataTableとDataSetオブジェクトに対して呼び出すべきですか? には、MVPによる解説もあります。

system.data 名前空間 (ADONET) には、以下のものは含まれません。 アンマネージドリソース したがって、以下のような場合、それらを廃棄する必要はありません。 何か特別なものを自分で追加していない限りは。

Disposeメソッドとデータセットについて理解する? には、権威あるScott Allen氏のコメントがあります。

実際には、DataSetのDisposeはほとんどメリットがないので、ほとんど行いません。

つまり、そこでのコンセンサスは 現在、DataSetのDisposeを呼び出す正当な理由はありません。