C# delegate与event,委托与事件
文章目錄
- 委托
- 示例
- 事件
- 實(shí)例
|
委托和事件是C#中兩個(gè)比較復(fù)雜的概念,這篇文章介紹兩個(gè)概念與基本用法,讓大家理解C#中的事件處理機(jī)制。
委托
委托也叫代理,就是把事情交付給別人去辦,如代購。C#中如果將一個(gè)方法委托給一個(gè)對(duì)象,這個(gè)對(duì)象就可以全權(quán)代理這個(gè)方法的執(zhí)行。
使用委托時(shí)首先要定義委托,聲明委托能代理什么類型的方法。
- 語法格式如下:
- <訪問修飾符> delegate 返回類型 委托名();
從上邊的語法格式可以看出,定義委托與定義方法類似。
public delegate void stuDelegate(string name);
委托沒有具體實(shí)現(xiàn),委托能夠代表什么樣的方法由它的返回類型和參數(shù)列表決定。如果定義如下的委托:那么使用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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟银行转账信息
- 下一篇: C# lambda表达式与匿名方法