.Net은 애플리케이션 이벤트에 대한 표준 패턴을 정의합니다. 우리는 애플리케이션 프로세스 중 이벤트 정의 규칙을 준수해야 합니다. 표준 이벤트 패턴에는 다음 네 가지 측면이 포함됩니다.
1. System.EventArgs 유형에서 상속된 이벤트 정보 클래스이며 이 클래스의 이름은 SendMailEventArgs와 같이 EventArgs로 끝납니다. 소스 이벤트 리스너에게 전송되는 메시지입니다. 이벤트 소스가 이벤트 리스너에 추가 정보를 전달할 필요가 없으면 EventArgs.Empty를 직접 사용할 수 있습니다. 이때 자체 이벤트 정보 클래스를 정의할 필요가 없습니다.
2. 이벤트를 정의할 때 사용되는 대리자(옵저버 패턴의 추상 주제 Subject 및 추상 관찰자 Observer와 유사) 이 대리자의 반환 유형은 void이고 첫 번째 매개변수 유형은 Object입니다. 두 번째는 System.EventArgs 또는 해당 하위 클래스입니다. 이름은 다음과 같이 EventHandler로 끝나야 합니다.
공용 대리자 void XxxEventHandler(object sender,SendMailEventArgs e);.net 프레임워크는 이벤트의 일반 대리자를 정의합니다. 사양
System.EventHandler
이렇게 하면 실제 애플리케이션에서 사용자 정의를 구현할 필요가 없습니다. Delegated, 이것을 직접 사용하여 일반 대리자는 애플리케이션 이벤트의 요구 사항을 충족할 수 있습니다.
3. 이벤트 구독자에게 알림을 보내는 이벤트 소스 클래스(옵저버 패턴의 특정 주제 ConcreteSubject와 유사) 이 클래스에는 이벤트 구독 및 취소 인터페이스를 외부에 제공하는 이벤트 멤버가 포함되어 있습니다. 모든 구독자에게 이 이벤트를 알리기 위해 이벤트를 발생시키는 역할을 담당하는 메서드입니다. 이 메서드는 On으로 시작하고 이벤트 이름으로 끝나며 System.Eventargs 유형을 허용하는 보호된 가상 메서드여야 합니다. (또는 하위 클래스) 매개변수. 예를 들어 이벤트 멤버를 정의합니다.
public event EventHandler
이 메서드는 다음과 같아야 합니다.
PRotected virtual void OnSendMail(SendMailEventArgs e){} ;
외부 호출이나 입력을 원하는 이벤트로 변환하는 메서드도 있는데, 이를 트리거라고 부르겠습니다.
이 메서드는 이벤트 메시지 클래스 인스턴스화, 이벤트를 트리거하는 OnXxx 메서드 호출, 이벤트 메시지 인스턴스 전달을 담당합니다.
4. 이벤트 리스너 클래스(옵저버 패턴의 구체적인 옵저버 ConcreteObserver와 유사)는 이벤트 소스에서 보낸 메시지를 수신하는 데 사용됩니다. 형식은 다음과 같습니다. 반환 값은 void이고 두 개의 매개 변수가 있습니다. 첫 번째 매개 변수 유형은 Object이고 두 번째 매개 변수는 해당 이벤트 메시지 클래스입니다. 예: protected void Phone_SendMail(Object sender,EventArgs e)...;
다음은 이전 기사의 이메일 전송 시스템을 다시 작성합니다.
먼저 이벤트 메시지 클래스를 정의합니다. 장치에서 보낸 메시지에 보낸 메시지를 저장합니다.
클립보드 인쇄로 일반 복사본을 보시겠습니까?
public class SendMailEventArgs:EventArgs
{
//읽기 전용 정보 필드
public readonly string Message
public SendM ailEventArgs(string message; )
읽기 전용 정보 필드
공개 읽기 전용 문자열 메시지 ;
공개 SendMailEventArgs(문자열 메시지)
this.Message = 메시지;
}
}
이벤트 소스 클래스.py를 클립보드 인쇄로?
클래스 MailManager
{ >}
{
Return New System.net.mail.Mailmessage ()
}
}
// .NET 프레임워크에서 의뢰한 일반 이벤트 정의
공개 이벤트 EventHandler
🎜 > 공개 무효 SendToMail()
{ ! ");
} );
//이메일 정보 클래스의 제목을 사용하여 이벤트 인스턴스화 > >MailManager 클래스
{
//Mail
public System.Net.Mail.MailMessage MailMess
{
set
{
MailMess = value; > get
{
새 시스템 반환 .Net.Mail.MailMessage();
}
}
//.net 프레임워크에서 제공하는 일반 대리자를 사용하여 이벤트 정의
public event EventHandler
//이벤트 트리거를 담당하는 메서드
protected virtual void On SendMial (SENDMAILEVENTARGS E)
{
Eventhandler & LT; Sendmaileventargs & GT; Sendmail = Sendmail;
if (Sendmail! = NULL)
{
// 모든 구독자에게 알립니다. > SENDMAIL (this, E );
}
}
//외부 호출을 이벤트로 변환하는 역할
public void SendToMail()
if (String.IsNu llOrEmpty(MailMess.Subject) || 문자열 .IsNullOrEmpty(MailMess.Body))
~ . 🎜> {
~ {0}", MailMess.Subject)를 통해;
//메일 제목을 사용하여 이벤트 정보 클래스를 인스턴스화합니다
SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject);
//모든 이벤트 구독자에게 알림
This.OnSendMial(sendMailEventArgs);
}
}
}
이벤트 수신 class
클립보드 인쇄로 일반 복사를 보시겠습니까?
class MobilePhone
{
> Public void SendMessage(object sender,SendMailEventArgs e)
{
콘솔 .WriteLine("RTX 메시지: {0}", e.Message);
} }
#endregion
} {
#region SendHandler 멤버
공개 무효 SendMessage(객체 발신자,SendMailEventArgs e)
{
Console.WriteLine("휴대폰 메시지: {0}", e.Message);
회원
public void SendMessage(개체 발신자,SendMailEventArgs e)
{
Console.WriteLine( "RTX 메시지: {0}", e.Message); 🎜> #endregion
Main(string[] args)
mailManager.MailMess.Subject = "알림"
mailManager.MailMess.Body = "관찰자 모드 학습.";
mailManager.SendMail+=new MobilePhone().SendMessage;//휴대폰 알림 등록
mailManager.S endMail+=new RTX().SendMessage; //RTX 알림 등록 ~ 메일관리자( );
~ .