gpt4 book ai didi

c# - ImageList:处理原始图像将其从列表中删除

转载 作者:行者123 更新时间:2023-11-30 14:32:53 24 4
gpt4 key购买 nike

ImageList 应该为插入其中的所有图像创建一个副本。因此,在将原件添加到列表后处理原件应该是安全的。

为什么下面的测试用例会失败?

Bitmap test = new Bitmap(128, 128);
ImageList il = new ImageList();

il.Images.Add(test);
Assert.AreEqual(1, il.Images.Count); // OK, image has been inserted
test.Dispose(); // now let's dispose the original
try
{
var retrievalTest = il.Images[0];
}
catch (ArgumentException) // ... but this Exception happens!
{
}

Assert.AreEqual(1, il.Images.Count); // and this will fail

这里似乎发生的事情是这样的:当尝试检索图像时,ImageList 发现原始图像已被处置,并将其从 ImageList 中删除。

为什么会这样,我认为 ImageList 应该创建图像的副本?

最佳答案

是的,ImageList 创建位图的副本。但是您的测试代码与 .NET 框架中非常常见的著名延迟初始化模式发生冲突。重要的是它创建副本的时间。只有在必须时才这样做。对您的代码做一个小改动以加快速度:

il.Images.Add(test);
var dummy = il.Handle; // <== NOTE: added
test.Dispose(); // no problem

而且您会发现处理不再是问题。

不知道如何在这里给出正确的建议,代码太综合了。这通常效果很好,ImageList 在其消费者开始使用其位图、Treeview 或 ListView 时制作副本。通常,避免将 ImageList 用作集合对象,它不是用来完成这项工作的。将 View 与模型分开,您将远离麻烦。

关于c# - ImageList:处理原始图像将其从列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com