2012-03-01 52 views
4

处理ImageList对象的适当方法是什么?处理ImageList

假设我和private ImageList imageList成员有一些类。现在,在某些时刻,我执行下面的代码:

// Basically, lazy initialization. 
if (imageList == null) 
{ 
    imageList = new ImageList(); 
    Image[] images = Provider.CreateImages(...); 
    foreach (var image in images) 
    { 
     // Does the 'ImageList' perform implicit copying here 
     // or does it aggregate a reference? 
     imageList.Images.Add(image); 

     // Do I need to do this? 
     //image.Dispose(); 
    } 
} 

return imageList; 

在同一个班我有Dispose方法实现,其执行方式如下:

public void Dispose() 
{ 
    if (!disposed) 
    { 
     // Is this enough? 
     if (imageList != null) 
      imageList.Dispose(); 

     disposed = true; 
    } 
} 

我敢肯定有这段代码存在一些潜在的问题,所以请你帮我把它改正。

+0

相关:[ImageList中:处置原始图像从列表中删除它(http://stackoverflow.com/questions/17639237/imagelist-disposing-the-original-image-removes-it-from-列表)。在[ImageList'中的'originals'字段的参考源中的注释](https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ImageList.cs,75)也值得一读。 – jrh 2016-10-11 18:34:58

回答

4

是的,它做了一个副本。请注意下面的CreateBitMap调用。因此,为了尽可能降低您的资源使用量,您应该取消注释处理行。

private int Add(ImageList.Original original, ImageList.ImageCollection.ImageInfo imageInfo) 
    { 
    if (original == null || original.image == null) 
     throw new ArgumentNullException("value"); 
    int num = -1; 
    if (original.image is Bitmap) 
    { 
     if (this.owner.originals != null) 
     num = this.owner.originals.Add((object) original); 
     if (this.owner.HandleCreated) 
     { 
     bool ownsBitmap = false; 
     Bitmap bitmap = this.owner.CreateBitmap(original, out ownsBitmap); 
     num = this.owner.AddToHandle(original, bitmap); 
     if (ownsBitmap) 
      bitmap.Dispose(); 
     } 
    } 
    else 
    { 
     if (!(original.image is Icon)) 
     throw new ArgumentException(System.Windows.Forms.SR.GetString("ImageListBitmap")); 
     if (this.owner.originals != null) 
     num = this.owner.originals.Add((object) original); 
     if (this.owner.HandleCreated) 
     num = this.owner.AddIconToHandle(original, (Icon) original.image); 
    } 
    if ((original.options & ImageList.OriginalOptions.ImageStrip) != ImageList.OriginalOptions.Default) 
    { 
     for (int index = 0; index < original.nImages; ++index) 
     this.imageInfoCollection.Add((object) new ImageList.ImageCollection.ImageInfo()); 
    } 
    else 
    { 
     if (imageInfo == null) 
     imageInfo = new ImageList.ImageCollection.ImageInfo(); 
     this.imageInfoCollection.Add((object) imageInfo); 
    } 
    if (!this.owner.inAddRange) 
     this.owner.OnChangeHandle(new EventArgs()); 
    return num; 
    } 

当ImageList配置时,它配置其所有图像的副本。所以再一次,是的,在表单关闭时处理它是正确的,除了取消注释其他的处理线。

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    if (this.originals != null) 
    { 
     foreach (ImageList.Original original in (IEnumerable) this.originals) 
     { 
     if ((original.options & ImageList.OriginalOptions.OwnsImage) != ImageList.OriginalOptions.Default) 
      ((IDisposable) original.image).Dispose(); 
     } 
    } 
    this.DestroyHandle(); 
    } 
    base.Dispose(disposing); 
} 
1

ImageList不拥有对原始图像的引用。当您添加图像时,ImageList会复制它。 您可以自由处置原件,因为您发现方便。
但是,您应该在Dispose()中调用imageList.Images.Clear();