4

重複の可能性:
DataSetとDataTableをDispose()する必要がありますか?

アプリケーションで3層アーキテクチャを使用していますが、Datalayerではデータセットを簡単に取得できます

Dataset dset= new Dataset();

try 
{
    dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms);
}
catch 
{}
finally 
{
    Con.Close();
    dset.Dispose()
}

データセットオブジェクトを破棄することによるパフォーマンス上の利点はありますか?

4

2 に答える 2

4

オブジェクトが実装IDisposableしている場合は、それを破棄する必要があります。

実装しているオブジェクトを破棄する最良の方法は、作成をステートメントIDisposableでラップすることです。using

using(var dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, 
                                                 "StoredProcedureName", arParms))
{
}

上記は、作成されたオブジェクトの正しい廃棄パターンを生成します。このパターンを使用することは経験則です。常に使用すると、重要なものを廃棄するのを忘れる可能性が大幅に低下します。


ティム・シュメルターがコメントしたように、私はパフォーマンスの問題に取り組みませんでした。

データセットの場合、このSOの質問への回答で説明されているように、コンストラクターで破棄が抑制されるため、パフォーマンス上の利点はありません。同時に、disposeを呼び出すオーバーヘッドは最小限に抑えられます。

特定のユースケースで両方のアプローチをテストして、どちらが優れているか、一方のオプションを他方よりも使用することの利点が欠点に値するかどうかを確認することをお勧めします。

于 2012-08-13T15:51:43.780 に答える
0

IDisposableインターフェイスを持つ接続/オブジェクトを破棄して閉じる必要があります。プログラムが使用するリソースが少なくなるか、リソースをより速く解放するため、パフォーマンスに最もメリットがあります。

アクションを実行する新しいヘルパー関数を作成できます。これにより、データセットを使用するたびにクリーンアップについて考える必要がなくなります。

        public static void UseDataSet(Action<Dataset> code)
        {
            ...

            Dataset dset= new Dataset(); 

            try  
            { 
                dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms); 
                code(dset);
            } 
            catch  
            {  } 
            finally  
            { 
               Con.Close(); 
               dset.Dispose() ;
            } 
        }

関数を使用するには:

 Helper.UseDataSet( (dataset) =>
 {
    //use data set here, it will be closed and disposed afterwards
    dataset.something

 });
于 2012-08-13T16:12:31.650 に答える