C# 对象字典中对象内部图像的正确处理方法

C# 对象字典中对象内部图像的正确处理方法,c#,image,dictionary,C#,Image,Dictionary,我有字典和 public class RPicture { public Image image; public string filePath; } RPicture实例仅存储(引用)在该字典中,每个RPicture图像仅在其一个RPicture对象中引用 在字典中处理图片记录中的图像的正确方法是什么? 正在使用Dict.Remove(1)删除记录够了吗? 或者,有更好/合适的解决方案吗?因为实现了IDisposable,所以您应该处理它。最佳实践是使包含类实现IDispos

我有
字典

public class RPicture
{
    public Image image;
    public string filePath;
}
RPicture实例仅存储(引用)在该字典中,每个RPicture图像仅在其一个RPicture对象中引用

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

因为实现了IDisposable,所以您应该处理它。最佳实践是使包含类实现IDisposable,然后在不再需要时处置类。您的实现应该通过调用dispose方法来处理映像。

因为实现了IDisposable,所以您应该处理它。最佳实践是使包含类实现IDisposable,然后在不再需要时处置类。您的实现应该通过调用dispose方法来处理映像。

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

因为如果一个对象使用了大量有限的资源(在您的例子中是RAM),那么这是次要的,因此
IDisposable
接口(如@lightbricko所述)提供了一种以可重复的方式释放这些资源的方法。基本上,
IDisposable
机制提供了一种将对象的有效负载资源从收集对象本身中分离出来的方法

因此,如果在
RPicture
上实现
IDisposable
,然后在将其从字典中删除后对其调用(一个健全版本的)
Dispose()
,则稍后将收集该对象,但其有效负载映像的资源将立即被释放。我怀疑,这就是你想要的

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

    public void Dispose()
    {
       image.Dispose();
       image=null;
       filePath=null;
     }
}
将是一个健谈但工作的候选人。

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

因为如果一个对象使用了大量有限的资源(在您的例子中是RAM),那么这是次要的,因此
IDisposable
接口(如@lightbricko所述)提供了一种以可重复的方式释放这些资源的方法。基本上,
IDisposable
机制提供了一种将对象的有效负载资源从收集对象本身中分离出来的方法

因此,如果在
RPicture
上实现
IDisposable
,然后在将其从字典中删除后对其调用(一个健全版本的)
Dispose()
,则稍后将收集该对象,但其有效负载映像的资源将立即被释放。我怀疑,这就是你想要的

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

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

将是一个健谈但有效的候选者。

字典
类本身不会调用对象的
Dispose
方法,因为它无法知道是否还有其他对象引用了该对象。删除它会删除字典的引用,如果你说没有更多引用是正确的,GC最终会把它捡起来

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

public void remove和disposefromdictionary(Dictionary dict,int index)
{
var myRImage=dict[index];
删除(索引);
myRImage.Dispose();
}

字典类本身不会调用对象的
Dispose
方法,因为它无法知道是否还有其他对象引用了该对象。删除它会删除字典的引用,如果你说没有更多引用是正确的,GC最终会把它捡起来

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

public void remove和disposefromdictionary(Dictionary dict,int index)
{
var myRImage=dict[index];
删除(索引);
myRImage.Dispose();
}

您也可以这样做: 定义一个类RPictures,它继承RPicture的列表,然后简单地重写“Remove”函数

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);
    }
}
公共类图片
{
公众形象;
公共字符串文件路径;
}
公共类图片:字典
{
公用门移除(TKey)
{
此[key].Image.Dispose();
这个。移除(键);
}
}

您也可以这样做: 定义一个类RPictures,它继承RPicture的列表,然后简单地重写“Remove”函数

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);
    }
}
公共类图片
{
公众形象;
公共字符串文件路径;
}
公共类图片:字典
{
公用门移除(TKey)
{
此[key].Image.Dispose();
这个。移除(键);
}
}

谢谢。可以肯定的是:用我的方法,图像不会被处理(在删除记录时)?不会。但是,当垃圾收集器调用映像对象的析构函数时,该析构函数将处理托管资源(但这可能会很晚,因此请确保在不再需要它时手动处理)。谢谢。可以肯定的是:用我的方法,图像不会被处理(在删除记录时)?不会。但是,当垃圾收集器调用析构函数o时