2012-09-29 3 views
2

람다 식의 수명은 어떻게됩니까?람다 식의 수명 범위는 무엇입니까?

내 문제는 다음과 같습니다. button1.Click 이벤트에 람다식이 가입했습니다. 구독을 취소 할 필요가 있는지 알지 못합니다. 익명이기 때문에 쉽지 않습니다. 또는 컨트롤 (button1)의 동일한 수명에 있기 때문에 첨부 할 필요가 없습니다.

button1.Click += (s, e) => { /*Do something; */}; 
+1

익명 함수 객체는 'button1' 객체가 사라진 후 자동으로 가비지 수집됩니다. –

답변

4

람다 표현식 버튼과 연관되어 있기 때문에,

는 내가 필요 필요하면 모르는만큼 버튼이 질문 memory.for에서 파괴되지 않기 때문에 살 것이다 그것이 익명이기 때문에 쉽지 않은 을 구독 취소 하시겠습니까?

람다 식을 이벤트에서 람다에 액세스하고 구독을 취소 할 수있는 EventHandler 대리자에 저장할 수 있습니다. 여기 코드입니다. 아마

EventHandler myEvent= (s, e) => { /*Do something; */}; 
    //Subscribe 
    button1.Click += myEvent; 
    //Unsubscribe 
    button1.Click -= myEvent; 

대리인의 수명을 결과 모두 정상 CLR 객체로 여기에이 주제 Should I unsubscribe from events?

+0

감사! 나는 이런 식으로 이벤트 핸들러로 람다 식을 사용하는 이점을 상실했다고 생각합니다. 그래서 나는 람다 표현의 삶에 많은 관심을 가지고 있습니다. 어떤 단서를 줄 수 있습니까? 감사! – Roy

+0

이 경우 가입을 취소 할 필요가 없습니다. 버튼이있는 한 동일한 이벤트 핸들러를 버튼과 연관 시키려면 걱정하지 마십시오. 여기에 링크 된 다른 SO 스레드의 Jon Skeet의 대답을 참조하십시오. 버튼과 관련된 이벤트 핸들러가 버튼의 수명 동안 변경되어야하는 경우에만 이벤트 핸들러를 수동으로 제거해야합니다. –

4

에 최선의 설명은 참조가 무엇에 의해 정의됩니다. 귀하의 경우 button1Click을 통해 참조를 보유하고 있습니다. 결과적으로 button1과 동시에 가비지 수집을 위해 적절하게 사용할 수 있습니다. 특별한 이유가 없으면 (즉, 다른 핸들러로 핸들러를 변경하려는 경우) "자유롭게"하기 위해 특별한 조치를 취할 필요가 없습니다.

+0

내 현재의 솔루션에 고무적인 소리가납니다. 고마워, 알렉세이. 그것의 참조를 줄 수 있습니까? 정말 감사합니다! – Roy

2

로컬 변수로 캡처하여 이벤트 핸들러에 대한 참조를 쉽게 유지할 수 있습니다.

 EventHandler click = (s, e) => { /* Do something; */ }; 

그런 다음과 같이 첨부 할 수 있습니다 : 그것은 종종 핸들러에 대한 참조를 개최 클래스 레벨의 변수를 만들기 위해 당신을 필요로하기 때문에 좀 더 까다로울 수 정리

 this.button1.Click += click; 

. 이는 수업 전반에 걸쳐 흩어져있는 코드로 이어집니다.

그러나 처리하기 쉬운 방법이 있습니다. 과 같이 당신의 모든 청소 작업을 캡처하는 클래스 레벨 cleanup 조치를 확인하십시오

 EventHandler click = (s, e) => { /* Do something; */ }; 
     this.button1.Click += click; 
     cleanup +=() => this.button1.Click -= click; 
:

 private Action cleanup =() => { }; 

지금 당신의 코드과 같이 하나의 방법에 잘 위치 할 수있는 이벤트 핸들러를 첨부

당신이 당신의 양식이 완료되면 당신은이 같은 청소 매우 빠르게 작업을 수행 할 수 있습니다

 cleanup(); 

좋은 점은이 법에 정리 코드의 모든 종류를 추가 할 수 있다는 것입니다 이온 변수.

관련 문제