2016-06-29 1 views
6

클래스 MyDisposable : IDisposable을 정의했다고 가정 해 보겠습니다. 나는 내가 usingIDisposable 객체의 하드 코딩 된 목록을 제공 할 수 있습니다 알고 : 이제동적으로 작성된 대상에서 using 문을 사용할 수 있습니까?

using (MyDisposable firstDisposable = new MyDisposable(), 
    secondDisposable = new MyDisposable()) 
{ 
    // do something 
} 

,의 내가 내 처분 할 수있는 개체의 컬렉션에 대한 작업을 수행하는 몇 가지 방법이 있다고 가정하자 나는이 작업을 수행 할 수 using 문 내부. 그것은 다음과 같이 보일 수 있습니다 (하지만 사용하여 블록이 하나 이상의 IDisposable 객체와 내가 하나의 컬렉션 개체를 전달하고있어 기대 때문에 당연히 작동하지 않습니다) : 여기

using (var myDisposables = GetMyDisposables()) 
{ 
    foreach (var myDisposable in myDisposables) 
    { 
     DoSomething(myDisposable); 
     DoSomethingElse(myDisposable); 
    } 
} 

단지 명확성을 위해 다른 방법이 있습니다를 :

static List<MyDisposable> GetMyDisposables() 
{ 
    throw new NotImplementedException(); // return a list of MyDisposable objects 
} 

static void DoSomething(MyDisposable withMyDisposable) 
{ 
    // something 
} 

static void DoSomethingElse(MyDisposable withMyDisposable) 
{ 
    // something else 
} 

using 문을 사용하여 수행 할 수있는 방법이 있습니까? 아니면 그냥 진술을 버리고 수동으로 처분해야합니까?

+6

당신은'DisposableCollection을 만들 수를 : IDisposable, IEnumerable 여기서 T : IDisposable' – Lee

+0

'MyDisposable' 개체의 컬렉션을 캡슐화하는 IDisposable을 쓸 수 있으며, 그것을 처분하십시오. –

+0

foreach 블록 안에 using 문을 추가하지 않는 이유는 무엇입니까? – peinearydevelopment

답변

7

한 가지 방법은 IDisposable입니다 IDisposable 개체의 컬렉션을 만드는 것입니다

using (var myDisposables = GetMyDisposables()) { 
    foreach (var myDisposable in myDisposables.Members) { 
     DoSomething(myDisposable); 
     DoSomethingElse(myDisposable); 
    } 
} 

static CollectionOfDisposable<MyDisposable> GetMyDisposables() { 
    throw new NotImplementedException(); // return a list of MyDisposable objects 
} 
+0

이 클래스가 FCL에 존재해야한다는 것에 모두 동의 할 수 있습니까? 나는 그와 같은 것을 찾을 수 없다. 글쎄, 사실, 나는 이것을 발견했다 [System.Reactive.Disposables.CompositeDisposable'] (https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable (v = vs.103). aspx)하지만이 [Reactive extensions] (https://msdn.microsoft.com/en-us/library/hh242985(v=103) .aspx)가 필요합니다. –

3

IDisposable을 구현하는 고유 한 유형을 만들어야하며 생성자에 일회용 객체 컬렉션을 받아들이고 그 객체를 유지하고 처리 할 때 모든 객체를 폐기해야합니다. 지금 당신이 쓸 수

class CollectionOfDisposable<T> : IDisposable where T : IDisposable { 
    public IList<T> Members {get; private set;} 
    public CollectionOfDisposable(IEnumerable<T> members) { 
     Members = members.ToList(); 
    } 
    public void Dispose() { 
     var exceptions = new List<Exception>(); 
     foreach (var item in Members) { 
      try { 
       item.Dispose(); 
      } catch (Exception e) { 
       exceptions.Add(e); 
      } 
     } 
     if (exceptions.Count != 0) { 
      throw new AggregateException(exceptions); 
     } 
    } 
} 

: 당신이 취할 수

관련 문제