C# 委托,转自别人 短命女 2021-11-30 00:10 257阅读 0赞 ## [C\#中的委托是什么?事件是不是一种委托?][C] ## Posted on 2008-12-14 08:47 [chunbo][] 阅读(3511) 评论( 0) [编辑][Link 1] [收藏][C] ![1354564.html_type_1_webview_1][] *本节内容参考《你必须知道的.NET》和《C\#高级编程(第四版)》* **一、了解委托** 我们知道回调函数实际上就是方法调用的指针,也就是通常所说的函数指针。那么在.NET中,以委托的方式来实现了函数指针的概念。.NET中使用委托的主要原因是它是类型安全的,为什么呢?因为在以前,比如C中,函数指针只不过是一个指向存储单元的指针,我们无法说出这个指针实际指向什么,而委托确定了指向方法的返回值类型和参数列表。注意的是:委托并不等同于方法,而是一个引用类型。 **一、委托的定义** ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] 委托的定义 //第1步:声明一个委托 public delegate void CalculateDelegate(int x, int y); //第2步:创建与委托关联的方法,二者具有相同的返回值类型和参数列表 public void Add(int i, int j) \{ MessageBox.Show((i\+j).ToString()); \} //第3步:定义委托类型变量 private CalculateDelegate myDelegate; public void GetDelegateEx() \{ //第4步:进行委托绑定 myDelegate = new CalculateDelegate(Add); //第5步:回调Add方法 myDelegate(1, 2); \} ** 三、多播委托** 在多播委托中需要注意两点: (1)+=和-=操作,其实它们分别调用了Delegate.Combine和Delegate.Remove方法 (2)多播委托的返回值一般为Void,如果委托类型为非Void类型,那么多播委托将返回最后一个调用的方法的执行结果,实际中不推荐这样应用。 ** 四、委托的本质** 前面我们提到过委托是一个引用类型,其本质上它是一个类,把上边的代码编译为IL: ![CalculateDelegate_E7_9A_84IL_E5_88_86_E6_9E_90.JPG][] 从上图中我们可以看出: (1)委托CalculateDelegate是一个类,它继承自System.MulticastDelegate (2)CalculateDelegate的构造函数:在创建一个委托类型实例时,将会为其初始化一个指向对象的引用(这里指向DelegateEx对象)和一个标识回调方法的整数,由编译器完成。 (3)真正执行调用的是Invoke方法。 **五、委托和事件** 从前面的示例代码中可以看出,在客户端我们可以随意对委托进行操作,这在一定程度上破坏了面向对象的封装机制。.NET的事件模型建立在委托机制之上,它实现了对委托的封装。 事件发送器:可以是应用程序中的一个对象或程序集等,主要作用是引发事件。 事件接收器:发生某些事情时被通知的任何应用程序、对象或组件。 发送器怎么通知接收器呢?我们在事件接收器的某个地方定义一个方法,它负责处理事件, 在每次发生已注册的事件时,就执行这个事件处理程序。由于发送器对接收器一无所知,这时就要使用委托作为中介。发送器定义接收器要使用的委托,接收器将事件处理程序注册到事件中。 先了解一下这段代码:btnSave.Click += new EventHandler(btnSave\_Click)。我们在程序设计中经常见到,它告诉我们:在引发btnSave按钮的Click事件时,应执行btnSave\_Click方法。EventHandler是事件用于把处理程序(btnSave\_Click)赋予事件(Click )的委托。 ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] Code //定义一个内部事件参数类型,用于存放当事件引发时向处理程序传递的状态信息。 public class CalculateEventArgs : EventArgs \{ public readonly int x, y; public CalculateEventArgs(int x,int y) \{ this.x = x; this.y = y; \} \} //声明事件委托。 public delegate void CalculateEventHandler(object sender, CalculateEventArgs e); public class Calculator \{ //定义事件成员,提供外部绑定。 public event CalculateEventHandler MyCalculate; //定义负责通知事件引发的方法,也就是委托的Invoke方法调用。 protected virtual void OnCalculate(CalculateEventArgs e) \{ if (MyCalculate != null) \{ MyCalculate(this, e); \} \} //调用该方法就表示有新的事件方法。 public void Calculate(int x, int y) \{ CalculateEventArgs e = new CalculateEventArgs(x, y); //通知所有的事件的注册者 OnCalculate(e); \} \} ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] 上面定义了一个完整的事件程序,现在只需定义个事件触发程序。 public class CalculaterManager \{ public void Add(object sender, CalculateEventArgs e) \{ MessageBox.Show((e.x \+ e.y).ToString()); \} \} static void Main() \{ Calculator calculator = new Calculator(); CalculaterManager manager = new CalculaterManager(); calculator.MyCalculate \+= manager.Add; calculator.Calculate(1, 2); \} 转载于:https://www.cnblogs.com/toconnection/archive/2012/07/05/2578345.html [C]: http://www.cnblogs.com/muchunbo/archive/2008/12/14/1354564.html [chunbo]: http://www.cnblogs.com/muchunbo/ [Link 1]: http://www.cnblogs.com/muchunbo/admin/EditPosts.aspx?postid=1354564 [1354564.html_type_1_webview_1]: /images/20211129/da882b06c1c24945b7dbc5eef76d129c.png [ContractedBlock.gif]: https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif [ExpandedBlockStart.gif]: /images/20211129/ce53af87ed0745f5a5e4b85b8cddc482.png [CalculateDelegate_E7_9A_84IL_E5_88_86_E6_9E_90.JPG]: /images/20211129/87056691eb4e4f2d9cc992e4f49d14a0.png
相关 C#委托 一、什么是委托 委托是一种类型,就跟int,double,struct,string,class一样。它定义了一个函数的类型。现在,我们有一个方法,我们希望它的参数是某个 川长思鸟来/ 2024年02月17日 22:49/ 0 赞/ 64 阅读
相关 C#——委托 C\——委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托 冷不防/ 2023年01月03日 04:22/ 0 赞/ 240 阅读
相关 C#委托 委托: 委托定义了方法的类型,使得方法可以作为另一个方法的参数来进行传递,这样可以在程序中避免使用大量的判断语句,同时使程序具有更好的扩展性。 可以将多个方法绑定到同一个委 矫情吗;*/ 2022年09月17日 07:28/ 0 赞/ 197 阅读
相关 c#委托 首先创建个控制台应用程序在Program下创建一个无参数无返回值的静态方法,可以输出一句话 static void Text() { Cons 迈不过友情╰/ 2022年04月16日 06:15/ 0 赞/ 258 阅读
相关 C# 委托 一、什么是委托? 初次理解这么抽象的概念确实有点挺难的,如果学过C语言,可能知道C语言里可以把一个方法当做参数来传递,委托大概类似也是这样一个原理。 想象一下,在一个 ゞ 浴缸里的玫瑰/ 2022年04月08日 12:15/ 0 赞/ 282 阅读
相关 C# 委托 什么是委托? 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引 野性酷女/ 2022年02月16日 13:51/ 0 赞/ 281 阅读
相关 [转]C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C\时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人 短命女/ 2021年12月23日 06:11/ 0 赞/ 308 阅读
相关 C# 委托,转自别人 [C\中的委托是什么?事件是不是一种委托?][C] Posted on 2008-12-14 08:47 [chunbo][] 阅读(3511) 评论( 0) [编辑][ 短命女/ 2021年11月30日 00:10/ 0 赞/ 258 阅读
相关 C# 委托 委托 作用:将多个参数相同的方法,进行委托统一调用,将参数和调用方法传递给委托,由委托调用。 好处:可以将多个方法内相同的部分提取出来,根据参数和方法参数,调用需要的 ゝ一世哀愁。/ 2021年10月14日 02:00/ 0 赞/ 384 阅读
相关 C# 委托 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的是一个或多个方法的地址,而不是数据。委 谁践踏了优雅/ 2021年06月24日 16:10/ 0 赞/ 500 阅读
还没有评论,来说两句吧...