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

C# ImageList:处理原始图像会将其从列表中删除,c#,.net,winforms,system.drawing,imagelist,C#,.net,Winforms,System.drawing,Imagelist,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 d

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应创建插入到中的所有图像的副本 它


我在文档中没有看到任何迹象,它确实存在。因此,简单的答案是:您的假设是错误的。

是的,ImageList创建位图的副本。但是您的测试代码与著名的惰性初始化模式(在.NET框架中非常常见)相冲突。重要的是它何时创建副本。只有在必要的时候才会这样做。在代码中做一点小改动以加快速度:

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

var dummy=il.Handle;//不幸的是,MSDN上的文档并没有提供足够的细节来真正回答这个问题。请注意,
Dispose
看起来只在创建和维护了
ImageList
自身的图像副本后进行清理,以及
Dispose
使用
控件进行清理。