[C#.NET] 如何 使用 委派 Delegate / 事件 event

  • 244612
  • 0
  • C#
  • 2014-09-18

[C#.NET] 如何 使用 委派 Delegate / 事件 event

利用委派進階叫用函式。

[原創]Callback與Delegate原理

.NET 事件與委派詳論

1. 委派可以將方法當成參數來進行傳遞

委派宣告:
[public|private|protected] Delegate [void | 回傳資料型態] 委派名稱 ([參數群一]);

2. 委派是事件的基礎(event),可以利用委派來呼叫不同的事件,以便觸發其他控制項事件來完成互動性強大的應用程式。

事件宣告:
public event ClickEventHandler ClickEvent;
[存取修飾詞] event 委派方法 事件名稱 ;

3. Delegate方法,可用於向某個Class傳遞註冊過的方法(註冊的Method的參數必須和Delegate方法完全一致

4. VB已有WithEvents不使用委派也能達到觸發事件的功能,但在C#必須自己宣告委派才能使用事件,C#在使用事件還真麻煩呢。

 

如何使用委派傳遞方法

1.建立方法;一個有回傳值,一個沒有。

public int InstanceMethod(int a, int b)
{
     Console.WriteLine("Call InstanceMethod ");
     Console.WriteLine("First parametre is {0},second parametre is {1}", a, b);
     return 0;
}
     static public void StaticMethod()
{
     Console.WriteLine("Call Static Method");        
}

 

 

2.宣告委派;委派參數,需要與被呼叫的方法一樣,包含回傳型別。

private delegate void MyDelegate();
private delegate int MeDelegatePara(int a, int b);

 

3.引用委派(實體化),後指定方法

MyDelegate D = new MyDelegate(MyClass.StaticMethod);

 

4.呼叫函數

D.Invoke();

 

可省略成

D();

 

 

如何使用事件傳遞方法

1.建立事件函數

修飾詞最好使用protected virtual這樣子類別就可以直接覆寫事件觸發的定義

private void MyButton_Click(object sender, EventArgs e)
{
    Console.WriteLine("事件發生了喔");
}

 

2.委派宣告

public delegate void ClickEventHandler(object sender, EventArgs e);

 

 

3.創建MyBottom類別
4.宣告MyBottom的事件
5.建立MyButton成員方法
6.拋出事件,給所有相應者

//3.創建MyBottom類別
public class MyButton
{
    //4.宣告MyBottom的事件
    public event ClickEventHandler ClickEvent;
    //5.建立MyButton成員方法
    public void Click()
    {
        if (ClickEvent != null)
        {
            Console.WriteLine("事件開始");
            //6.拋出事件,給所有相應者
            ClickEvent(this, null);
        }
    }
}

 

7.引用類別實體化

public MyButton myButton = new MyButton();

 

8.事件實體化,註冊事件

myButton.ClickEvent += new ClickEventHandler(MyButton_Click);

 

9.使用方式

private void Form1_Load(object sender, EventArgs e)
{
    //引用
    Form1 form = new Form1();
    form.myButton.Click();
}
 
範例下載:C#.NET 委派事件用法.rar

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo