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.mzph.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…