日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# delegate与event,委托与事件

發(fā)布時(shí)間:2023/12/10 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# delegate与event,委托与事件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 委托
    • 示例
  • 事件
    • 實(shí)例

  • 博主寫作不容易,孩子需要您鼓勵(lì)
  • 萬水千山總是情 , 先點(diǎn)個(gè)贊行不行

委托和事件是C#中兩個(gè)比較復(fù)雜的概念,這篇文章介紹兩個(gè)概念與基本用法,讓大家理解C#中的事件處理機(jī)制。

委托

委托也叫代理,就是把事情交付給別人去辦,如代購。C#中如果將一個(gè)方法委托給一個(gè)對(duì)象,這個(gè)對(duì)象就可以全權(quán)代理這個(gè)方法的執(zhí)行。
使用委托時(shí)首先要定義委托,聲明委托能代理什么類型的方法。

  • 語法格式如下:
  • <訪問修飾符> delegate 返回類型 委托名();

    從上邊的語法格式可以看出,定義委托與定義方法類似。
    委托沒有具體實(shí)現(xiàn),委托能夠代表什么樣的方法由它的返回類型和參數(shù)列表決定。如果定義如下的委托:

    public delegate void stuDelegate(string name);

    那么使用stuDelegate委托代表的只可以是沒有返回值,且參數(shù)為一個(gè)字符串的方法。
    定義了委托之后要使用委托,首先要實(shí)例化委托。實(shí)例化委托就是將其指向某個(gè)方法,即調(diào)用委托的構(gòu)造函數(shù),并將相關(guān)聯(lián)的方法作為參數(shù)傳遞。然后通過調(diào)用委托,執(zhí)行相關(guān)方法的代碼,實(shí)現(xiàn)委托。

    示例

    使用委托對(duì)數(shù)組元素按降序排列

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{public delegate bool ShortDelegate(int[] x);static void Main(string[] args){int[] arr = new int[] { 8, 4, 5, 6, 2, 1, 3, 7, 9, 0 };Console.WriteLine("未排序前數(shù)組序列為:");foreach (int i in arr){Console.Write("{0},", i);}ShortDelegate MyDelegate;//聲明委托變量MyDelegate = new ShortDelegate(ArrayShort.SortArray);//實(shí)例化委托MyDelegate(arr);//調(diào)用委托排序Console.WriteLine("\n排序后數(shù)組序列為:");foreach (int i in arr){Console.Write("{0},", i);}Console.ReadKey();}}class ArrayShort{public static bool SortArray(int[] Array){ //定義方法SortArray用于按照降序排列for (int i = Array.GetUpperBound(0); i >= 0; i--)//循環(huán)從后向前分別取出數(shù)組中的一個(gè)元素{//冒泡排序,將數(shù)值小的元素移到后面,直到所有的元素按照降序排列for (int j = 0; j <= i; j++){if (Array[j] <= Array[i]){Swap(ref Array[j], ref Array[i]);//交換兩個(gè)元素位置}}}return true;}static void Swap(ref int x,ref int y)//交換兩個(gè)數(shù){int z = x;x = y;y = z;}}}

    運(yùn)行結(jié)果:

    事件

    事件是C#中的一個(gè)高級(jí)概念,是操作發(fā)生時(shí)允許執(zhí)行特定應(yīng)用程序的代碼的機(jī)制。事件要么在相關(guān)聯(lián)的操作發(fā)生前發(fā)生,要么在操作發(fā)生后發(fā)生。例如,當(dāng)用戶單擊窗口中的按鈕時(shí),將引發(fā)一個(gè)事后事件,以允許執(zhí)行特定于應(yīng)用程序的方法。類或?qū)ο罂梢酝ㄟ^事件向其他類或?qū)ο笸ㄖl(fā)生的相關(guān)事情。發(fā)送事件的類成為發(fā)行者,接受事件的類成為訂閱者。在典型的C#Windows窗體或者web應(yīng)用開發(fā)中,可以訂閱由控件引發(fā)的事件。

  • 在C#類中定義和使用事件一般有下面幾個(gè)步驟。
  • 1、在類中聲明關(guān)于事件的委托。
  • public delegate void 事件類型名稱(object sender,EventArgs e);

    在事件類型名稱建議使用EventHandler結(jié)尾。如果想自定義事件的參數(shù)EventArgs,可以用EventArgs類派生自己的事件參數(shù)類,也可以沒有參數(shù)。

  • 2、在類中聲明事件,使用步驟1的委托作為事件的類型。
  • public event 事件類型的名稱 事件名稱;
  • 3、在類中需要引發(fā)事件的方法中,編寫引發(fā)事件的方法。
  • 事件名稱(this, new EventArgs());

    或者

    if(事件名稱!=null) 事件名稱(this, new EventArgs());
  • 4、訂閱事件,當(dāng)事件發(fā)生時(shí)通知訂戶。
  • 帶有事件的類實(shí)例.事件名稱+=new 事件名稱(事件處理方法名稱);
  • 5、編寫事件處理方法。
  • public void 事件處理方法名稱(object sender,EventArgs e) { //添加事件處理代碼 }
  • 6、在適當(dāng)?shù)臈l件下觸發(fā)事件,即需要調(diào)用步驟3中的引發(fā)事件的方法。
  • 實(shí)例

    假設(shè)設(shè)計(jì)一個(gè)高檔熱水器,通電加熱超過97℃時(shí),揚(yáng)聲器會(huì)進(jìn)行提示現(xiàn)在溫度,顯示器提示水快燒開了。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{public delegate bool ShortDelegate(int[] x);static void Main(string[] args){Heater heater = new Heater();Alarm alarm = new Alarm();heater.BoilEvent += alarm.MakeAlert;heater.BoilEvent += Display.ShowMsg;heater.BoilWater();Console.ReadKey();}}public class Heater{private int temperature;//水溫public delegate void BoilHandle(int x);//聲明關(guān)于事件的委托public event BoilHandle BoilEvent;//聲明水要燒開的事件public void BoilWater(){ //燒水的方法for (int i = 0; i <= 100; i++){temperature = i;if (temperature > 96){if (BoilEvent != null){BoilEvent(temperature);}}}}}public class Alarm{public void MakeAlert(int x){ //水開燒開的報(bào)警方法Console.WriteLine("Alarm:dididid,水已經(jīng){0}℃了",x);}}public class Display{public static void ShowMsg(int x){Console.WriteLine("Display:水快開了,當(dāng)前溫度為:{0}℃",x);}}}

    運(yùn)行結(jié)果:

    ------------------------------------------------------------------------------------------分割線 ------------------------------------------------------------------------------------------
    • 博主簡介:
    • 工業(yè)自動(dòng)化上位機(jī)軟件工程師、機(jī)器視覺算法工程師、運(yùn)動(dòng)控制算法工程師。目前從業(yè)于智能制造自動(dòng)化行業(yè)。 博主郵箱:2296776525@qq.com
    • 幫忙點(diǎn)個(gè)贊吧。哈哈。

總結(jié)

以上是生活随笔為你收集整理的C# delegate与event,委托与事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。