委托

在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#]简单的理解委托和事件相关推荐

  1. 【详细】【转】C#中理解委托和事件 事件的本质其实就是委托 RabbitMQ英汉互翼(一),RabbitMQ, RabbitMQ教程, RabbitMQ入门...

    [详细][转]C#中理解委托和事件 文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C ...

  2. C#委托的定义 以及使用方式详解,更简单的理解委托。

    委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得 ...

  3. [C#]委托和事件(讲解的非常不错)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  4. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  5. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  6. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  7. [C#]委托和事件(详细讲解)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  8. 详细讲解 委托和事件

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  9. C#编程之委托与事件(一)

    多线程程序设计是一个庞大的主题,而本文试图在.net Framework环境下,使用C#语言来描述委托.事件.多线程程序及反射的概貌.希望本文能有助于大家理解委托.事件.多线程及反射的概念,理解委托. ...

最新文章

  1. Android EventBus使用与思路总结
  2. Apache服务器错误问题Internal Server Error
  3. 记Redis那坑人的HGETALL
  4. 扑克牌比大小c语言,算了算学了有一个月c语言了,写了个扑克牌程序
  5. VisualStudio C++内存泄漏的检测方法(二)
  6. 云效83行代码重构大师赛-码力全开,重启方舟
  7. aspnetcore 应用 接入Keycloak快速上手指南
  8. java学习(64):类访问私有内部内部类方法
  9. Android——Android Studio导入SlidingMenu类库的方法
  10. JetBrains正式发布GoLand
  11. Mysql指定编码导入导出数据
  12. Quectel BC95-CNV 多频段、高性能、低功耗 LTE Cat NB2无线通信模块[移远通信]
  13. (83)--用代码实现超越函数
  14. 与MySQL的纠缠(卸载与安装)
  15. 房屋安全鉴定报告的有效期及两种鉴定类型
  16. jsp:forward标签介绍
  17. jquery鼠标移入文字提示_Jquery hover鼠标经过时弹出div动态提示语
  18. 突发!微软亚研CV大牛王井东离职,或将加入百度
  19. 【论文翻译_无数据知识蒸馏_元学习_2022】Up to 100× Faster Data-free Knowledge Distillation
  20. 10 Minutes to pandas----十分钟搞定Pandas

热门文章

  1. python xy不在第一维度_ValueError:x和y必须具有相同的第一个维度ipython 3.5
  2. 4g模块注册上网 移远_物联网模组龙头移远通信
  3. imagenet classification with deep convolutional neural networks
  4. 画虚线_夏天穿马丁靴?热死你!她仅在脚上画五条“虚线”,显高7cm
  5. redis客户端mac_推荐一款神仙颜值的Redis客户端工具
  6. matlab中emd函数,EMD算法的matlab程序介绍解析
  7. 百度深度学习图像识别决赛代码分享(OCR)
  8. signature=e5535ff98b93aa63c455611822dc57c2,高校新生预激综合征6例报告
  9. 经纬度坐标转换成px_经纬度坐标转像素坐标
  10. php yaf框架 校验登录,yaf框架是get或post请求的判断