0

タイプの要素を破棄していました:

SqlConnection
SqlDataAdapter
DataSet etc.

しかし、次のタイプのオブジェクトを破棄する必要があるかどうかはわかりません。

    string[] str = ;
    ArrayList etc.

Object of some class

必要なら・・・このまま処分していいのか教えてください

If(str != null)
{
  str = null;
}

これに対処するためのより良い方法があれば、私に提案してください。

4

2 に答える 2

4

IDisposableいいえ、決定的に破棄する必要があるのは、インターフェイスを実装するオブジェクトだけです。理想的には、それらをラップして、メソッドを手動でusing statement呼び出さないでください。.Dispose

using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT foo FROM bar";
    using (var reader = cmd.ExecuteCommand())
    {
        while (reader.Read())
        {
            // TODO: consume your resultset
        }
    }
}

またはストリーム:

using (var stream = new MemoryStream())
{
    ...
}

またはファイル:

using (var file = File.OpenRead())
{
    ...
}

または読者:

using (var reader = XmlReader.Create("foo.xml"))
{
    ...
}

このIDisposableパターンは、破棄する必要があるアンマネージド オブジェクトへの参照をオブジェクトが保持しており、CLRT がそれらのアンマネージド リソースを自動的に追跡および破棄できない場合に、.NET で使用されます。この場合、開発者は、それらを使い終わったらすぐに (using statements前に示したようにラップすることによって) 決定論的に破棄する必要があります。IDisposable インターフェイスを実装しない他のすべてのオブジェクトについては、メモリ管理を CLR と Grbage Collector に任せる必要があります。CLR はそれらを追跡し、それらを指している参照がなくなると保持しているメモリを自動的に解放します。開発者として、あなたはそれについて心配する必要はありません。

したがって、経験則は次のとおりです。

変数をインスタンス化するとき、この変数が IDisposable を実装している場合は using ステートメントでラップし、そうでない場合はガベージ コレクターに任せます。

于 2012-09-24T13:15:49.500 に答える
1

に設定null

あなたがしているのstrは、それを処分することではありません。値を割り当てることで、単に「それへの参照を失う」だけnullです。これにより、オブジェクトがコードによって未使用のままになり、GC がより早くメモリを収集できるようになります。明らかに、ローカル変数は、それらを使用するメソッドが戻るとすぐに値を使用しないままになるため、有効期間が長いオブジェクト内のフィールドに対してのみ意味があります。

例: 文字列の配列を含むフィールドを持つオブジェクトがあり、オブジェクトの存続期間中この配列に再度アクセスする必要がないと確信している場合null、GC ができるようにこの配列を に設定できます。オブジェクト自体が収集される前に、配列 (およびその項目) が使用するメモリを再利用します。

処分する

IDisposable「適切な」破棄は、 を実装するオブジェクト、つまりオペレーティング システム ハンドルなどのメモリ以外のリソースを割り当てるオブジェクトに対してのみ実行されます。

于 2012-09-24T13:18:02.277 に答える