美文网首页恰同学少年
C# 委托与事件的区别

C# 委托与事件的区别

作者: LH_晴 | 来源:发表于2018-04-04 17:44 被阅读11次

Delegate

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名 (signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。

首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。

其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if-else和switch语句,同时使得程序具有更好的可扩展性。

事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托。你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发。也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发。除此之此,事件拥有委托的所有功能,包括多播特性。

委托是类型,事件是对象 ,事件是封装过的委托实例。也就是说,事件是面向对象的产物,它是封装性比较典型的示例。在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面:

一、对于事件来讲,只能在本类型内部“触发”,外部只能“注册自己+=、注销自己-=“,委托不管在本类型内部还是外部都可以“调用”,因此如果用delegate就没法进行上面的控制,所以诞生了事件这种语法。

二、在类的外部,事件只能add、remove自己,不能赋值,即事件只能“+=”、“-=”,不能“=”,这样在一定程度上保证了event系统在一个事件触发后注册过的方法都会得到通知,而不会被一个错误的赋值把别的已经注册的方法都覆盖掉。

相关文章

  • C# 委托与事件的区别

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,...

  • C#——委托与事件系列一

    本来应该学习泛型与委托的,但是发现C#这里还没有系统的记录过委托与事件,所以先打算把委托与事件补上再继续泛型与委托...

  • 委托,Lambda,事件

    委托 声明委托 Lambda 事件与委托的区别 事件不能再类的外部调用,可以在外部注册 委托可以在类的外部调用,可...

  • C# 事件和委托的区别

    事件是基于委托的,为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托,他的调用和委托是一样的。 事件的声明...

  • C# 基础知识系列- 11 委托和事件

    0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一...

  • 教小明学一点点编程—C#篇(0)

    像小明这样使用C#的新同学,一定都会被C#的复杂的委托事件机制所困惑,那么我们不如解释一下什么是C#中委托。 委托...

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • Unity3d-c#-观察者设计模式-猫抓老鼠

    在这个例子中运用了委托事件机制讲述了事件和委托的区别最大的区别是:事件是特殊的受限的委托,事件只能在类内部调用,不...

  • (转).NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位。 C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括...

  • unity & C#相关

    事件和委托 C#事件和Unity3d - CSDN博客 Unity常用的函数和遇到的C#的知识整理 Unity常用...

网友评论

    本文标题:C# 委托与事件的区别

    本文链接:https://www.haomeiwen.com/subject/gqhlhftx.html