다음을 통해 공유


이벤트 소개

이전

이벤트는 대리자처럼 지연 바인딩 메커니즘입니다. 실제로 이벤트는 대리자 언어 지원을 기반으로 합니다.

이벤트는 개체가 어떤 일이 발생했는지(시스템의 모든 관심 있는 구성 요소에) 브로드캐스트하는 방법입니다. 다른 모든 구성 요소는 이벤트를 구독할 수 있으며 이벤트가 발생할 때 알림을 받을 수 있습니다.

일부 프로그래밍에서 이벤트를 사용했을 것입니다. 많은 그래픽 시스템에는 사용자 상호 작용을 보고하는 이벤트 모델이 있습니다. 이러한 이벤트는 마우스 이동, 단추 누르기 및 유사한 상호 작용을 보고합니다. 이는 가장 일반적인 시나리오 중 하나이지만 이벤트가 사용되는 유일한 시나리오는 아닙니다.

클래스에 대해 발생해야 하는 이벤트를 정의할 수 있습니다. 이벤트로 작업할 때 한 가지 중요한 고려 사항은 특정 이벤트에 대해 등록된 개체가 없을 수 있다는 것입니다. 수신기가 구성되지 않은 경우 이벤트가 발생하지 않도록 코드를 작성해야 합니다.

또한 이벤트를 구독하면 두 개체(이벤트 원본 및 이벤트 싱크) 간에 결합이 만들어집니다. 이벤트에 더 이상 관심이 없을 때 이벤트 수신기가 이벤트 소스에서 구독을 취소해야 합니다.

이벤트 지원을 위한 디자인 목표

이벤트에 대한 언어 디자인은 다음 목표를 대상으로 합니다.

  • 이벤트 원본과 이벤트 싱크 간의 최소 결합을 사용하도록 설정합니다. 이러한 두 구성 요소는 서로 다른 조직에서 작성할 수 있으며 다른 일정에 따라 업데이트될 수도 있습니다.
  • 이벤트를 구독하고 동일한 이벤트에서 구독을 취소하는 것은 간단해야 합니다.
  • 이벤트 원본은 여러 이벤트 구독자를 지원해야 합니다. 또한 이벤트 구독자가 연결되지 않는 것도 지원해야 합니다.

이벤트의 목표가 대리자의 목표와 비슷하다는 것을 알 수 있습니다. 따라서 이벤트 언어 지원은 대리자 언어 지원을 기반으로 합니다.

이벤트에 대한 언어 지원

이벤트를 정의하고 이벤트에서 구독 또는 구독을 취소하는 구문은 대리자 구문의 확장입니다.

event 키워드를 사용하여 이벤트를 정의합니다.

public event EventHandler<FileFoundArgs>? FileFound;

이 예제에서EventHandler<FileListArgs> 이벤트의 형식은 대리자 형식이어야 합니다. 이벤트를 선언할 때 따라야 하는 규칙이 있습니다. 전형적으로 이벤트 대리자 유형은 void를 반환합니다. 이벤트 선언은 동사 또는 동사 구문이어야 합니다. 이벤트가 발생한 항목을 보고할 때 과거 시제를 사용합니다. 현재 시제 동사(예: Closing)를 사용하여 발생하려는 항목을 보고합니다. 종종 현재 시제를 사용하면 클래스가 일종의 사용자 지정 동작을 지원한다는 것을 나타냅니다. 가장 일반적인 시나리오 중 하나는 취소를 지원하는 것입니다. 예를 들어 Closing 이벤트에는 close 작업이 계속되어야 하는지 여부를 나타내는 인수가 포함될 수 있습니다. 다른 시나리오를 사용하면 호출자가 이벤트 인수의 속성을 업데이트하여 동작을 수정할 수 있습니다. 알고리즘에서 수행할 제안된 다음 작업을 나타내는 이벤트를 발생시킬 수 있습니다. 이벤트 처리기는 이벤트 인수의 속성을 수정하여 다른 작업을 위임할 수 있습니다.

이벤트를 발생 하려는 경우 대리자 호출 구문을 사용 하 여 이벤트 처리기를 호출 합니다.

FileFound?.Invoke(this, new FileFoundArgs(file));

대리자에 대한 섹션에서 설명한 것처럼 ?. 연산자를 사용하면 해당 이벤트에 대한 구독자가 없을 때 이벤트를 발생시키려고 시도하지 않도록 쉽게 확인할 수 있습니다.

+= 연산자를 사용하여 이벤트를 구독합니다.

var fileLister = new FileSearcher();
int filesFound = 0;

EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
    Console.WriteLine(eventArgs.FoundFile);
    filesFound++;
};

fileLister.FileFound += onFileFound;

처리기 메서드에는 일반적으로 앞의 코드와 같이 'On' 접두사 뒤에 이벤트 이름이 있습니다.

-= 연산자를 사용하여 구독을 취소합니다.

fileLister.FileFound -= onFileFound;

이벤트 처리기를 나타내는 식에 대한 지역 변수를 선언하는 것이 중요합니다. 그러면 구독 취소가 처리기를 제거합니다. 대신 람다 식의 본문을 사용한 경우 연결되지 않은 처리기를 제거하려고 합니다. 이 처리기는 아무 작업도 수행하지 않습니다.

다음 문서에서는 일반적인 이벤트 패턴 및 이 예제의 다양한 변형에 대해 자세히 알아봅니다.

다음