繁体   English   中英

C#事件继承

[英]C# event inheritance

我有这个程序:

    class One
    {
        public delegate void del(object o);
        public event del SomethingChanged;

        int x;
        public int X
        {
            get { return x; }
            set { x = value; OnSomethingChanged(this); }
        }

        protected void OnSomethingChanged(object o)
        {
            if (SomethingChanged != null)
                SomethingChanged(o);
        }
    }

    class Two: One
    {
        public void ChangeSomething()
        {
            //if (SomethingChanged != null)
            //    SomethingChanged(this);
            OnSomethingChanged(this);
        }
    }

    static void Main(string[] args)
    {
        One one = new One();
        Console.WriteLine(one.X);
        one.SomethingChanged += new One.del(one_SomethingChanged);
        one.X = 5;
    }

    static void one_SomethingChanged(object o)
    {
        Console.WriteLine(((One)o).X);
    }

有两个类 - 一个和两个,两个是一个的后代。 在第一类(SomethingChanged)中声明了事件,它由第一类和第二类触发。 但是看看Two.ChangeSomething - 它通过调用基类的方法来引发事件。 但是,如果我尝试使用原始代码调用事件

if (SomethingChanged != null)
    SomethingChanged(this);

我收到编译错误说

The event 'One.SomethingChanged' can only appear on the left hand side of += or -= (except when used from within the type 'eventstest.Program.One')

所以我只是好奇为什么我不能在第二类中使用'原始'代码来引发事件但是当我调用相应的函数时会引发事件?

[编辑]在这里找到一些澄清: C#:提升一个继承的事件

当您在C#中使用“event”关键字声明事件时,生成的IL实际上包含两个相应的元素:私有委托字段和与声明的事件具有相同可见性的事件访问器。 事件访问器不能用于触发事件。 它仅用于订阅和取消订阅通知。 您的SomethingChanged(this)代码使用私有字段来调用委托,并且该私有字段在类外部不可用。

代码

if (SomethingChanged != null)
    SomethingChanged(this);

(顺便说一句,它具有竞争条件)意味着在SomethingChanged上调用Delegate.GetInvocationList 除非您在定义事件的类中,否则自动实现的事件不允许您这样做。

如果手动实现事件并提供对支持事件的委托字段的protected访问,则可以执行此操作。

使用:

this.SomethingChanged += new One.del(one_SomethingChanged);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM