15

私は非常に単純なコードを調べていて、datatable の dispose() の結果を見ることに行き詰まっています

以下はコードです

DataTable dt= new Datatable();
SqlCommand Cmd = new SqlCommand("sp_getData",SqlCon);
SqlCommand.CommandType= CommandType.StroedProcedure;
SqlCon.Open();
sqlDataReader dr=  cmd.ExecuteReader();
dt.Load(dr);
SqlCon.Close();
grdView.DataSource =dt;
dt.Dispose() // Here I dispose the table as it is no use for me & wanna memory free from this

しかし、データテーブルを破棄した後でも、RowCount = 10k が表示されていることがわかりました。

Dispose() メソッドはメモリを解放せず、オブジェクトを null にしますか??

どうすればnullにするか、このオブジェクトが占有するメモリを解放できますか??

4

3 に答える 3

8

Dispose() メソッドはメモリを解放せず、オブジェクトを null にしますか??

Dispose廃棄パターンは、管理対象メモリの再利用や管理対象オブジェクトの「削除」のためのものではなく (実行できないこととガベージ コレクタの目的の両方)、アンマネージド リソースまたは解放可能な他の管理対象リソースの廃棄/解放を処理するためのものです。などのアイテムSqlConnection。確かに参考にはなりませんnull、廃棄時以降使えなくなる可能性があります。

どうすればnullにするか、このオブジェクトが占有するメモリを解放できますか??

参照を null にしたい場合は、単純dt = nullに機能しますが、インスタンスが によって参照されるため、何のメリットもありません。との両方が、同じ基になるインスタンスへの参照になります。DataTablegrdView.DataSourcedtgrdView.DataSourceDataTable

また、これdtはメソッドスコープのメソッドの一部であると思われます。

このようなことについてあまり心配する必要はありません。/のSqlConnection外側にあることにもっと関心があります。そこに接続を開いたままにしておくリスクがあります。try-finallyusing

私は非常に正当な理由であると私が考えるもののためにDispose実装する項目を呼び出すことを好む傾向があります: これは公共の契約です. それを呼び出すかどうかは実装の詳細であり、すぐに変更される可能性があります。 IDisposable


余談ですが、私はあなたのコードを完全に書き直します:

var dt = new Datatable();

using (var conn = new SqlConnection(""))
using (var comm = new SqlCommand("sp_getData", conn))
{
    conn.Open();

    using (var reader = comm.ExecuteReader())
    {
        dt.Load(reader);
    }
}

grdView.DataSource = dt;
于 2013-09-18T09:55:59.520 に答える
4

Clear() 関数を使用してみてください。処分するのにとても役に立ちます。

DataTable dt = GetDataSchema();
//populate dt, do whatever...
dt.Clear();
于 2013-11-20T16:52:21.560 に答える