博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET:为什么不能在子类或外部发布C#事件
阅读量:6003 次
发布时间:2019-06-20

本文共 1631 字,大约阅读时间需要 5 分钟。

背景

一个朋友问了一个问题:“为什么不能在子类或外部发布C#事件?”,我说我不知道,要看看生产的IL代码,下面我们看看。

测试

代码

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace EventStudy 8 { 9     class Program10     {11         static void Main(string[] args)12         {13         }14     }15 16     class Base17     {18         private Action _testEventB;19 20         public event Action TestEventA;21 22         public event Action TestEventB23         {24             add25             {26                 _testEventB += value;27             }28             remove29             {30                 _testEventB -= value;31             }32         }33 34         protected void OnTestEventA()35         {36             var testEventA = this.TestEventA;37 38             testEventA();39         }40 41         protected void OnTestEventB()42         {43             var testEventB = _testEventB;44 45             testEventB();46         }47     }48 49     class Child : Base50     {51         public void Do()52         {53             //this.TestEventA();不能这样访问54         }55     }56 }

IL

分析

1、TestEventA和TestEventB最终生成的代码结构基本一样,可以知道C#编译器帮我们做了一些工作。

2、其实C#编译器应该可以做到允许我们直接调用的,比如:生成的字段为protected类型,考虑到封装性,编译器没这么做,我觉得是合理的。

一则笑话

一位老先生问我如何拷贝文件,我说Control+C,然后Control+V,第二天他告诉我不行,后来发现他是在公司Control+C,回到家里Control+V的。

今天发生了真人版的这个事情,一位非常有前途的兄弟,在一个基类里定义了一个Event,有两个子类,分别为A和B,在A的实例里发布Event,在B的实例里监听这个Event。

一个问题

为什么一定要这么发布事件(引入一个局部变量):

1         protected void OnTestEventA()2         {3             var testEventA = this.TestEventA;4 5             testEventA();6         }

背景

找个机会得看看一些C#本质之类的书了,很多概念我也不是很清楚!

 

转载地址:http://ribmx.baihongyu.com/

你可能感兴趣的文章
lvreduce -L 1000M /dev/vg0/lv0 表示最后缩减至多大,不是减少了多大
查看>>
ES 自动恢复分片的时候不恢复了是磁盘超过了85%,然后不恢复了 ES可以配置多个数据目录...
查看>>
linux查杀病毒的几个思路
查看>>
宽带速度
查看>>
构建之法阅读笔记5
查看>>
Android判断网络连接状态
查看>>
js常用的函数库
查看>>
Sqlserver 数据库安全
查看>>
netstat命令简单使用
查看>>
Python标示符命名规则
查看>>
SSL certificate problem unable to get local issuer certificate解决办法
查看>>
20145209 刘一阳 《网络对抗》实验四:恶意代码分析
查看>>
个人学期总结
查看>>
CodeForces 985E Pencils and Boxes
查看>>
为什么Elasticsearch查询变得这么慢了?
查看>>
node.js中使用http模块创建服务器和客户端
查看>>
Away3D基础教程(六):支持双面交互的PlaneGeometry
查看>>
(十五)Centos之安装jdk
查看>>
RISC-V: custom instruction and its simulation(转)
查看>>
HDU 5366 The mook jong
查看>>