文章目錄
- 委托
- 示例
- 事件
- 實例
|
委托和事件是C#中兩個比較復雜的概念,這篇文章介紹兩個概念與基本用法,讓大家理解C#中的事件處理機制。
委托
委托也叫代理,就是把事情交付給別人去辦,如代購。C#中如果將一個方法委托給一個對象,這個對象就可以全權代理這個方法的執行。
使用委托時首先要定義委托,聲明委托能代理什么類型的方法。
- 語法格式如下:
<訪問修飾符> delegate 返回類型 委托名();
從上邊的語法格式可以看出,定義委托與定義方法類似。
委托沒有具體實現,委托能夠代表什么樣的方法由它的返回類型和參數列表決定。如果定義如下的委托:public delegate void stuDelegate(string name);
那么使用
stuDelegate
委托代表的只可以是沒有返回值,且參數為一個字符串的方法。
定義了委托之后要使用委托,首先要實例化委托。實例化委托就是將其指向某個方法,即調用委托的構造函數,并將相關聯的方法作為參數傳遞。然后通過調用委托,執行相關方法的代碼,實現委托。示例
使用委托對數組元素按降序排列
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("未排序前數組序列為:");foreach (int i in arr){Console.Write("{0},", i);}ShortDelegate MyDelegate;//聲明委托變量MyDelegate = new ShortDelegate(ArrayShort.SortArray);//實例化委托MyDelegate(arr);//調用委托排序Console.WriteLine("\n排序后數組序列為:");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--)//循環從后向前分別取出數組中的一個元素{//冒泡排序,將數值小的元素移到后面,直到所有的元素按照降序排列for (int j = 0; j <= i; j++){if (Array[j] <= Array[i]){Swap(ref Array[j], ref Array[i]);//交換兩個元素位置}}}return true;}static void Swap(ref int x,ref int y)//交換兩個數{int z = x;x = y;y = z;}}}
運行結果:
事件
事件是C#中的一個高級概念,是操作發生時允許執行特定應用程序的代碼的機制。事件要么在相關聯的操作發生前發生,要么在操作發生后發生。例如,當用戶單擊窗口中的按鈕時,將引發一個事后事件,以允許執行特定于應用程序的方法。類或對象可以通過事件向其他類或對象通知發生的相關事情。發送事件的類成為發行者,接受事件的類成為訂閱者。在典型的C#Windows窗體或者web應用開發中,可以訂閱由控件引發的事件。
- 在C#類中定義和使用事件一般有下面幾個步驟。
- 1、在類中聲明關于事件的委托。
public delegate void 事件類型名稱(object sender,EventArgs e);
在事件類型名稱建議使用EventHandler結尾。如果想自定義事件的參數EventArgs,可以用EventArgs類派生自己的事件參數類,也可以沒有參數。
- 2、在類中聲明事件,使用步驟1的委托作為事件的類型。
public event 事件類型的名稱 事件名稱;
- 3、在類中需要引發事件的方法中,編寫引發事件的方法。
事件名稱(this, new EventArgs());
或者
if(事件名稱!=null) 事件名稱(this, new EventArgs());
- 4、訂閱事件,當事件發生時通知訂戶。
帶有事件的類實例.事件名稱+=new 事件名稱(事件處理方法名稱);
- 5、編寫事件處理方法。
public void 事件處理方法名稱(object sender,EventArgs e) { //添加事件處理代碼 }
- 6、在適當的條件下觸發事件,即需要調用步驟3中的引發事件的方法。
實例
假設設計一個高檔熱水器,通電加熱超過97℃時,揚聲器會進行提示現在溫度,顯示器提示水快燒開了。
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);//聲明關于事件的委托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){ //水開燒開的報警方法Console.WriteLine("Alarm:dididid,水已經{0}℃了",x);}}public class Display{public static void ShowMsg(int x){Console.WriteLine("Display:水快開了,當前溫度為:{0}℃",x);}}}
運行結果:
------------------------------------------------------------------------------------------分割線 ------------------------------------------------------------------------------------------
- 博主簡介:
- 工業自動化上位機軟件工程師、機器視覺算法工程師、運動控制算法工程師。目前從業于智能制造自動化行業。 博主郵箱:2296776525@qq.com
- 幫忙點個贊吧。哈哈。