zoukankan      html  css  js  c++  java
  • .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#本质之类的书了,很多概念我也不是很清楚!

  • 相关阅读:
    五种IO模型透彻分析
    linux正则表达式
    洛谷P1242 新汉诺塔 【神奇的递归】
    【NOIP2012】疫情控制
    [ZJOI2007]棋盘制作 【最大同色矩形】
    [NOIP2008]双栈排序 【二分图 + 模拟】
    LCA的倍增算法
    最大权闭合子图
    小Z的袜子 题解报告【莫队】
    ZJOI2012网络 题解报告【LCT】
  • 原文地址:https://www.cnblogs.com/happyframework/p/3199614.html
Copyright © 2011-2022 走看看