C# 튜토리얼login
C# 튜토리얼
작가:php.cn  업데이트 시간:2022-04-11 14:06:23

C# 이벤트



Event(이벤트)는 기본적으로 키 누르기, 클릭, 마우스 이동 등과 같은 사용자 작업 또는 시스템 생성 알림과 같은 일부 발생입니다. 애플리케이션은 이벤트가 발생할 때 이에 응답해야 합니다. 예를 들어, 인터럽트. 이벤트는 프로세스 간 통신에 사용됩니다.

이벤트를 통한 대리자 사용

이벤트는 클래스에서 선언되고 생성되며 동일한 클래스 또는 다른 클래스의 대리자를 사용하여 이벤트 핸들러와 연결됩니다. 이벤트를 포함하는 클래스는 이벤트를 게시하는 데 사용됩니다. 이것을 publisher 클래스라고 합니다. 이 이벤트를 수락하는 다른 클래스를 구독자 클래스라고 합니다. 이벤트는 publisher-subscriber 모델을 사용합니다.

Publisher는 이벤트 및 대리자 정의가 포함된 개체입니다. 이벤트와 대리자 간의 연결도 이 개체에서 정의됩니다. 게시자 클래스의 개체는 이 이벤트를 호출하고 다른 개체에 알립니다.

구독자는 이벤트를 받아들이고 이벤트 핸들러를 제공하는 객체입니다. 게시자 클래스의 대리자는 구독자 클래스의 메서드(이벤트 처리기)를 호출합니다.

이벤트 선언(Event)

클래스 내부에서 이벤트를 선언하려면 먼저 해당 이벤트의 대리자 유형을 선언해야 합니다. 예:

public delegate void BoilerLogHandler(string status);

그런 다음 event 키워드를 사용하여 이벤트 자체를 선언합니다.

// 基于上面的委托定义事件
public event BoilerLogHandler BoilerEventLog;

위 코드는 BoilerLogHandler라는 대리자와 BoilerEventLog이라는 이벤트를 정의합니다. 이 이벤트는 대리자가 호출될 때 생성됩니다. .

예제 1

using System;
namespace SimpleEvent
{
   using System;

   public class EventTest
   {
      private int value;

      public delegate void NumManipulationHandler();

      public event NumManipulationHandler ChangeNum;

      protected virtual void OnNumChanged()
      {
         if (ChangeNum != null)
         {
            ChangeNum();
         }
         else
         {
            Console.WriteLine("Event fired!");
         }

      }
      public EventTest(int n )
      {
         SetValue(n);
      }
      public void SetValue(int n)
      {
         if (value != n)
         {
            value = n;
            OnNumChanged();
         }
      }
   }
   public class MainClass
   {
      public static void Main()
      {
         EventTest e = new EventTest(5);
         e.SetValue(7);
         e.SetValue(11);
         Console.ReadKey();
      }
   }
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Event Fired!
Event Fired!
Event Fired!

예제 2

이 예는 온수 보일러 시스템 문제를 해결하기 위한 간단한 애플리케이션을 제공합니다. 유지보수 엔지니어가 보일러를 검사하면 보일러의 온도와 압력이 유지보수 엔지니어의 메모와 함께 로그 파일에 자동으로 기록됩니다.

using System;
using System.IO;

namespace BoilerEventAppl
{

   // boiler 类
   class Boiler
   {
      private int temp;
      private int pressure;
      public Boiler(int t, int p)
      {
         temp = t;
         pressure = p;
      }

      public int getTemp()
      {
         return temp;
      }
      public int getPressure()
      {
         return pressure;
      }
   }
   // 事件发布器
   class DelegateBoilerEvent
   {
      public delegate void BoilerLogHandler(string status);

      // 基于上面的委托定义事件
      public event BoilerLogHandler BoilerEventLog;

      public void LogProcess()
      {
         string remarks = "O. K";
         Boiler b = new Boiler(100, 12);
         int t = b.getTemp();
         int p = b.getPressure();
         if(t > 150 || t < 80 || p < 12 || p > 15)
         {
            remarks = "Need Maintenance";
         }
         OnBoilerEventLog("Logging Info:\n");
         OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);
         OnBoilerEventLog("\nMessage: " + remarks);
      }

      protected void OnBoilerEventLog(string message)
      {
         if (BoilerEventLog != null)
         {
            BoilerEventLog(message);
         }
      }
   }
   // 该类保留写入日志文件的条款
   class BoilerInfoLogger
   {
      FileStream fs;
      StreamWriter sw;
      public BoilerInfoLogger(string filename)
      {
         fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
      }
      public void Logger(string info)
      {
         sw.WriteLine(info);
      }
      public void Close()
      {
         sw.Close();
         fs.Close();
      }
   }
   // 事件订阅器
   public class RecordBoilerInfo
   {
      static void Logger(string info)
      {
         Console.WriteLine(info);
      }//end of Logger

      static void Main(string[] args)
      {
         BoilerInfoLogger filelog = new BoilerInfoLogger("e:\boiler.txt");
         DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(Logger);
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
         boilerEvent.LogProcess();
         Console.ReadLine();
         filelog.Close();
      }//end of main

   }//end of RecordBoilerInfo
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

Logging info:

Temperature 100
Pressure 12

Message: O. K

PHP 중국어 웹사이트