C#中的委托可以實現將方法本身作為參數傳遞,也就是說,委托是方法的引用,我們一旦為委托分配了方法,那這個委托就和這個方法具有完全相同的行為。委托對象的引用中包含一個指向這個方法的指針。通過委托把方法的引用封裝到對象中,然后將委托對象傳遞給調用引用方法的代碼。
與委托類型匹配的方法必須滿足的條件:
兩者具有相同的參數樹木你,并且類型相同、順序相同、參數的修飾符也相同。兩者具有相同的返回類型。
定義實例方法Add,將該方法作為自定義類型FirstDelegate的匹配方法。在Program類中定義一個委托類型FirstDelegate,接著在Main中創建該委托類型實例fd,并綁定到Add方法。
public class Test
{
public int Add(int a, int b){
return a+b;
}
}
public delegate int FirstDelegate(int a, int b);//定義一個委托類型
Main(){
Test t = new Test();
FirstDelegate fd = t;//創建委托類型fd并綁定到Add方法
int sum = fd(1,2);
}匿名方法:簡化委托引用方法的過程
//定義一個委托類型
delegate void Dele(int x);
//用匿名方法創建委托
Dele de = delegate(int x){
//委托所調用的代碼。。。
}委托的發布和訂閱(按書的說法如下):
首先要通過發布者來發布這個委托,然后定義一個事件觸發器,在這個觸發器被激發后,會調用這個委托,然后委托根據自身的訂閱情況,再進行回調委托(事件)的處理方法,因為委托事件已經通過"+="符號鏈接到該處理方法上。
還是按例子進行說明~~
//定義一個委托類型Ring,參數傳入1表示上課,2表示下課
public delegate void Ring(int kind);
/*定義委托發布者類型SchoolRing,并定義Ring類型的公有成員,再定義一個成員方法Active,用來實現激發委托操作*/
public class SchoolRing{
pulbic Ring OnBell;//委托發布
public void Active(int kind){
if(kind==1||kind==2){
//不為空說明已經訂閱?;卣{OnBell委托所訂閱的具體方法
if(OnBell!=null) OnBell(kind);
}else{}
}
}//定義訂閱者類
public class Students{//定義訂閱者類
public void Subscribe(SchoolRing sr){//學者訂閱鈴聲這個委托事件
sr.OnBell += SchoolActive;//通過委托的鏈接操作進行訂閱
}
public void SchoolActive(int kind){
if(kind==1){}
else if(kind==2){}
}
public void Cancel(SchoolRing sr){//取消訂閱鈴聲動作
sr.OnBell -= SchoolActive;
}
}//當發布者SchoolRing類的對象調用其Active方法進行打鈴時,就會自動調用Students對象的SchoolActive這個事件處理方法
SchoolRing sr = new SchoolRing();//創建事件發布者實例 Students st = new Students();//創建事件訂閱者實例 st.Subscribe(sr);//學生訂閱學校鈴聲 sr.Activte(Convert.ToInt32(Console.ReadLine()));//開始打鈴
.NET類庫中定義一個EventHandler類,并且盡量使用這類作為事件的委托類型,該委托類型的定義:
public delegate void EventHandler(object sender,EventArgs e);
其中object類型的參數sender表示引發事件的對象,由于事件成員只能由類型本身出發,所以通常傳為this。
上面代碼可修改為:
/*EventHandler委托的第二個參數e表示事件中包含的數據。如果發布者還要向訂閱者傳遞額外的事件數據,需要定義EventArgs的派生類*/
public class RingArgs: EventArgs{
private int kind;
public int Kind{get{return kind;}}
public RingArgs(int kind){this.kind = kind;}
}
//Students類對OnBell事件的處理方法修改
public void SchoolActive(object sender, EventArgs e){
if(((RingArgs)e).Kind == 1){}
else if(((RingArgs)e).Kind == 2){}
}//SchoolRing的實例在出發OnBell事件時,可以將該類型(RingArgs)的對象作為參數傳遞給EventHandler委托
public event EventHandler OnBell;//委托發布
public void Active(int kind){
if(kind == 1 || kind ==2){
if(OnBell!=null)
OnBell(this, new RingArgs(kind));//回調委托所訂閱的方法
}
}
public void SchoolActive(object sender, EventArgs e){
if(((RingArgs)e).Kind == 2){}
else if(...)
}//在之前講到的Windows控件中其實也涉及到事件的內容,我們通常在Form1.cs中定義事件,在Form.Designer.cs中關聯事件
private void button1_Click(object sender , EventArgs e){}
button1.Click += new EventHandler(button1_Click);//關聯事件免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。