不能在子类或外部类发布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# Email发送邮件 对方打开邮件可获得提醒

    C# Email发送邮件 对方打开邮件可获得提醒

    这篇文章主要为大家详细介绍了C# Email发送邮件功能,对方打开通知你,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C#中异步是4种实现方式详解

    C#中异步是4种实现方式详解

    这篇文章主要为大家详细介绍了C#中异步实现方式的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • c#数据类型基础

    c#数据类型基础

    C#里面的数据类型分为两种:值类型和引用类型。
    2008-08-08
  • C#对WPF数据绑定的菜单插入Seperator分隔

    C#对WPF数据绑定的菜单插入Seperator分隔

    这篇文章介绍了C#对WPF数据绑定的菜单插入Seperator分隔的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#调用Windows的API实现窗体动画

    C#调用Windows的API实现窗体动画

    在VF、VB、PB的应用中,有些无法通过语言工具本身来完成的或者做得不理想的功能,我们会考虑通过Windows的API来完成。本文就来通过调用Windows的API实现窗体动画,感兴趣的可以尝试一下
    2022-11-11
  • c#读取excel方法实例分析

    c#读取excel方法实例分析

    这篇文章主要介绍了c#读取excel方法,实例分析了C#读取excel文件的原理与相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#把数字转换成大写金额的代码实例

    C#把数字转换成大写金额的代码实例

    这篇文章主要介绍了C#把数字转换成大写金额的代码实例,例如把200转换成“贰佰元”,需要的朋友可以参考下
    2014-05-05
  • c#菜单动态合并的实现方法

    c#菜单动态合并的实现方法

    这篇文章主要介绍了c#菜单动态合并的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • C#条码生成类分享

    C#条码生成类分享

    这篇文章主要分享了C#条码生成类的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#非矩形窗体实现方法

    C#非矩形窗体实现方法

    这篇文章主要介绍了C#非矩形窗体实现方法,涉及C#窗体操作的相关技巧,需要的朋友可以参考下
    2015-06-06

最新评论