背景
一個朋友問了一個問題:“為什麼不能在子類或外部發布C#事件?”,我說我不知道,要看看生產的IL代碼,下面我們看看。
測試代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EventStudy { class Program { static void Main(string[] args) { } } class Base { private Action _testEventB; public event Action TestEventA; public event Action TestEventB { add { _testEventB += value; } remove { _testEventB -= value; } } protected void OnTestEventA() { var testEventA = this.TestEventA; testEventA(); } protected void OnTestEventB() { var testEventB = _testEventB; testEventB(); } } class Child : Base { public void Do() { //this.TestEventA();不能這樣訪問 } } }
IL
分析
1、TestEventA和TestEventB最終生成的代碼結構基本一樣,可以知道C#編譯器幫我們做了一些工作。
2、其實C#編譯器應該可以做到允許我們直接調用的,比如:生成的字段為protected類型,考慮到封裝性,編譯器沒這麼做,我覺得是合理的。
一則笑話
一位老先生問我如何拷貝文件,我說Control+C,然後Control+V,第二天他告訴我不行,後來發現他是在公司Control+C,回到家裡Control+V的。
今天發生了真人版的這個事情,一位非常有前途的兄弟,在一個基類裡定義了一個Event,有兩個子類,分別為A和B,在A的實例裡發布Event,在B的實例裡監聽這個Event。
一個問題
為什麼一定要這麼發布事件(引入一個局部變量):
protected void OnTestEventA() { var testEventA = this.TestEventA; testEventA(); }
背景
找個機會得看看一些C#本質之類的書了,很多概念我也不是很清楚!