我有Dictionary<int,RPicture>
和..
public class RPicture
{
public Image image;
public string filePath;
}
RPicture实例仅存储(引用)在该Dictionary中,并且每个RPicture Image仅在其一个RPicture obj中引用。
在“字典”中的RPicture记录中处理图像的正确方法是什么?
是否删除了Dict.Remove(1);
足够的记录?
或者,有更好/适当的解决方案吗?
答案 0 :(得分:2)
Dict.Remove(1);
会使您的RPicture
无法访问。在下一次GC运行时,它将被收集并最终被处理掉。
因为如果对象使用大量有限资源(在您的情况下为RAM),这是次优的,IDisposable
接口(如提到的@lightbricko)提供了一种以可重复的方式释放这些资源的方法。基本上,IDisposable
机制提供了一种方法来解除对象的有效负载资源的释放与收集对象本身。
因此,如果您在IDisposable
上实施RPicture
,然后在将其从字典中删除后调用({1}}上的Dispose()
,那么您将最终得到对象稍后收集,但其有效载荷图像的资源现在被释放。我怀疑,这就是你想要的。
public class RPicture: IDisposable
{
public Image image;
public string filePath;
public void Dispose()
{
image.Dispose();
image=null;
filePath=null;
}
}
将是一个健谈但工作的候选人。
答案 1 :(得分:2)
Dictionary
类本身不会调用对象的Dispose
方法,因为它无法知道其他任何内容是否有对该对象的引用。删除它将删除字典的引用,如果你说没有更多的引用,GC将最终选择它。
但是,由于Image
实现了IDisposable
,如果内存使用率很高(可能带有图像),最好自己调用Dispose
方法。在这种情况下,您可以在删除项目之前获取该项目的引用,然后在其上调用Dispose
。 (假设您已在IDisposable
上实施了RPicture
,如Eugen的回答所示。)
public void RemoveAndDisposeFromDictionary(Dictionary<int, RPicture> dict, int index)
{
var myRImage = dict[index];
dict.Remove(index);
myRImage.Dispose();
}
答案 2 :(得分:0)
由于System.Drawing.Image实现了IDisposable,你应该处理它。最佳做法是使您的包含类实现IDisposable,然后在不再需要时处理您的类。您的实现应该通过调用Dispose方法来处理图像。
答案 3 :(得分:0)
你也可以这样做: 定义一个类RPictures,它继承RPicture的List,然后简单地覆盖'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);
}
}