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);}}
运行的效果图如下:
C#中Delegate和Event以及它们的区别相关推荐
- C#中Delegate和Event以及它们的区别(转载)
一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...
- C#知识点总结系列:3、C#中Delegate和Event
一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...
- C# delegate、event、Action、Func使用案例解析
C# 中 delegate.event.Action.Func使用案例解析 一:delegate与event配合使用 public static class Evt_Test{public stati ...
- C#中的delegate和event (转)
C#中的delegate和event 在基于Windows平台的程序设计中,事件(event)是一个很重要的概念.因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮.处 ...
- C#中的delegate和event作用及区别
Delegate delegate是C#中很重要的语法. 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 声明了delegate的属性都会继承自Delegate类. 使用单播委托类 ...
- c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...
今天来讲一讲<C#delegate.event.Action.EventHandler的使用和区别> 目录 所以,event应运而生 所以,EventHandler应运而生 所以,Acti ...
- 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别
bind() ...
- delegate与event的区别
public delegate void DGCameraOperator(Branch branch);public event DGCameraOperator OpenCamera;public ...
- c#中delegate使用
引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理.这两天,我再度翻阅了一些关于Delegate的资料 ...
最新文章
- go语言1.4版本将支持面向android开发,[翻译]Go语言1.4版本将支持面向Android开发
- 数博会重磅活动:第二届大数据科学与工程国际会议议程
- dj鲜生-38-项目上线简介-从本地小项目到云服务的调试
- android引入外部moudle,Android Studio3.2,调用其他Module作为依赖,出现的问题。
- 引领性指标与滞后性指标_测量可用性组同步滞后
- 特征工程整理流程和涉及技术点
- 读取usb口数据_Mixly 第12课 模拟值读取实验串口使用
- 8255A置位复位控制字
- Oracle系统表大全(转)
- CF891E Lust 生成函数
- 牛顿插值法 matlab程序计算方法,牛顿插值法matlab程序
- 杨辉三角形JAVA代码
- Windows 域时间同步
- linux内核的reciprocal_value结构体
- PS制作搞笑印章 - 仿真印章 - 水印滤色
- 今日恐慌与贪婪指数为15 恐慌程度较昨日持续下降
- 固态硬盘的一些参数规范
- RecyclerView之利用ItemDecoration实现万能分割线
- 改了dns服务器有没有影响,dns改成114有危险吗_dns改了有什么影响
- java web全栈_web全栈java开发哪个前景好
热门文章
- 转行经验分享,关于软件测试的感悟,你想知道的都在这里……
- 收藏~10年软件测试人员的工作方法进阶汇总
- Endnote在word中每次启动都要加载,或者无法加载的解决办法
- android 第三方裁剪,Android裁剪意向不适用于系统图库应用程序,但适用于第三方应用程序...
- java 删除列 csv,Java- CSV / Delete column in csv file
- how to use automake to build files
- cocos2d-x第一天:环境的搭建
- pycharm下的第一个函数程序
- op手机突然显示无服务器,op手机 云服务器
- mysql io 100_MySQL服务器 IO 100%的案例分析