C# 事件和委托的关系,我这么说对不对
答案:1 悬赏:0 手机版
解决时间 2021-02-25 00:34
- 提问者网友:山高云阔
- 2021-02-24 10:23
C# 事件和委托的关系,我这么说对不对
最佳答案
- 五星知识达人网友:蕴藏春秋
- 2021-02-24 10:43
似乎不对,当讨论事件与委托的关系,需要从两个方面展开,分别是用户角度和.NET内部底层。
1)用户角度:事件(event)是一个发布者,它起到的作用是通知事件订阅者要进行事件处理。但是事件发布者并不知道它的事件订阅者都有谁?此时,就需要一个中间人,而这个中间人正是委托(delegate)。所以当事件触发时就形成了一种委托机制:
事件发布者==》委托通知==》事件订阅者处理
2).NET内部底层:当用event关键字声明一个事件类型时,编译器在编译时会自动插入两个特殊的方法add_字段名和remove_字段名分别表示向委托链添加方法和移除方法。
个人看法,仅供参考。追问对于第一条
为什么不让这个委托人(对象)亲自发布事件?这样它就不需要委托别人,直接告诉它的订阅者。
因为delegate也是有+=,-=这样的操作的,所以我觉得它也是可以有"订阅者"的
C#的事件机制是否是仅仅为了符合人的思维模式?把事件的发布者和订阅者通过委托这种形式划分的更加鲜明?追答微软只所以这样设计,主要考虑到线程安全的,可以避免线程竞争问题,如果你直接使用delegate那么在多线程的模式下将处于不安全的状态。假设,有两个线程T1,T2,当T1线程对某方法从委托链中移除时,此时T2执行了该方法,你说会发生情况?追问nice
1)用户角度:事件(event)是一个发布者,它起到的作用是通知事件订阅者要进行事件处理。但是事件发布者并不知道它的事件订阅者都有谁?此时,就需要一个中间人,而这个中间人正是委托(delegate)。所以当事件触发时就形成了一种委托机制:
事件发布者==》委托通知==》事件订阅者处理
2).NET内部底层:当用event关键字声明一个事件类型时,编译器在编译时会自动插入两个特殊的方法add_字段名和remove_字段名分别表示向委托链添加方法和移除方法。
个人看法,仅供参考。追问对于第一条
为什么不让这个委托人(对象)亲自发布事件?这样它就不需要委托别人,直接告诉它的订阅者。
因为delegate也是有+=,-=这样的操作的,所以我觉得它也是可以有"订阅者"的
C#的事件机制是否是仅仅为了符合人的思维模式?把事件的发布者和订阅者通过委托这种形式划分的更加鲜明?追答微软只所以这样设计,主要考虑到线程安全的,可以避免线程竞争问题,如果你直接使用delegate那么在多线程的模式下将处于不安全的状态。假设,有两个线程T1,T2,当T1线程对某方法从委托链中移除时,此时T2执行了该方法,你说会发生情况?追问nice
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