발송하는 동안 C#에 이벤트에 등록하면 해당 파견 중에 다시 호출되지 않도록 보장합니까?

StackOverflow https://stackoverflow.com/questions/141423

  •  02-07-2019
  •  | 
  •  

문제

C#에서, 나는 때때로 같은 이벤트의 파견 중에 이벤트에 대한 방법을 등록하고 싶다는 것을 알게됩니다. 예를 들어, 동일한 이벤트의 연속 파견을 기반으로 상태를 전환하는 클래스가있는 경우, 첫 번째 주 핸들러가 스스로 등록 해제하고 두 번째 처리기를 등록하기를 원할 수 있습니다. 그러나 다음 번에 이벤트가 발사 될 때까지 2 핸들러가 파견되기를 원하지 않습니다.

좋은 소식은 C#의 Microsoft 구현이 이런 식으로 정확히 동작한다는 것입니다. 이벤트 등록 구문 설탕은 현재 호출 목록과 새 메소드를 별도의 목록으로 연결하고 이벤트 속성에 할당하는 System.delegate.com -Bine으로 Call으로 대체됩니다. 이것은 내가 원하는 행동을 정확하게 제공합니다.

그래서 내 질문은 다음과 같습니다. 이것은 언어 표준에 따른 보장 된 행동입니까? 모노 아래의 다른 플랫폼에서 C# 코드를 실행할 수 있고 일반적으로 구현을 기반으로 언어 표준에 대해 가정하지 않기를 원합니다.

MSDN에 대한 결정적인 정보를 찾을 수 없었습니다.

내가 말하는 내용의 특정 예를 원한다면 다음은 다음과 같습니다.

    delegate void TestDelegate();
    static event TestDelegate TestEvent;

    static void Main (string[] args) {
        TestEvent += TestDelegateInstanceFirst;
        TestEvent();
        TestEvent();
    }

    static void TestDelegateInstanceFirst () {
        Console.WriteLine("First");
        TestEvent += TestDelegateInstanceSecond;
    }

    static void TestDelegateInstanceSecond () {
        Console.WriteLine("Second");
    }

적어도 창에서 출력은 다음과 같습니다.

First
First
Second
도움이 되었습니까?

해결책

예, 보장됩니다.

Unified C# 3.0 사양에서 섹션 15.1 :

그러나 두 개의 비 널 대의원 인스턴스가 결합되면, 호출 목록이 왼쪽 오페라에서 오른쪽 피연산자와 오른쪽 오페라에서 2 개 이상의 항목을 포함하는 새로운 호출 목록을 형성합니다.

"새 호출 목록"에 유의하십시오. 그리고 다시 15.3 절에서 :

일단 인스턴스화되면, 대의원 인스턴스는 항상 동일한 대상 객체와 방법을 나타냅니다. 두 대의원이 결합되거나 다른 한 명이 다른 사람에게서 제거되면 자체 호출 목록이있는 새로운 대리자 결과를 기억하십시오. 결합되거나 제거 된 대표의 호출 목록은 변경되지 않았습니다.

마지막으로, System.Delegate 상태 : MSDN :

대표단은 불변입니다. 일단 생성되면 대의원의 호출 목록은 변경되지 않습니다.

CLI 사양에 무언가가 있다고 생각합니다. 원하는지 확인하겠습니다. 그러나이 세 가지가 충분한 확신을 주셨으면합니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top