2012-03-01 16 views
4

ImageListオブジェクトを処理する適切な方法は何ですか?ImageListを廃棄する

私はprivate ImageList imageListのメンバーを持つクラスがあるとします。私はそこにあると確信している

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

     disposed = true; 
    } 
} 

:次のように行われ、私はDisposeメソッドの実装を持っている同じクラスでは、

// 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; 

:今、いくつかの瞬間に、私は次のコードを実行しますこのコードでいくつかの潜在的な問題がありますので、正しいものにしてください。

+0

関連:[イメージリスト:元の画像を配置すると、リストから削除](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

答えて

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によってその画像がコピーされます。 便利な場所に置いて、原稿を自由に処分することができます。
ただし、Dispose()にimageList.Images.Clear();と電話する必要があります。