Programing

람다 이벤트 핸들러를 제거하는 방법

lottogame 2020. 4. 23. 07:38
반응형

람다 이벤트 핸들러를 제거하는 방법


가능한 중복 :
C #에서 익명 메소드 구독
취소 '익명'이벤트 핸들러 등록을 취소하는 방법

최근에 람다를 사용하여 간단한 이벤트 처리기를 만들 수 있음을 발견했습니다. 예를 들어 다음과 같은 클릭 이벤트를 구독 할 수 있습니다.

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

반응형