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
本文就是它的截取。