C# delegate與event,委托與事件

文章目錄

  • 委托
    • 示例
  • 事件
    • 實例

  • 博主寫作不容易,孩子需要您鼓勵
  • 萬水千山總是情 , 先點個贊行不行

委托和事件是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
    • 幫忙點個贊吧。哈哈。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

路由器與交換機的工作原理

路由器與交換機的工作原理 計算機網絡往往由許多種不同類型的網絡互連連接而成。如果幾個計算機網絡只是在物理上連接在一起&#xff0c;它們之間并不能進行通信&#xff0c;那么這種“互連”并沒有什么實際意義。因此通常在談到“互連”時&#xff0c;就已經暗示這些相互連接的…

Java的四種引用,強弱軟虛,用到的場景(轉+補充)

Q1&#xff1a;引用隊列是什么&#xff1f;如何使用&#xff1f;使用的場景有哪些&#xff1f; A1:oracle的api文檔的描述&#xff1a; https://docs.oracle.com/javase/7/docs/api/java/lang/ref/ReferenceQueue.htmlReference queues, to which registered reference objects…

C# lambda表達式與匿名方法

文章目錄匿名方法Lambda表達式實例實例博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 C#中的匿名方法是在C#2.0引入的&#xff0c;它終結了聲明委托的唯一方法是使用命名方法的時代。在C#更高版本中&#xff0c;Lambda表達式取代了匿名方法&a…

LINUx打包命令匯總

.tar 解包&#xff1a;tar xvf FileName.tar 打包&#xff1a;tar cvf FileName.tar DirName &#xff08;注&#xff1a;tar是打包&#xff0c;不是壓縮&#xff01;&#xff09; ——————————————— .gz 解壓1&#xff1a;gunzip FileName.gz 解壓2&#xff1a;…

常用的相似度計算

在數據分析和數據挖掘的過程中&#xff0c;我們經常需要知道個體間差異的大小&#xff0c;進而評價個體的相似性和類別。最常見的是數據分析中的相關分析&#xff0c;數據挖掘中的分 類和聚類算法&#xff0c;如K最近鄰&#xff08;KNN&#xff09;和K均值&#xff08;K-Means&…

玩轉C#窗體-屬性、方法和事件詳細說明

文章目錄簡介Windows窗體的基本屬性一、布局屬性1、StartPosition屬性2、Location屬性3、尺寸屬性4、WindowsState屬性5、Autoscroll屬性6、AutoSize屬性二、樣式屬性1、ControlBox屬性2、MaximizeBox屬性3、MinimizeBox屬性4、HelpButton屬性5、ShowIcon屬性6、Icon屬性7、Sho…

for循環和數組練習

//公雞2文&#xff0c;母雞1文&#xff0c;小雞半文&#xff0c;每種至少一只&#xff0c;100文買100只雞有多少種可能var ci 0; for(var g1;g<50;g){for(var m1;m<100;m){for(var x1;x<100;x){if(g*2m*1x*(0.5)100&&gmx100){ci1;console.log("買公雞&qu…

CMD下查看路由表

在cmd下面輸入route print 就可以查看路由表 如何讀懂路由表如何讀懂路由表 源碼:--------------------------------------------------------------------------------Active Routes: Network Destination Netmask Gateway Interface M…

c# automapper 使用

一、最簡單的用法 有兩個類User和UserDto 1 public class User2 {3 public int Id { get; set; }4 public string Name { get; set; }5 public int Age { get; set; }6 }7 8 public class UserDto9 { 10 public string Na…

js正則歸納

/* * 正則的緩存區 * 一、 var numadb1122;var reg/(\d)\1(\d)\2/gi;console.log(num.match(reg));//[ 1122 ]二、普通字符&#xff1a;a b c 1 2 3 特殊字符&#xff1a;\d \w \D //w d 是什么三、元字符中限定符* &#xff1a; 匹配0到多 &#xff1a; 匹配1到…

洛谷 P1469 找筷子

題目描述 經過一段時間的緊張籌備&#xff0c;電腦小組的“RP餐廳”終于開業了&#xff0c;這天&#xff0c;經理LXC接到了一個定餐大單&#xff0c;可把大家樂壞了&#xff01;員工們齊心協力按要求準備好了套餐正準備派送時&#xff0c;突然碰到一個棘手的問題&#xff0c;筷…

玩轉C#控件-常用控件屬性

文章目錄概述Control類的基本屬性1、Name屬性2、Text屬性3、Anchor屬性4、Dock屬性Control類的方法和事件博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 概述 控件是包含在窗體上的對象&#xff0c;是構成用戶界面的基本元素&#xff0c;也是…

LazyT 提供對延遲初始化的支持

延遲初始化 就是在第一次使用的時候在 進行類的初始化 public class Student{public Student(){this.Name "DefaultName";this.Age 0;Console.WriteLine("Student is init...");}public string Name { get; set; }public int Age { get; set; }} public…

264標準中高復雜度的三方面

一、運功估計搜索 二、碼率控制 三、濾波算法 在264中&#xff0c;這三方面占據了絕大部分的計算復雜度。具體原因或是優化的具體步驟有時間補上。

ie瀏覽器不支持多行隱藏顯示省略號

平時在寫頁面過程中&#xff0c;相信大家都遇到過文本顯示多行后用省略號代替的問題&#xff0c;來看看代碼&#xff1a; p{display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp:12;//表示顯示12行之后用省略號代替-webkit-box-orient:vertical…

API設計原則 - Qt官網的設計實踐總結

原文鏈接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影響力上 Gary Gao 的譯文稿&#xff1a;C的API設計指導 譯文發在酷殼 - CoolShell&#xff1a;API設計原則&#xff0c; 2017-07-25 API設計原則 - Qt官網的設計實踐總結 &#x1f34e; 譯序 Qt的設計水準在業…

python帶參裝飾器的改良版

簡單點就是這種 def deco2(param1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2deco2 # 錯誤的寫法 def f2(strx):print (strx)f2(hello) 運行上面這個&#xff0c;期待打印1和hello 實際上是不…

H.264邊緣塊進行幀內預測時,上邊緣和左邊緣塊的預測情況。

僅僅介紹上邊緣塊需要用到上面的像素&#xff08;不存在&#xff09;&#xff08;例如垂直模式&#xff09;&#xff0c;左邊緣快需要用到左邊的像素&#xff08;不存在&#xff09;&#xff08;例如水平模式&#xff09;的情況。 H.264 I幀邊緣塊的處理 I幀的第一個左上的邊緣…

P1021 郵票面值設計

P1021 郵票面值設計 題目描述 給定一個信封&#xff0c;最多只允許粘貼N張郵票&#xff0c;計算在給定K&#xff08;NK≤15&#xff09;種郵票的情況下&#xff08;假定所有的郵票數量都足夠&#xff09;&#xff0c;如何設計郵票的面值&#xff0c;能得到最大值MAX&#xff0c…

第七章:XAML vs. code(3)

屬性元素語法這里有一些C&#xff03;與第4章中的FramedText代碼相似。在一個語句中&#xff0c;它實例化一個Frame和一個Label&#xff0c;并將Label設置為Frame的Content屬性&#xff1a; new Frame {OutlineColor Color.Accent,HorizontalOptions LayoutOptions.Center,Ve…