Tutorial C#login
Tutorial C#
pengarang:php.cn  masa kemas kini:2022-04-11 14:06:23

Acara C#



Acara Pada asasnya ia adalah operasi pengguna, seperti menekan kekunci, klik, pergerakan tetikus, dll., atau beberapa kejadian, seperti Sistem Dihasilkan pemberitahuan. Aplikasi perlu bertindak balas kepada peristiwa apabila ia berlaku. Contohnya, gangguan. Acara digunakan untuk komunikasi antara proses.

Menggunakan perwakilan melalui acara

Acara diisytiharkan dan dijana dalam kelas, dan dikaitkan dengan pengendali acara dengan menggunakan perwakilan dalam kelas yang sama atau kelas lain. Kelas yang mengandungi acara digunakan untuk menerbitkan acara. Ini dipanggil kelas penerbit. Kelas lain yang menerima acara ini dipanggil kelas pelanggan . Acara menggunakan model penerbit-pelanggan .

Penerbit ialah objek yang mengandungi definisi acara dan perwakilan. Hubungan antara acara dan perwakilan juga ditakrifkan dalam objek ini. Objek kelas penerbit memanggil acara ini dan memberitahu objek lain.

Pelanggan ialah objek yang menerima acara dan menyediakan pengendali acara. Perwakilan dalam kelas penerbit memanggil kaedah (pengendali acara) dalam kelas pelanggan.

Mengisytiharkan acara (Acara)

Untuk mengisytiharkan acara di dalam kelas, anda mesti mengisytiharkan jenis perwakilan acara terlebih dahulu. Contohnya:

public delegate void BoilerLogHandler(string status);

Kemudian, isytiharkan acara itu sendiri, menggunakan kata kunci acara:

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

Kod di atas mentakrifkan perwakilan bernama BoilerLogHandler dan acara bernama BoilerEventLog yang akan memanggil perwakilan apabila dijana.

Contoh 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();
      }
   }
}

Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:

Event Fired!
Event Fired!
Event Fired!

Contoh 2

Contoh ini menyediakan Aplikasi mudah untuk penyelesaian masalah sistem dandang air panas. Apabila jurutera penyelenggaraan memeriksa dandang, suhu dan tekanan dandang secara automatik direkodkan dalam fail log bersama-sama dengan nota jurutera penyelenggaraan.

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
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

Logging info:

Temperature 100
Pressure 12

Message: O. K

Laman web PHP Cina