標籤:style blog http color io os 使用 ar 資料
上文簡述了委託,所謂的簡述,只是說了一下如何使用委託,既然有了委託的基礎,便可以稍微一探事件的機制。
事件,實際上是委託類型,事件處理函數如下:
public delegate void MyHander(object sender, MyEventArgs e);//聲明一個委託,其中要與事件的簽名一致
委託要與將要處理的函數形式一致,所以其有兩個參數,一個是訊息的寄件者sender,即觸發事的對象,一個是包含的要處理的資料e。
對與上述代碼,其中,MyEventArgs屬於定義的一個類,繼承於EventArgs,這個類基本包含了GUI所需的一切資料,但是額外的需求,就需要另外定義,例如本文後附帶的例子。
事件,
public event MyHander myevent;
定義了一個事件類型的變數,其中MyHander是一個聲明好的委託類型。
首先委託與函數關聯,然後事件與委託關聯,如此,事件便可以調用函數,基本流程如下(實際程式碼群組織時,這幾句不會挨著的):
public delegate void MyHander(object sender, MyEventArgs e); MyHander myhander = new MyHander(OutPut);//OutPut是一個執行具體功能的函數,通過此,委託與函數關聯public event MyHander myevent;//定義事件變數myevent += myhander;//事件與委託關聯//下面觸發事件myevent(this,e);
完整的一個代碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace EvenTest2{ public class MyEventArgs : EventArgs//1.寫好自己定義的繼承基本的事件參數類 這個要是共有類 { public string sentence; } public delegate void MyHander(object sender, MyEventArgs e);//2、聲明一個委託,其中要與事件的簽名一致 class A { public void OutPut(object sender, MyEventArgs e)//3、設計好實際做事的類 { Console.WriteLine(e.sentence); } public A(B b)//5、(跳一步,這是第五步)根據1步中聲明的委託,定義一個委託變數,然後將這個委託變數與OutPut這個幹活的綁定一起 { MyHander myhander = new MyHander(OutPut); b.myevent += myhander;//6、將B中聲明的事件與 上一句中處理好的委託變數綁定,這樣,便可以通過myevent調用OutPut了 } } class B//4、設計事件的類,也就是設計用來調用委派物件的事件,通過A類的建構函式與其綁定,方可以調用 { public event MyHander myevent; public void callevent(MyEventArgs e) { if (myevent != null) { myevent(this, e);//7、這一句是調用的開端,從此,如鏈式爆炸一般,一發不可收拾myevent-myhander-OutPut } } } class Program { static void Main(string[] args) { MyEventArgs e1 = new MyEventArgs(); e1.sentence = "我也會自訂事件了!!!"; B b = new B(); A a = new A(b); b.callevent(e1); } }}View Code
C#之事件初步