2017-09-07 3 views
2

私は処分に必要なリソースを持つクラスを持っている:リスト内のオブジェクトを自動的に処理する方法は?

class Desert: IDisposable 
{ 
    private object resource; // handle to a resource 

    public Desert(string n) 
    { 
     // Create resource here 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (resource != null) resource.Dispose(); 
     } 
    } 
} 

Listオブジェクトが破壊されようとしているたびに自動的に、各要素に対して処分を呼び出すためのフレームワークを依頼するどのような方法があるかどうか、私は疑問に思う、ただ私はデストラクタを持つように。現在、リスト内をループしてDisposeを呼び出しています。

// On form open 
List<Desert> desertList = new List<Desert>(); 
for(int i = 0; i < 10; i++) 
{ 
    desertList.Add(new Desert("Desert" + i)); 
} 


// On form closing 
for (int i = 0; i < 10; i++) 
{ 
    desertList[i].Dispose(); 
} 

List内にオブジェクトを配置する唯一の方法はありますか?あなたはそれ以上が必要な場合は、ファイナライザを見ることができ

public class AutoDisposeList<T> : List<T>, IDisposable where T : IDisposable 
{ 
    public void Dispose() 
    { 
     foreach (var obj in this) 
     { 
      obj.Dispose(); 
     } 
    } 
} 

using (var myList = new AutoDisposeList<Desert>()) 
{ 

} 

+0

各オブジェクトのファイナライザで行うことができます。私はそれが同じではないことを知っているが、私は他の "オートマトン"を知らない。少なくともあなたは自分自身を処分する必要はない。 –

+0

@TobiasTheelファイナライザの管理対象オブジェクトにアクセスすることは適切ではないので、あなたが示唆していることは適切ではありません。 – Servy

答えて

7

あなたがリストの型自体を拡張することができます。これらはデストラクタではありません。オブジェクトがGarbage Collectedになる前にJUSTを実行するメソッドです。しかし、これは間違いを起こすのは非常に簡単ですが、私の投票はusingステートメントに対するものです。

参照:https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx

+0

私はそれを行う唯一の方法だと思います。フレームワークがあなたのためにそれを行うことであれば、リスト項目が他の場所で参照される可能性があり(したがって廃棄する必要はありません)問題があります - あなたのメソッドはプログラマーにコントロールを置いて、リスト。 – PhillipH

関連する問題