最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中委托和事件的區(qū)別實例解析

 更新時間:2014年09月12日 12:24:36   投稿:shichen2014  
這篇文章主要介紹了C#中委托和事件的區(qū)別,并分別以實例形式展示了通過委托執(zhí)行方法與通過事件執(zhí)行方法,以及相關的執(zhí)行流程與原理分析,需要的朋友可以參考下

本文實例分析了C#中委托和事件的區(qū)別,分享給大家供大家參考之用。具體如下:

大致來說,委托是一個類,該類內部維護著一個字段,指向一個方法。事件可以被看作一個委托類型的變量,通過事件注冊、取消多個委托或方法。本篇分別通過委托和事件執(zhí)行多個方法,從中體會兩者的區(qū)別。

一、通過委托執(zhí)行方法

class Program
{
    static void Main(string[] args)
    {
      Example example = new Example();
      example.Go();
      Console.ReadKey();
    }
}
public class Example
{
    public delegate void DoSth(string str);
    internal void Go()
    {
      //聲明一個委托變量,并把已知方法作為其構造函數的參數
      DoSth d = new DoSth(Print);
      string str = "Hello,World";
      //通過委托的靜態(tài)方法Invoke觸發(fā)委托
      d.Invoke(str);
    }
    void Print(string str)
    {
      Console.WriteLine(str);
    }
}

上述代碼實現:

① 在CLR運行時,委托DoSth實際上就一個類,該類有一個參數類型為方法的構造函數,并且提供了一個Invoke實例方法,用來觸發(fā)委托的執(zhí)行。
② 委托DoSth定義了方法的參數和返回類型
③ 通過委托DoSth的構造函數,可以把符合定義的方法賦值給委托
④ 調用委托的實例方法Invoke執(zhí)行了方法

