[C#]简单的理解委托和事件
委托
在C++中可以利用“函数指针”将对方法的引用作为实参传递给另一个方法,而C#中可以利用委托提供相同的功能。
委托-内部机制
但是委托实际上是一个特殊的类。委托必须直接或间接的派生自System.Delegate。实际的委托类型总是派生自System.MulticastDelegate(创建委托的时候,编译器自动继承的是MulticastDelegate而不是Delegate),后者又从Delegate派生。
委托内部包含了几个重要的属性:第一个就是System.Reflection.MethodInfo类型的,它描述了特定方法的签名,包括方法名称、参数和返回类型。除了MethodInfo,委托还需要一个对象实例,其中包含了要调用的方法,这是第二个属性Target的作用。(如果是静态方法,则Target对应类型自身)。
Func和Action
为了减少自定义委托类型的必要,.NET 3.5包含了一组通用的委托,其中大多数都是泛型。System.Func系列委托代表有返回值的方法,而System.Action表示返回void的方法。
Public delegate void Action();Public delegate void Action<in T>(T arg)Public delegate void Action<in T1,in T2>(in T1 arg1,in T2 arg2)Public delegate void Action<in T1,in T2,in T3>(in T1 arg1,in T2 arg2,in T3 arg3)…….Public delegate void Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16>(T1 arg1,T2 arg2,T3 arg3,T4 arg4,T5 arg5,T6 arg6,T7 arg7,T8 arg8,T9 arg9,T10 arg10, T11 arg11,T12 arg12, T13 arg13, T14 arg14,T15 arg15, T16 arg16)Public delegate Tresult Func<out TResult>();Public delegate Tresult Func<in T,out TResult>(T arg);Public delegate Tresult Func<in T1,in T2,out TResult>(T1 arg1,T2 arg2);……Public delegate Tresult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,out TResult>(T1 arg1,T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6,T7 arg7,T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15,T16 arg16)
事件
说到事件,得知道委托的几个缺陷:
1、在使用+=赋值操作符时使用了=,会导致一个全新的委托链代替了前面链,这是一个十分容易犯的错误,所以event提供了额外的封装,避免不小心取消了其他订阅者。
2、可以在委托包容类的外部调用委托,这是由于委托的封装不充分。
3、普通委托还有一个不利之处在于,很容易忘记在调用委托之前检查null值(在C#6中使用 ?. null条件操作符),这会引发一个异常。
而事件就可以很简单的理解了,就是对委托的进一步封装,解决了委托存在的一些缺陷。
事件-内部机制
事件限制外部类只能通过+=操作符向发布者添加订阅方法,并用-=操作符取消订阅,除此之外什么都不能做。此外,还禁止除包容类之外的任何其他类调用事件。为了达到上述目的,C#编译器会获取带有event修饰符的public委托变量,并将委托声明为private。此外,它还会添加两个方法和两个特殊的事件块,这里就不展开了。
转载于:https://www.cnblogs.com/lizhenghao126/p/11053664.html
[C#]简单的理解委托和事件相关推荐
- 【详细】【转】C#中理解委托和事件 事件的本质其实就是委托 RabbitMQ英汉互翼(一),RabbitMQ, RabbitMQ教程, RabbitMQ入门...
[详细][转]C#中理解委托和事件 文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C ...
- C#委托的定义 以及使用方式详解,更简单的理解委托。
委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得 ...
- [C#]委托和事件(讲解的非常不错)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...
委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...
- C#编程利器之四:委托与事件(Delegate and event) (上)
本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...
- C# 委托(Delegate) 事件(Event)应用详解
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...
- [C#]委托和事件(详细讲解)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 详细讲解 委托和事件
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C#编程之委托与事件(一)
多线程程序设计是一个庞大的主题,而本文试图在.net Framework环境下,使用C#语言来描述委托.事件.多线程程序及反射的概貌.希望本文能有助于大家理解委托.事件.多线程及反射的概念,理解委托. ...
最新文章
- Android EventBus使用与思路总结
- Apache服务器错误问题Internal Server Error
- 记Redis那坑人的HGETALL
- 扑克牌比大小c语言,算了算学了有一个月c语言了,写了个扑克牌程序
- VisualStudio C++内存泄漏的检测方法(二)
- 云效83行代码重构大师赛-码力全开,重启方舟
- aspnetcore 应用 接入Keycloak快速上手指南
- java学习(64):类访问私有内部内部类方法
- Android——Android Studio导入SlidingMenu类库的方法
- JetBrains正式发布GoLand
- Mysql指定编码导入导出数据
- Quectel BC95-CNV 多频段、高性能、低功耗 LTE Cat NB2无线通信模块[移远通信]
- (83)--用代码实现超越函数
- 与MySQL的纠缠(卸载与安装)
- 房屋安全鉴定报告的有效期及两种鉴定类型
- jsp:forward标签介绍
- jquery鼠标移入文字提示_Jquery hover鼠标经过时弹出div动态提示语
- 突发!微软亚研CV大牛王井东离职,或将加入百度
- 【论文翻译_无数据知识蒸馏_元学习_2022】Up to 100× Faster Data-free Knowledge Distillation
- 10 Minutes to pandas----十分钟搞定Pandas
热门文章
- python xy不在第一维度_ValueError:x和y必须具有相同的第一个维度ipython 3.5
- 4g模块注册上网 移远_物联网模组龙头移远通信
- imagenet classification with deep convolutional neural networks
- 画虚线_夏天穿马丁靴?热死你!她仅在脚上画五条“虚线”,显高7cm
- redis客户端mac_推荐一款神仙颜值的Redis客户端工具
- matlab中emd函数,EMD算法的matlab程序介绍解析
- 百度深度学习图像识别决赛代码分享(OCR)
- signature=e5535ff98b93aa63c455611822dc57c2,高校新生预激综合征6例报告
- 经纬度坐标转换成px_经纬度坐标转像素坐标
- php yaf框架 校验登录,yaf框架是get或post请求的判断