.NET:為什么不能在子類或外部發布C#事件


背景

一個朋友問了一個問題:“為什么不能在子類或外部發布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 Program
10     {
11         static void Main(string[] args)
12         {
13         }
14     }
15 
16     class Base
17     {
18         private Action _testEventB;
19 
20         public event Action TestEventA;
21 
22         public event Action TestEventB
23         {
24             add
25             {
26                 _testEventB += value;
27             }
28             remove
29             {
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 : Base
50     {
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#本質之類的書了,很多概念我也不是很清楚!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM