欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

一、通過(guò)委托執(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()
    {
      //聲明一個(gè)委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù)
      DoSth d = new DoSth(Print);
      string str = "Hello,World";
      //通過(guò)委托的靜態(tài)方法Invoke觸發(fā)委托
      d.Invoke(str);
    }
    void Print(string str)
    {
      Console.WriteLine(str);
    }
}

上述代碼實(shí)現(xiàn):

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

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

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

上述代碼實(shí)現(xiàn):

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

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

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

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //聲明一個(gè)委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù)
      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);
    }
}

上述代碼實(shí)現(xiàn):

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

而且,通過(guò)+=還可以為事件注冊(cè)多個(gè)委托。

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //聲明一個(gè)委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù)
      DoSth d = new DoSth(Print);
      DoSth d1 = new DoSth(Say);
      object sender = 10;
      EventArgs e = new EventArgs();
      //為事件注冊(cè)多個(gè)委托
      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);
    }
}

以上,通過(guò)+=為事件注冊(cè)1個(gè)或多個(gè)委托實(shí)例,實(shí)際上,還可以為事件直接注冊(cè)方法。

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();
      //為事件注冊(cè)多個(gè)委托
      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);
    }
}  
 

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

先來(lái)看EventHandler的源代碼。

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

可見(jiàn),EventHandler就是委托?,F(xiàn)在就使用EventHandler來(lái)執(zhí)行多個(gè)方法。

public class Example
{
    public event EventHandler myEvent;
    internal void Go()
    {
      object sender = 10;
      EventArgs e = new EventArgs();
      //為事件注冊(cè)多個(gè)委托
      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);
    }
}

總結(jié):

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

相信本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價(jià)值。

相關(guān)文章

  • UnityShader使用Plane實(shí)現(xiàn)翻書(shū)效果

    UnityShader使用Plane實(shí)現(xiàn)翻書(shū)效果

    這篇文章主要為大家詳細(xì)介紹了UnityShader使用Plane實(shí)現(xiàn)翻書(shū)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#中IList<T>與List<T>的區(qū)別深入解析

    C#中IList<T>與List<T>的區(qū)別深入解析

    本篇文章主要是對(duì)C#中IList<T>與List<T>的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • 使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法

    使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法

    下面小編就為大家?guī)?lái)一篇使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹

    深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹

    本篇文章是對(duì)C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#算法之整數(shù)反轉(zhuǎn)

    C#算法之整數(shù)反轉(zhuǎn)

    這篇文章介紹了C#算法之整數(shù)反轉(zhuǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟

    c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟

    這篇文章主要介紹了c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟,大家參考使用吧
    2013-12-12
  • C#中異步和多線(xiàn)程的區(qū)別介紹

    C#中異步和多線(xiàn)程的區(qū)別介紹

    這篇文章介紹了C#中異步和多線(xiàn)程的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C#實(shí)現(xiàn)JSON解析器MojoUnityJson功能(簡(jiǎn)單且高效)

    C#實(shí)現(xiàn)JSON解析器MojoUnityJson功能(簡(jiǎn)單且高效)

    MojoUnityJson 是使用C#實(shí)現(xiàn)的JSON解析器 ,算法思路來(lái)自于游戲引擎Mojoc的C語(yǔ)言實(shí)現(xiàn) Json.h。這篇文章主要介紹了C#實(shí)現(xiàn)JSON解析器MojoUnityJson的方法,需要的朋友可以參考下
    2018-01-01
  • 詳解C#中檢查null的語(yǔ)法糖

    詳解C#中檢查null的語(yǔ)法糖

    這篇文章主要為大家詳細(xì)介紹了C#中檢查null的語(yǔ)法糖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以了解一下
    2022-04-04
  • C# WINFORM自定義異常處理方法

    C# WINFORM自定義異常處理方法

    這篇文章主要介紹了一個(gè)簡(jiǎn)單的統(tǒng)一異常處理方法。系統(tǒng)底層出現(xiàn)異常,寫(xiě)入記錄文件,系統(tǒng)頂層捕獲底層異常,顯示提示信息。需要的可以參考一下
    2021-12-12

最新評(píng)論