0

私はDictionary<int,RPicture>..

public class RPicture
{
    public Image image;
    public string filePath;
}

RPicture インスタンスはそのディクショナリにのみ格納 (参照) され、各 RPicture イメージはその 1 つの RPicture obj でのみ参照されます。

Dictionary の RPicture レコードで Image を Dispose する正しい方法は何ですか? レコードを十分
に削除していますか? または、より良い/適切な解決策はありますか?Dict.Remove(1);

4

4 に答える 4

2

Dict.Remove(1);RPictureアクセスできなくなります。次回の GC 実行時に収集され、最終的に破棄されます。

オブジェクトが限られたリソース (あなたの場合は RAM) をかなりの量使用する場合、これは限界以下であるため、IDisposableインターフェイス (@lightbricko が述べたように) は、これらのリソースを繰り返し可能な方法で解放する方法を提供します。基本的に、このIDisposableメカニズムは、オブジェクト自体の収集からオブジェクトのペイロード リソースの解放を分離する方法を提供します。

したがって、辞書から削除した後に実装IDisposableしてRPictureから呼び出すDispose()と、オブジェクトは後で収集されますが、そのペイロード イメージのリソースはすぐに解放されます。私は思う、これはあなたが望むものです。

public class RPicture: IDisposable
{
    public Image image;
    public string filePath;

    public void Dispose()
    {
       image.Dispose();
       image=null;
       filePath=null;
     }
}

おしゃべりですが、有能な候補者です。

于 2013-07-26T16:54:06.893 に答える
2

Dictionaryクラス自体は、オブジェクトへの参照があるかどうかを知る方法がないため、オブジェクトのメソッドを呼び出しませんDispose。それを削除すると、辞書の参照が削除されます。これ以上参照がないと言うのが正しければ、GC は最終的にそれを取得します。

ただし、 がImage実装されているため、メモリ使用量が多い場合 (画像の場合) はIDisposable、メソッドを自分で呼び出すことをお勧めします。Disposeその場合、アイテムを削除してから呼び出す前に、アイテムへの参照を取得できますDispose。(これは、Eugenの回答に示されているように実装IDisposableしたことを前提としています)。RPicture

public void RemoveAndDisposeFromDictionary(Dictionary<int, RPicture> dict, int index)
{
    var myRImage = dict[index];              
    dict.Remove(index);
    myRImage.Dispose();
}
于 2013-07-26T16:59:28.723 に答える