C#知识点总结系列:3、C#中Delegate和Event

一、Delegate委托可以理解为一个方法签名。

    可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下:

复制代码
        public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("这是普通方式创建的委托");//2.匿名委托Print print2 = delegate(string str) {Console.WriteLine(str);};print2("这是匿名方式创建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};
}
复制代码

  二、Event事件,是一种封装过的委托。

    它拥有以下三要素:

    1.事件发行者-达到某些条件时激发事件的对象

    2.事件订阅者-订阅事件并对事件发生时进行处理的对象

    3.定义发行者和订阅者关系,一个发行者可能会有多个订阅者。

  三、事件和委托的区别

    1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

    2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

  最后我们可以看看整个自定义事件的处理办法以及事件和委托的区别如下代码:

复制代码
    //事件参数public class My_EventArgs : EventArgs{private string _args = string.Empty;public My_EventArgs(string args){_args = args;}public string Args{get { return _args; }}}//事件发行者public class SourceClass{public double Width { get; set; }public double Height { get; set; }My_EventArgs Evargs;public SourceClass(string args){Evargs = new My_EventArgs(args);}//定义委托public delegate void EventHandler(object sender, My_EventArgs args);#region 使用委托方式声明public EventHandler Clicked;public void ClickedAsync(){if (Clicked != null){Clicked(this, Evargs);}}#endregion#region 使用事件方式声明public event EventHandler Click;public void ClickAsync(){if (Click != null){Click(this, Evargs);}}#endregion}//事件订阅者public class Del{public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}public static void Main(){#region 委托//1.普通委托var print1 = new Print(delegatemethod);print1("这是普通方式创建的委托");//2.匿名方法
Print print2 = delegate(string str) {Console.WriteLine(str);};print2("这是匿名方法创建的委托");//3.lambda委托Print print3 = (string str) => {Console.WriteLine(str);};print3("这是lambda方式创建的委托");#endregion#region 事件SourceClass source = new SourceClass("我的事件被触发");source.Width = 5.0;source.Height = 3.0;//一、委托方式允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));调用source.Clicked = new SourceClass.EventHandler(source_RightClick);source.Clicked += new SourceClass.EventHandler(source_LeftClick);source.ClickedAsync();source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));//二、很明显用户希望通过使用source.ClickedAsync();去调用函数,而非直接使用上行代码去调用,所以在这里需要使用Event关键字进行申明//注1.事件方式不允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));直接调用//注2.事件不允许 source.Click = new SourceClass.EventHandler(source_LeftClick);直接赋值source.Click += new SourceClass.EventHandler(source_LeftClick);source.ClickAsync();//注销事件和注册事件source.Click -= new SourceClass.EventHandler(source_LeftClick);source.Click += new SourceClass.EventHandler(source_RightClick);source.ClickAsync();Console.ReadLine();#endregion}//事件处理方法1static void source_LeftClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目标宽度:" + source.Width + ",目标高度:" + source.Height);Console.WriteLine("目标对象参数:"+args.Args);}//事件处理方法2static void source_RightClick(object sender, My_EventArgs args){SourceClass source = sender as SourceClass;Console.WriteLine("目标面积:" + source.Width *source.Height);}}
复制代码

   运行的效果图如下:

 

转 https://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

转载于:https://www.cnblogs.com/asdyzh/p/9885666.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js获得7天后的日期时间

