背景
一个朋友问了一个问题:“为什么不能在子类或外部发布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#本质之类的书了,很多概念我也不是很清楚!