람다 이벤트 핸들러를 제거하는 방법
최근에 람다를 사용하여 간단한 이벤트 처리기를 만들 수 있음을 발견했습니다. 예를 들어 다음과 같은 클릭 이벤트를 구독 할 수 있습니다.
button.Click += (s, e) => MessageBox.Show("Woho");
그러나 어떻게 구독을 취소 하시겠습니까?
C # 사양에서는 명시 적으로 (IIRC)에 두 개의 익명 함수 (익명 메서드 또는 람다 식)가있는 경우 해당 코드에서 동등한 대리자를 만들거나 만들 수 없다고 명시합니다. 대상이 동일하고 동일한 방법을 참조하면 두 대의원이 동일합니다.
확실하게하기 위해, 당신이 사용한 델리게이트 인스턴스를 기억해야합니다 :
EventHandler handler = (s, e) => MessageBox.Show("Woho");
button.Click += handler;
...
button.Click -= handler;
(사양의 관련 비트를 찾을 수는 없지만 C # 컴파일러가 적극적으로 동일한 대리자를 만들려고 시도하는 것을보고 놀랐습니다. 확실히 그것에 의존하는 것은 현명하지 않습니다.)
그렇게하지 않으려면 메소드를 추출해야합니다.
public void ShowWoho(object sender, EventArgs e)
{
MessageBox.Show("Woho");
}
...
button.Click += ShowWoho;
...
button.Click -= ShowWoho;
람다 식을 사용하여 자체를 제거하는 이벤트 처리기를 만들려면 약간 까다 롭습니다. 람다 식 자체 내에서 대리자를 참조해야하며 간단한 "로컬 변수 선언 및 할당 변수가 확실하게 지정되지 않았기 때문에 람다 식을 사용하여 " 일반적으로 변수에 null 값을 할당하여이 문제를 해결할 수 있습니다.
EventHandler handler = null;
handler = (sender, args) =>
{
button.Click -= handler; // Unsubscribe
// Add your one-time-only code here
}
button.Click += handler;
불행히도 이벤트가 명확하게 표현되지 않기 때문에 이것을 메소드로 캡슐화하기조차 쉽지 않습니다. 가장 가까운 곳은 다음과 같습니다.
button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>
{
// One-time code here
}, handler => button.Click -= handler);
심지어 Delegates.AutoUnsubscribe
새로운 EventHandler
(제네릭 형식 인수 일 것입니다) 를 만들어야하기 때문에 구현하기가 까다로울 수 있습니다. 가능하지만 지저분합니다.
참고 URL : https://stackoverflow.com/questions/1362204/how-to-remove-a-lambda-event-handler
'Programing' 카테고리의 다른 글
의미 = 함수 선언 후 삭제 (0) | 2020.04.23 |
---|---|
express.Router와 app.get의 차이점은 무엇입니까? (0) | 2020.04.23 |
프로그래밍 방식으로 작성된 컨텐츠 뷰를 사용하여 활동에 프래그먼트를 추가하는 방법 (0) | 2020.04.23 |
리스트 (0) | 2020.04.23 |
모든 JavaScript 오류를 잡아서 서버로 전송 (0) | 2020.04.23 |