事件与事件处理程序
事件與時間處理程序
事件是可以被控件識別的操作。如按下確定按鈕,選擇某個單選按鈕或者復選框。每一種控件有自己可以識別的事件,如窗體的加載、單擊、雙擊等事件,編輯框(文本框)的文本改變事件,等等。
事件有系統事件和用戶事件。
1.系統事件由系統激發,如時間間隔24小時,銀行儲蓄的存款日期增加一天。
2.用戶事件由用戶激發,如用戶點擊按鈕,在文本框中顯示特定的文本。事件驅動控件執行某項功能。
觸發事件的對象稱為事件發送者;接收事件的對象稱為事件接受者;
事件是用戶對窗口上各種組件的操作。使用事件機制可以實現:當類對象的狀態發生變化時,系統會通過某種途徑調用類中的有關處理這個事件的方法或者觸發控件的事件處理程序等。
在.NET框架中,事件是將事件發送這(觸發事件的對象)與事件接受者(處理事件的方法)相關聯的一種代理類,即事件機制是通過代理類來實現的。當一個事件被觸發時,由該代理來通知(調用)處理事件的相應方法。
C#中事件機制的工作過程如下:
(1)?? 將實際應用中需要通過事件機制解決的問題對象注冊到相應的事件處理程序上,代表今后當該對象的狀態改變時,該對象有權使用它注冊的事件處理程序。
(2)?? 當事件發生時,觸發事件的對象就會調用該對象所有已注冊的事件處理程序。
下面就以一個具體的例子來說明事件與事件處理程序:
using System;
namespace Sample
{
??? public class Program
??? {
??????? //事件處理程序
??????? private static? double Add(double first, double second)
??????? {
??????????? return first + second;
??????? }
?
??????? static void Main(string[] args)
??????? {
??????????? Sample sample=new Sample();
??????????? sample.Calculate += new Sample.CalculateHandler(Add);??? //添加事件處理程序
??????????? double a = Convert.ToDouble(Console.ReadLine());
??????????? double b = Convert.ToDouble(Console.ReadLine());
??????????? sample.InvokeEvent(a, b);?? //觸發事件
??????????? Console.ReadKey();
??????? }
??? }
?
??? public class Sample
??? {
??????? public delegate double CalculateHandler(double first, double b);
?
??????? public event CalculateHandler Calculate;??? //事件
?
??????? public void InvokeEvent(double a,double b)
??????? {
??????????? Console.WriteLine(Calculate(a, b));
??????? }
??? }
}
?
首先,申明一個類 Sample ,包含成員 CalculateHandler(委托)與Calculate(事件)(在C#中,事件是通過委托定義的,及申明事件,要先確定事件處理程序的函數簽名,然后確定委托類型,在通過委托定義事件。)函數 InvokeEvent()用于激發事件,以執行事件處理程序。在本例中事件只有一個事件處理程序。下面是一個事件訂閱多個事件處理程序的代碼:
using System;
?
namespace Sample
{
??? public class Program
??? {
?
??????? //事件處理程序
??????? private static void Add(double first, double second)
??????? {
??????????? Console.WriteLine(first + second);
??????? }
?
??????? //事件處理程序
??????? private static void Sub(double first, double second)
??????? {
??????????? Console.WriteLine(first - second);
??????? }
?
??????? //事件處理程序
??????? private static void Div(double first, double second)
??????? {
??????????? Console.WriteLine(first / second);
??????? }
?
??????? //事件處理程序
??????? private static void Mul(double first, double second)
??????? {
??????????? Console.WriteLine(first * second);
??????? }
?
??????? static void Main(string[] args)
??????? {
??????????? Sample sample=new Sample();
??????????? sample.Calculate += new Sample.CalculateHandler(Add);??? //添加事件處理程序
??????????? sample.Calculate += new Sample.CalculateHandler(Sub);??? //添加事件處理程序
??????????? sample.Calculate += new Sample.CalculateHandler(Mul);??? //添加事件處理程序
??????????? sample.Calculate += new Sample.CalculateHandler(Div);??? //添加事件處理程序
??????????? double a = Convert.ToDouble(Console.ReadLine());
??????????? double b = Convert.ToDouble(Console.ReadLine());
??????????? sample.InvokeEvent(a, b);?? //觸發事件
??????????? Console.ReadKey();
??????? }
??? }
?
??? public class Sample
??? {
??????? public delegate void CalculateHandler(double first, double b);
?
??????? public event CalculateHandler Calculate;
?
??????? public void InvokeEvent(double a,double b)
??????? {
??????????? Calculate.Invoke(a, b);
??????? }
??? }
}
在這個例子中 Calculate 事件訂閱了四個事件(加,減,乘,除),在觸發 Calculate 事件后,按順序依次執行四個事件處理程序。
事件與事件處理程序是不同的概念,只有當事件先訂閱(添加)事件處理程序后,在觸發事件時,事件才會依次(按訂閱的先后)處理所有訂閱的事件處理程序。所以我們在寫程序時所說的事件通常指的是事件處理程序(即我們習慣將所寫的事件處理程序添加到事件上的過程叫做事件),但在自定義事件中,事件就是指的事件,應當正確的理解這兩者的區別。
轉載于:https://www.cnblogs.com/SilentCode/p/4857691.html
總結
- 上一篇: 数据结构之 顺序栈、共享栈、链栈
- 下一篇: BZOJ2837 : 小强的形状