2009-08-17 2 views
22

저는 C# 클래스와 deconstructor에 대해 약간 혼란 스럽습니다.EventHandlers 및 C# 클래스 destructor/Dispose

은 내가 생성자에서 얻고 클래스 인스턴스에 몇 가지 이벤트 핸들러를 소비해야한다 : 나는 푸 클래스가 파괴 될 때 해당 이벤트에 가입을 취소 할 필요가

public Foo(IFooHandler handler) 
{ 
    handler.Load += Load; 
    handler.Close += Close; 
} 

. IDisposable을 구현하고 거기에서 구독을 취소합니까, 아니면 deconstructor에서 구독합니까? 나는 그 사건들을 소비 할 필요가있다, 나는 그것을 다른 방법으로 할 수 없다.

하나의 클래스에 대해 인스턴스를 만들고 진행 상태를 확인한 다음 클래스 인스턴스가 범위를 벗어납니다. 다른 양식의 경우 양식이 닫힐 때까지 MainForm에 그대로 있습니다. 첫 번째 문제는 여전히 이벤트 처리기에 대한 참조가있을 수 있으며 제대로 실행되지 않을 수 있으므로 걱정됩니다.

메모리가 누출되고 싶지 않습니다. 언제 탈퇴해야합니까?

답변

24

이벤트 처리기가 연결되어있는 동안에는 호출되지 않기 때문에 소멸자에서 수행하지 마십시오. Foo의 인스턴스 메서드를 Bar 이벤트에 대한 처리기로 연결하면 Bar가 참조를 보유합니다. Foo, Foo는 쓰레기 수거가되지 않으며 소멸자는 호출되지 않습니다.

당신은으로 IDisposable을 구현하고 개체를 처리해야 명시 적으로

public void Dispose() 
{ 
    if (handler != null) 
    { 
     handler.Load -= Load; 
     handler.Close -= Close; 
    } 
} 
+2

아! 관리되지 않는 코드를 정리하지 않는 한 IDisposable을 구현하지 말아야한다고 생각했습니다. –

+0

IDisposable은 다른 이유로 구현 될 수 있습니다. 관리되지 않는 리소스를 정리하는 데만 국한되지 않습니다 ... –

+1

일반적인 Disposable Pattern을 살펴보면 관리되는 리소스와 관리되지 않는 리소스를 처리 할 수있는 경로가 있습니다. 주로 관리되지 않는 리소스 및/또는 관리되는 리소스 만 있습니다. 그러나 귀하의 경우에는 청소해야하는 관리 자원을 가지고있는 것이 좋습니다. – Oliver

3

혹시 클래스 A는 이벤트를 구독 오래 살았 클래스와 클래스 (들) B 단명 할 사람이 될 필요의 문제에 직면하는 경우 A 클래스의 경우 Weak Event Pattern에 관심이있을 것입니다. 즉, 늦기 전까지 발견되지 않는 문제 일 수 있습니다. 즉 Princeton self driving car.

관련 문제