不能在子类或外部类发布C#事件代码分析

 更新时间:2013年11月25日 10:25:34   作者:  
一个朋友问了一个问题:“为什么不能在子类或外部发布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();不能这样访问
        }
    }
}



分析

1、TestEventA和TestEventB最终生成的代码结构基本一样,可以知道C#编译器帮我们做了一些工作。
2、其实C#编译器应该可以做到允许我们直接调用的,比如:生成的字段为protected类型,考虑到封装性,编译器没这么做,我觉得是合理的。

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

复制代码 代码如下:

protected void OnTestEventA()
        {
            var testEventA = this.TestEventA;

            testEventA();
        }


相关文章

  • C#透明窗体实现方法

    C#透明窗体实现方法

    这篇文章主要介绍了C#透明窗体实现方法,涉及C#窗体操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#预处理指令之#line,#pragma warning 详细解析

    C#预处理指令之#line,#pragma warning 详细解析

    #line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号
    2014-01-01
  • C#如何给word文档添加水印

    C#如何给word文档添加水印

    这篇文章主要为大家详细介绍了C#如何给word文档添加水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • C# Process调用外部程序的实现

    C# Process调用外部程序的实现

    这篇文章主要介绍了C# Process调用外部程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C#读写文本文件(.txt)的方法实例

    C#读写文本文件(.txt)的方法实例

    读写文本文件其实是件很简单的事情,这篇文章主要给大家介绍了关于C#读写文本文件(.txt)的相关资料,需要的朋友可以参考下
    2021-05-05
  • 浅谈c#中const与readonly区别

    浅谈c#中const与readonly区别

    C#引入了readonly修饰符来表示只读域,const来表示不变常量。顾名思义对只读域不能进行写操作,不变常量不能被修改,这两者到底有什么区别呢?
    2015-06-06
  • C# 关于LoadLibrary的疑问详解

    C# 关于LoadLibrary的疑问详解

    这篇文章主要介绍了C# 关于LoadLibrary的疑问详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#实现判断一个时间点是否位于给定时间区间的方法

    C#实现判断一个时间点是否位于给定时间区间的方法

    这篇文章主要介绍了C#实现判断一个时间点是否位于给定时间区间的方法,涉及C#针对时间的转换与判定相关技巧,需要的朋友可以参考下
    2015-08-08
  • c#利用webmail邮件系统发送邮件示例分享

    c#利用webmail邮件系统发送邮件示例分享

    在C#中发送邮件的方式有2种,一种是使用webmail方式进行发送,另外一种就是采用netmail发送的方式,这篇文章介绍了c#使用webmail方式发送邮件示例,大家参考使用吧
    2014-01-01
  • 解决winform界面刷新闪烁问题的多种方案

    解决winform界面刷新闪烁问题的多种方案

    这篇文章给大家介绍了如何解决winform界面刷新闪烁问题的多种方案,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02

最新评论