2011-02-09 2 views
2

하나는 이벤트를 선언하는 구성를 사용할 수 있습니다 : 이벤트가 null의 경우 필요없이 이벤트를 발생 허용이벤트를 초기화하는 데 사용되는 람다 식을 사용하면 GC를 방지하지 못합니까?

public class MyClass 
{ 
    public event EventHandler<EventArgs> SomeEvent = (s,e) => {}; 

    public void SomeMethod() 
    { 
     // Do something interesting... ;) 
     SomeEvent (this, new EventArgs); 
    } 
} 

확인 할 수 있습니다.

이제 개체 A가 MyClass 개체에 대한 참조를 보유하고 이벤트에 등록한 다음 나중에 등록을 취소한다고 가정 해 보겠습니다.

var myClass = new MyClass(); 
myClass.SomeEvent += MyHandler; 
... 
myClass.SomeEvent -= MyHandler; 
myClass = null; 

이벤트에 여전히 람다식이없는 경우에도 GC는 myClass를 수집합니까?

개체 루트가 다른 개체에 의한 참조가 아니기 때문에 ... 다른 사람이 확인하거나 달리 증명할 수 있습니까?

답변

3

질문에서 코드를 사용하면 구독 취소하지 않아도 GC에서 myClass를 수집합니다. 그 관계는 다른 방향입니다. MyClass의 이벤트는 구독자에 대한 참조를 보유하므로 이론적으로 구독자가 수집되지 않을까 걱정해야합니다. 구독을 취소하면 구독자가 수집됩니다.

+0

나는 이미 오후 2 시간에 Skeeted를하고 있으며 여기는 15시 45 분뿐입니다 :) – Stilgar

6

MyClass의 인스턴스는 "실제"처리기를 제거하지 않은 경우에도 수집 될 수 있습니다.

이벤트가있는 일반적인 "누출"이벤트는 게시자 (이 경우 MyClass)에 구독 된 이벤트 처리기를 통해 다른 개체에 대한 참조가 있음을 나타냅니다. 이벤트로 인해 게시자가 가비지 수집되지 않습니다. 아니 람다는 이것에 아무런 영향을 미치지 않습니다.

관련 문제