国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中委托和事件的區別實例解析

2020-01-24 02:25:39
字體:
來源:轉載
供稿:網友

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

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

一、通過委托執行方法

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";      //通過委托的靜態方法Invoke觸發委托      d.Invoke(str);    }    void Print(string str)    {      Console.WriteLine(str);    }}

上述代碼實現:

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

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

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通常用來表示動作的發起者,EventArgs e用來表示動作所帶的參數。

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

二、通過事件執行方法

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委托的構造函數為事件注冊委托實例
④ 采用委托變量(參數列表)這種形式,讓事件執行方法

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

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執行方法

先來看EventHandler的源代碼。

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

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

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);    }}

總結:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆子县| 中西区| 崇义县| 淮滨县| 颍上县| 峨眉山市| 普洱| 郓城县| 顺昌县| 寻乌县| 永定县| 五莲县| 合山市| 铁岭县| 米易县| 曲周县| 南和县| 堆龙德庆县| 玉树县| 东乌| 乐业县| 壤塘县| 湖州市| 通化县| 白山市| 田林县| 孝义市| 石渠县| 普陀区| 新乡县| 府谷县| 蒙城县| 岳阳市| 宝兴县| 岑巩县| 宣城市| 桂平市| 宜君县| 河西区| 亳州市| 松滋市|