C#事件的本质

2023-12-13 19:00:20

event字段本质就是对委托进行私有访问限制,事件的本质就是委托,只不过系统会对用event字段修饰的委托进行了特殊处理,比如自动生成一个私有的委托变量,添加两个事件访问器,同时禁止外部类对事件的Invoke等方法调用。

例如下面事件代码:

using System;

namespace AsyncDelegate
{
    public delegate void StateChangeHandler();
    public class EventTest
    {
        public event StateChangeHandler StatechangeEvent;
        public static void Method()
        {
            Console.WriteLine("事件触发~");
        }
        public static void Main(string[] args)
        {
            var eventTest = new EventTest();
            eventTest.StatechangeEvent += Method;
            eventTest.StatechangeEvent?.Invoke();
        }
    }
}

为了弄清event字段的作用,利用Ildasm.exe反汇编代码。

在这里插入图片描述

默认事件访问器的反汇编结果
??

发现系统自动添加了一个StateChangeHandler委托类型的私有变量StatechangeEvent,同时添加了两个方法add_StatechangeEvent、remove_StatechangeEvent.

这等同于下面的写法:

namespace AsyncDelegate
{
    public delegate void StateChangeHandler();
    public class EventTest
    {
        public event StateChangeHandler StatechangeEvent
        {
            add => _stateChangeHandler += value;
            remove => _stateChangeHandler -= value;
        }
        private StateChangeHandler _stateChangeHandler;
        public static void Method()
        {
            Console.WriteLine("事件触发~");
        }
        public static void Main(string[] args)
        {
            var eventTest = new EventTest();
            eventTest.StatechangeEvent += Method;
            eventTest._stateChangeHandler?.Invoke();
        }
    }
}

只是多了一个私有StateChangeHandler变量,以及一个事件访问器,其中add、remove方法里的value代指使用“+/-/+=/-=”委托运算符时对应的方法名。

其实,当你删除上面代码的event字段,你将会发现,代码依然可以运行。唯一区别就是现在事件可以在外部Invoke了罢了。

关于事件和委托的更多知识,可以参看我这篇文章:
🔗https://blog.csdn.net/weixin_44013533/article/details/134655722

本文就是它的截取。

文章来源:https://blog.csdn.net/weixin_44013533/article/details/134838099
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。