2012-05-21 4 views
0

나는 List<Pupil>이 있고 Pupil 개체가 이벤트를 마칠 때마다 마침. 그 학생은 List<Pupil>에서 삭제 될 것입니다. 동공 개체는 IDisposable 인터페이스를 구현했습니다.IDisposable 사용

이벤트가 완료되었습니다.

private void pupil_Finish(Pupilsender) 
    { 
     lock (this.pupilList) 
     { 
      if (this.pupilList.Contains(sender)) 
      { 
       this.pupilList.Remove(sender); 

       sender.Dispose(); 
      } 
     } 
    } 

그래서, 방법 this.pupilList.Remove(sender)를 호출 한 후, 나는 sender.Dispose를 사용해야합니까? 내 응용 프로그램의 메모리를 저장하려는 작업의 목적.

감사합니다.

+0

처음에는 'IDisposable'을 구현하는 이유는 무엇입니까? 출시 할 관리되지 않는 메모리가 있습니까? – BradleyDotNET

답변

0

발신자 동공이 다른 곳에서 참조되지 않는 경우 Dispose를 호출해야합니다. 그렇지 않으면.

+0

그래서 pupilList.Remove() 메소드는 동공 객체를 처리합니까? –

+0

아니요. pupilList.Remove()는 pupil.Dispose()와 아무 관련이 없습니다. "Finish"이벤트가 발생한 후 동공 개체가 사용되지 않는 경우 이벤트 호출 직후 Dispose를 호출해야하지만 이벤트 처리 중에는 호출하지 말아야합니다. – deerchao

1

Disposables는 메모리를 절약하기 위해 실제로는 없지만 관리되지 않는 리소스를 명시 적으로 릴리스합니다. 개체의 힙 메모리는 GC에 의해서만 해제됩니다. 따라서 Dispose을 호출해도 힙에있는 개체는 삭제되지 않습니다.

0

정상적인 패턴이 Pupil가 구독 한 모든 이벤트에서 탈퇴하기 위해 Dispose 절차를 사용하는, 그리고 아마도 그들이 가지고 있던 IDisposable 개체로주의해야 다른 객체에 통지 것 Disposed 이벤트를 발생시킬 것 그 자신의 용도로 Pupil을 빌려주었습니다. FinishDisposed 이벤트로 작동해야한다면 sender.Dispose으로 전화 할 필요가 없습니다. 이벤트가 처음 발생하는 이유는 모두 sender이 이미 처리 되었기 때문입니다. 즉, Finish 이벤트 핸들러는 현재 가입을 취소해야하며 현재 가입하지 않습니다.