但實際上讓委托執(zhí)行方法還有另外一種方式,那就是:委托變量(參數列表)

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    internal void Go()
    {
      //聲明一個委托變量,并把已知方法作為其構造函數的參數
      DoSth d = new DoSth(Print);
      object sender = 10;
      EventArgs e = new EventArgs();
      d(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

上述代碼實現:

① 委托DoSth的參數列表和方法Print的參數列表還是保持一致
② 委托DoSth中的參數object sender通常用來表示動作的發(fā)起者,EventArgs e用來表示動作所帶的參數。

而實際上,委托變量(參數列表),事件就是采用這種形式執(zhí)行方法的。

二、通過事件執(zhí)行方法

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //聲明一個委托變量,并把已知方法作為其構造函數的參數
      DoSth d = new DoSth(Print);
      object sender = 10;
      EventArgs e = new EventArgs();
      myDoSth += new DoSth(d);
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

上述代碼實現:

① 聲明了事件myDoSth,事件的類型是DoSth這個委托
② 通過+=為事件注冊委托
③ 通過DoSth委托的構造函數為事件注冊委托實例
④ 采用委托變量(參數列表)這種形式,讓事件執(zhí)行方法

而且,通過+=還可以為事件注冊多個委托。

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //聲明一個委托變量,并把已知方法作為其構造函數的參數
      DoSth d = new DoSth(Print);
      DoSth d1 = new DoSth(Say);
      object sender = 10;
      EventArgs e = new EventArgs();
      //為事件注冊多個委托
      myDoSth += new DoSth(d);
      myDoSth += new DoSth(d1);
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

以上,通過+=為事件注冊1個或多個委托實例,實際上,還可以為事件直接注冊方法。

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      object sender = 10;
      EventArgs e = new EventArgs();
      //為事件注冊多個委托
      myDoSth += Print;
      myDoSth += Say;
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}  
 

三、通過EventHandler執(zhí)行方法

先來看EventHandler的源代碼。

public delegate void EventHandler(object sender, System.EventArgs e);

可見,EventHandler就是委托。現在就使用EventHandler來執(zhí)行多個方法。

public class Example
{
    public event EventHandler myEvent;
    internal void Go()
    {
      object sender = 10;
      EventArgs e = new EventArgs();
      //為事件注冊多個委托
      myEvent += Print;
      myEvent += Say;
      myEvent(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

總結:

① 委托就是一個類,也可以實例化,通過委托的構造函數來把方法賦值給委托實例
② 觸發(fā)委托有2種方式: 委托實例.Invoke(參數列表),委托實例(參數列表)
③ 事件可以看作是一個委托類型的變量
④ 通過+=為事件注冊多個委托實例或多個方法
⑤ 通過-=為事件注銷多個委托實例或多個方法
⑥ EventHandler就是一個委托

相信本文所述對大家C#程序設計的學習有一定的借鑒價值。

相關文章

  • C#實現飛行棋小游戲

    C#實現飛行棋小游戲

    這篇文章主要為大家詳細介紹了C#實現飛行棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C#中SQL參數傳入空值報錯解決方案

    C#中SQL參數傳入空值報錯解決方案

    這篇文章主要介紹了C#中SQL參數傳入空值報錯解決方案,需要的朋友可以參考下
    2017-06-06
  • C# Nullable的使用小結

    C# Nullable的使用小結

    本文主要介紹了C# Nullable的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C#中基數排序算法的原理及實現

    C#中基數排序算法的原理及實現

    基數排序算法是一種非比較式的排序方法,通過分配和收集步驟對數字的每一位進行排序,學習基數排序有助于提高排序效率,解決特定問題,廣泛應用于多個領域如數據分析和數據庫索引建立等
    2024-10-10
  • C#畫筆Pen保存和恢復圖形對象的設置方法

    C#畫筆Pen保存和恢復圖形對象的設置方法

    這篇文章主要介紹了C#畫筆Pen保存和恢復圖形對象的設置方法,實例分析了畫筆的保存save及恢復屬性Restore的相關使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#實現六大設計原則之依賴倒置原則

    C#實現六大設計原則之依賴倒置原則

    這篇文章介紹了C#實現六大設計原則之依賴倒置原則的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#使用Ado.net讀取Excel表的方法

    C#使用Ado.net讀取Excel表的方法

    這篇文章主要介紹了C#使用Ado.net讀取Excel表的方法,涉及C#使用OLEDB操作Excel的方法,需要的朋友可以參考下
    2015-04-04
  • C#中參數數組、引用參數和輸出參數示例詳解

    C#中參數數組、引用參數和輸出參數示例詳解

    這篇文章主要給大家介紹了關于C#中參數數組、引用參數和輸出參數的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • C#文件目錄操作方法匯總

    C#文件目錄操作方法匯總

    本文主要列舉出C#文件和目錄操作的一些方法,包括創(chuàng)建、移動、遍歷目錄,讀寫文件等方法,有需要的小伙伴可以學習一下。
    2016-04-04
  • C#實現的自定義郵件發(fā)送類完整實例(支持多人多附件)

    C#實現的自定義郵件發(fā)送類完整實例(支持多人多附件)

    這篇文章主要介紹了C#實現的自定義郵件發(fā)送類,具有支持多人多附件的功能,涉及C#郵件操作的相關技巧,需要的朋友可以參考下
    2015-12-12

最新評論

庄河市| 青田县| 始兴县| 庆阳市| 金门县| 张北县| 泰和县| 光泽县| 衢州市| 金山区| 呼玛县| 肥乡县| 策勒县| 寻乌县| 垫江县| 阳春市| 金湖县| 瓮安县| 玛纳斯县| 陕西省| 兖州市| 长岭县| 南靖县| 台北市| 临沧市| 霞浦县| 镇沅| 遂平县| 连州市| 芮城县| 永春县| 禄丰县| 铜山县| 青浦区| 昌江| 大城县| 沈阳市| 大竹县| 景宁| SHOW| 海安县|