思路:当前日期天数7 直接上代码: function getSpecialTime() {var currentDate;var arry currentDate.split("-");var year parseInt(arry[0],10);var month parseInt(arry[1],10);var day parseInt(arry[2],10); //月份的方法&#xff…

python的2种字符串格式化输出

字符串格式化代码(typecode) 法一: %格式使用下面的格式 %[(name)] [flags] [width][.precision] typecode (name)输出字典的value使用,这里的name是字典的key(实际指定时,必须有外面的圆括号) …

JS弹出DIV并使整个页面背景变暗功能的实现代码

1.首先写一个遮罩层div&#xff0c;然后再写一个弹窗的div <!-- 遮罩层 --> <div id"cover" style"background: #000; position: absolute; left: 0px; top: 0px; width: 100%; filter: alpha(opacity30); opacity: 0.3; display: none; z-index: 2 &…

dos命令测试网络连通情况

telnet测试端口命令&#xff1a; telnet IP地址 端口号 或者 telnet 域名 端口号traceroute指令让你追踪网络数据包的路由途径&#xff0c;命令&#xff1a; traceroute ip地址

Python中字典合并的四种方法

字典是Python语言中唯一的映射类型。映射类型对象里哈希值&#xff08;键&#xff0c;key&#xff09;和指向的对象&#xff08;值&#xff0c;value&#xff09;是一对多的的关系&#xff0c;通常被认为是可变的哈希表。字典对象是可变的&#xff0c;它是一个容器类型&#xf…

jar包打开闪退

第一种方法&#xff1a; 步骤一&#xff1a;新建一个文本文档&#xff0c;输入内容"javaw -jar %1 "&#xff0c;并保存为批处理文件&#xff0c;例如"run.bat "。 步骤二&#xff1a;右键点击.jar格式的文件 &#xff0c;选择其打开方式 为上面建的run.ba…

从零开始的全栈工程师——js篇2.12(面向对象)

面向对象 Js一开始就是写网页特效&#xff0c;面向过程的&#xff0c;作者发现这样写不好&#xff0c;代码重复利用率太高&#xff0c;计算机内存消耗太大&#xff0c;网页性能很差。 所以作者就收到java和c的影响&#xff0c;往面向对象靠齐。Js天生有一个Object&#xff0c;但…

java,js获取数组最大/小值

js最小值&#xff1a; var minValue Math.min.apply(null,args[]);js最大值 var maxValue Math.max.apply(null,args[]);JDK8特性&#xff1a;java最大值&#xff08;整数数组&#xff09;&#xff1a; int[] A {6,7,8,2,1,3,4,5}; int maxVal Arrays.stream(A).max().g…

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结 教材学习内容总结 第十一章 二叉查找树 1.二叉查找树&#xff1a;一种带有附加属性的二叉树。即每个结点其左孩子都要小于其父结点&#xff0c;而父结点又小于或等于其右孩子。&#xff08;左孩子<父结点<右孩…

JAVA读取本地图片并展示

代码如下&#xff1a; //读取本地图片输入流 FileInputStream inStream new FileInputStream("D:/image/123.jpg");//byte数组用于存放图片字节数据 byte[] buff new byte[inSteam.available()];inStream.read(buff); inStream.close();//设置发送到客户端的响应内…

Java中map关于putAll()和“=”的区别

putAll()方法&#xff1a; 相同的key&#xff0c;map1.putAll(map2); map1中的key-value会被覆盖。 不同的key&#xff0c;map2中的key-value会被追加到map1中。“”的使用&#xff1a; map1 map2; map1中所有的key-value都会被map2中的key-value覆盖。

Neo4j简介

1、什么是Neo4j   Neo4j是由java实现的开源NOSQL图数据库   数据库分为关系型和非关系型两种类型。   其中非关系型又分为Graph(图形),Document(文档),Cloumn Family(列式)&#xff0c;以及Key-Value Store(KV),   这四种类型数据库分别使用不同的数据结构进行存储。因…

js比较日期大小

//获取当前时间 var currentTime new Date();//自定义时间 var customTime"2019-03-01 00:00:00"; customTime customTime.replace("-","/");//替换字符&#xff0c;变成标准格式 customTime new Date(Date.parse(customTime));if(currentT…

Docker-容器数据卷

docker容器数据卷相当于外置的移动硬盘 docker容器数据卷主要功能是&#xff1a;容器的持久化、容器间继承共享数据 特点&#xff1a; &#xff08;1&#xff09;数据卷可以容器之间共享或重用数据 &#xff08;2&#xff09;卷中更改可以直接生效 &#xff08;3&#xff09;数…

weblogic的输出打印日志设置

设置路径&#xff1a; 1、服务器——》控制&#xff0c;进入服务器设置 2、服务器启动——>设置参数 3、参数配置&#xff1a; -Xms2048m -Xmx4096m -XX:PermSize256m -XX:MaxPermSize512m -XX:UseConcMarkSweepGC -XX:CMSClassUnloadingEnabled -XX:DisableExplicitGC -…

支持向量机——Large Margin Classifier

支持向量机的目标是 \[\underbrace {\min }_\theta \left\{ {C\left[ {\sum\limits_{i 1}^m {{y^{\left( i \right)}}{\mathop{\rm Cos}\nolimits} {t_1}\left( {{\theta ^T}{x^{\left( i \right)}}} \right) \left( {1 - {y^{\left( i \right)}}} \right){\mathop{\rm Cos}\…

WebLogic清理缓存

清除缓存路径&#xff1a; D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\cache D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\tmp D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\…

洛咕11月月赛

当时只打了十几分钟&#xff0c;以为T1是结论题看了几分钟去看T2&#xff0c;写完贪心就不想做咕掉了。 T1 暴力就能A。如果用数组开大点&#xff0c;打表发现开到\(M*7\)即可。记得取模。当然可以滚掉数组。懒得给CODE。 T2 显然是贪心。只需从最低的跳到最高的&#xff0c;再…

怎么查询表中BLOB字段的大小

返回的是字节&#xff08;B&#xff09; select DBMS_LOB.GETLENGTH(name) from table;

2018-2019-1 20189210 《LInux内核原理与分析》第四周作业

第三章 这一章接触内核源代码&#xff0c;对内核源码进行编译和调试跟踪 一、预备知识&#xff1a; 内核&#xff1a;整个操作系统的最底层&#xff0c;它负责了整个硬件的驱动以及提供各种系统所需的内核功能。内核实质上是系统上面的一个文件而已&#xff0c;这个文件包含了驱…