溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#委托與事件

發布時間:2020-07-06 17:14:12 來源:網絡 閱讀:1146 作者:dongdong200514 欄目:編程語言

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);//關聯事件


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女