집 >백엔드 개발 >C#.Net 튜토리얼 >C# 지식 복습 - 이벤트 소개
1. 이벤트란
클래스나 객체는 이벤트를 통해 발생한 관련 사항을 다른 클래스나 객체에 알릴 수 있습니다. 이벤트를 전송(또는 발생)시키는 클래스를 "게시자"라고 하며, 이벤트를 수신(또는 처리)하는 클래스를 "구독자"(구독자)라고 합니다.
일반적인 C# Windows Forms 또는 웹 애플리케이션에서는 버튼 및 목록 상자와 같은 컨트롤에 의해 발생하는 이벤트를 구독할 수 있습니다. IDE(통합 개발 환경)를 사용하여 컨트롤에서 게시한 이벤트를 찾아보고 처리하려는 이벤트를 선택할 수 있습니다. IDE는 빈 이벤트 핸들러 메서드와 이벤트를 구독하기 위한 코드를 자동으로 추가합니다.
2. 이벤트 속성 요약
발행자는 이벤트가 트리거되는 시기를 결정하고, 구독자는 이벤트에 대한 응답을 결정합니다.
이벤트의 구독자는 여러 명일 수 있습니다. 구독자는 여러 게시자의 여러 이벤트를 처리할 수 있습니다.
구독자가 없는 이벤트는 절대 실행되지 않습니다.
이벤트는 일반적으로 그래픽 사용자 인터페이스의 버튼 클릭이나 메뉴 옵션과 같은 사용자 작업을 나타내는 데 사용됩니다.
이벤트에 구독자가 여러 명 있는 경우 이벤트가 발생할 때 기본적으로 이벤트 핸들러가 동기식으로 호출됩니다.
이벤트는 EventHandler 대리자 및 EventArgs 기본 클래스를 기반으로 합니다.
3. 이벤트 구독 및 취소
이벤트 발생 시 호출되는 맞춤 코드를 작성하려면 다른 클래스에서 게시한 이벤트를 구독하면 됩니다. 예를 들어, 버튼의 클릭 이벤트를 구독하여 사용자가 버튼을 클릭할 때 애플리케이션이 유용한 작업을 수행하도록 할 수 있습니다.
1. IDE를 이용한 이벤트 구독
그림 3-1-1 새 WinForm 프로젝트 생성
그림 3-1-2 그림 1을 더블클릭하면 자동으로 생성되는 코드
그림 3-1-3 그림 2에 추가로 초기화 컴포넌트 메소드도 자동으로 추가됩니다. 이 코드 줄
2. 프로그래밍 방식으로 이벤트 구독
새로운 WinForm 프로그램이라고 가정하고 수동으로 이벤트를 생성합니다. InitializeComponent 메소드 아래에 this.Load +=를 입력하면 프롬프트가 나타납니다. 이때 "Tab 키"를 누릅니다.
그림 3-2- 1
이벤트 핸들러가 자동으로 생성되는 것을 볼 수 있는데, 앞선 빈칸을 더블클릭해서 생성한 코드와 같다고 할 수 있습니다. 코드는 다음과 같습니다.
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += Form1_Load; } private void Form1_Load(object sender, EventArgs e) { throw new NotImplementedException(); } }
이번에는 람다 방식을 직접 사용하여 이벤트 등록을 완료합니다. 빈 공간을 클릭하면 마우스 클릭 좌표가 표시됩니다.
public partial class Form1 : Form { public Form1() { InitializeComponent(); //this.Load += Form1_Load; //点击事件(lambda 方式创建) this.Click += (s, e) => { MessageBox.Show($"{((MouseEventArgs)e).Location}"); }; } private void Form1_Load(object sender, EventArgs e) { throw new NotImplementedException(); } }
[비고] 내용에는 $:(C# 6) 구문이 포함되어 있으며 이는 vs2015 이상에서만 지원됩니다. $"{msg}"는 string.Format("{0}", msg)와 동일하며 msg는 변수를 나타냅니다.
3. 익명 방식을 사용하여 이벤트를 구독합니다.
public Form1() { InitializeComponent(); //this.Load += Form1_Load; //点击事件(lambda 方式创建) //this.Click += (s, e) => //{ // MessageBox.Show($"{((MouseEventArgs)e).Location}"); //}; //使用匿名方法创建事件 this.Click += delegate (object sender, EventArgs e) { var mouseEventArgs = (MouseEventArgs)e; var mouseLocation = mouseEventArgs.Location; MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}"); }; }
[참고] 익명 기능을 사용하여 이벤트를 구독하는 경우 이벤트가 발생하면 이벤트가 취소됩니다. 구독 절차가 번거로워집니다. 이 경우 구독을 취소하려면 이벤트의 구독 코드로 돌아가서 대리자 변수에 익명 메서드를 저장한 다음 이벤트에 대리자를 추가해야 합니다. 일반적으로 코드 숨김에서 이벤트 구독을 취소해야 하는 경우 익명 함수를 사용하여 이벤트를 구독하지 않는 것이 좋습니다.
4. 구독 취소
이벤트가 발생할 때 이벤트 핸들러가 호출되는 것을 방지하려면 이벤트 구독을 취소하세요. 리소스 누출을 방지하려면 구독자 개체를 해제하기 전에 이벤트 구독을 취소하세요. 이벤트 구독을 취소하기 전에 이벤트의 기반이 되는 게시 개체의 멀티캐스트 대리자가 구독자의 이벤트 처리기를 캡슐화하는 대리자를 참조합니다. 게시 개체가 해당 참조를 보유하는 한 구독자 개체는 가비지 수집으로 삭제되지 않습니다. 이벤트 구독을 취소하려면 빼기 할당 연산자(-=)를 사용하세요.
This.Load -= Form1_Load; //이벤트 구독을 취소하려면 빼기 대입 연산자(-=)를 사용하세요.
[비고] 모든 구독자가 이벤트 구독을 취소한 후 게시자 클래스의 이벤트 인스턴스가 null로 설정됩니다.