0

我有Dictionary<int,RPicture>..

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

RPicture 实例仅存储(引用)在该 Dictionary 中,并且每个 RPicture Image 仅在其一个 RPicture obj 中引用。

在字典中的 RPicture 记录中处理图像的正确方法是什么?
删除记录是否Dict.Remove(1);足够?
或者,有没有更好/合适的解决方案?

4

4 回答 4

2

Dict.Remove(1);将使您RPicture无法访问。在下一次 GC 运行时,它将被收集并最终处理掉。

因为如果对象使用大量有限资源(在您的情况下为 RAM),这是次优的,所以IDisposable接口(如@lightbricko 提到的)提供了一种以可重复方式释放这些资源的方法。基本上,该IDisposable机制提供了一种将释放对象的有效负载资源与收集对象本身分离的方法。

因此,如果您在将其从字典中删除后对其执行IDisposableRPicture调用(一个健全的版本)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 最终会选择它。

但是,由于Imageimplements ,如果它的内存使用率很高(可能是图像),最好自己IDisposable调用该方法。Dispose在这种情况下,您可以在删除它然后调用Dispose它之前获取对该项目的引用。(这假设您已按照 Eugen 的回答所示实施IDisposableRPicture

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

由于System.Drawing.Image实现了 IDisposable 你应该处理它。最佳做法是让您的包含类实现 IDisposable,然后在不再需要时释放您的类。您的实现应该依次通过调用 Dispose 方法来处理图像。

于 2013-07-26T16:41:07.713 回答
0

您也可以这样做:定义一个 RPictures 类,它继承 RPicture 列表,然后简单地覆盖“Remove”-Function。

public class RPicture
{
    public Image Image;
    public string FilePath;
}

public class RPictures : Dictionary<RPicture>
{
    public bool Remove(TKey key)
    {
        this[key].Image.Dispose();
        this.Remove(key);
    }
}
于 2013-07-26T17:00:50.823 回答