欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-21 21:39:52
复制代码 代码如下:using system;using system.collections.generic;using system.linq;using system...

复制代码 代码如下:

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();不能这样访问
        }
    }
}



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

分析

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

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

复制代码 代码如下:

protected void ontesteventa()
        {
            var testeventa = this.testeventa;

            testeventa();
        }