C#中的委托是啥?事件是否一种委托?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中的委托是啥?事件是否一种委托?相关的知识,希望对你有一定的参考价值。

C#中的委托是什么?事件是不是一种委托?

委托是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。
通俗的说,委托是这样一种类型:这种类型的实例,指向其它类型的方法。
委托主要就是提供间接调用、构建双向系统用的,他为消息模型和多线编程提供了基础。

再说说事件,事件并不是一种类型,它是一个方法,它是为了简化委托的注册而出现的。并不是1楼所说的那样:事件是一种委托,这是严重的误导!
参考技术A 你好,可以这样理解:

委托就好比你委托某人帮你做某件事情,只不过这个是委托给方法罢了,事件是一种特殊的委托...

或:

委托是一种安全的类似与函数指针,但是她比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。
参考技术B 委托 可以看成一种表示函数的数据类型.类似函数指针.
事件是特殊的委托
参考技术C 本节内容参考《你必须知道的.NET》和《C#高级编程(第四版)》
一、了解委托
我们知道回调函数实际上就是方法调用的指针,也就是通常所说的函数指针。那么在.NET中,以委托的方式来实现了函数指针的概念。.NET中使用委托的主要原因是它是类型安全的,为什么呢?因为在以前,比如C中,函数指针只不过是一个指向存储单元的指针,我们无法说出这个指针实际指向什么,而委托确定了指向方法的返回值类型和参数列表。注意的是:委托并不等同于方法,而是一个引用类型。
一、委托的定义委托的定义
三、多播委托
在多播委托中需要注意两点:
(1)+=和-=操作,其实它们分别调用了Delegate.Combine和Delegate.Remove方法
(2)多播委托的返回值一般为Void,如果委托类型为非Void类型,那么多播委托将返回最后一个调用的方法的执行结果,实际中不推荐这样应用。
四、委托的本质
前面我们提到过委托是一个引用类型,其本质上它是一个类,把上边的代码编译为IL:
从上图中我们可以看出:
(1)委托CalculateDelegate是一个类,它继承自System.MulticastDelegate
(2)CalculateDelegate的构造函数:在创建一个委托类型实例时,将会为其初始化一个指向对象的引用(这里指向DelegateEx对象)和一个标识回调方法的整数,由编译器完成。
(3)真正执行调用的是Invoke方法。
五、委托和事件
从前面的示例代码中可以看出,在客户端我们可以随意对委托进行操作,这在一定程度上破坏了面向对象的封装机制。.NET的事件模型建立在委托机制之上,它实现了对委托的封装。
事件发送器:可以是应用程序中的一个对象或程序集等,主要作用是引发事件。
事件接收器:发生某些事情时被通知的任何应用程序、对象或组件。
发送器怎么通知接收器呢?我们在事件接收器的某个地方定义一个方法,它负责处理事件,
在每次发生已注册的事件时,就执行这个事件处理程序。由于发送器对接收器一无所知,这时就要使用委托作为中介。发送器定义接收器要使用的委托,接收器将事件处理程序注册到事件中。
先了解一下这段代码:btnSave.Click
+=
new
EventHandler(btnSave_Click)。我们在程序设计中经常见到,它告诉我们:在引发btnSave按钮的Click事件时,应执行btnSave_Click方法。EventHandler是事件用于把处理程序(btnSave_Click)赋予事件(Click
)的委托。Code
上面定义了一个完整的事件程序,现在只需定义个事件触发程序。
参考技术D 在C#中(严格的说是在.NET中),委托确定了指向方法的返回值类型和参数列表。委托并不等同于方法,而是一个引用类型,也就是一个类。
事件,.NET的事件模型建立在委托机制之上,它实现了对委托的封装。

以上是关于C#中的委托是啥?事件是否一种委托?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的委托是啥?事件是否一种委托?

c#中委托的作用是啥?

C#事件是否委托

C# 中的委托和事件

C#中的委托(转)

C# 中的委托和事件