C#イベント(Event)

12360 ワード

イベント(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:
"); OnBoilerEventLog("Temparature " + t + "
Pressure:
" + p); OnBoilerEventLog("
Message:
" + 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

転載先:https://www.cnblogs.com/dyf96966/p/6045959.html