C#的Delegate和Event
参考:
C# 中的委托和事件
C# 中的委托和事件(续)
我的总结如下:
1)实例:
namespace Test
{
public delegate void ProcessEventHandler(string name);
public class MyTest
{
public event ProcessEventHandler myProcessEvent;
}
}
{
public delegate void ProcessEventHandler(string name);
public class MyTest
{
public event ProcessEventHandler myProcessEvent;
}
}
2) IL代码:
.namespace Test
{
.class public auto ansi beforefieldinit MyTest
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
}
.field private class Test.ProcessEventHandler myProcessEvent
.event Test.ProcessEventHandler myProcessEvent
{
.addon instance void Test.MyTest::add_myProcessEvent(class Test.ProcessEventHandler)
.removeon instance void Test.MyTest::remove_myProcessEvent(class Test.ProcessEventHandler)
}
}
.class public auto ansi sealed ProcessEventHandler
extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
{
}
.method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(string name,
class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed
{
}
.method public hidebysig newslot virtual instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
{
}
.method public hidebysig newslot virtual instance void Invoke(string name) runtime managed
{
}
}
}
{
.class public auto ansi beforefieldinit MyTest
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
}
.field private class Test.ProcessEventHandler myProcessEvent
.event Test.ProcessEventHandler myProcessEvent
{
.addon instance void Test.MyTest::add_myProcessEvent(class Test.ProcessEventHandler)
.removeon instance void Test.MyTest::remove_myProcessEvent(class Test.ProcessEventHandler)
}
}
.class public auto ansi sealed ProcessEventHandler
extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
{
}
.method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(string name,
class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed
{
}
.method public hidebysig newslot virtual instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
{
}
.method public hidebysig newslot virtual instance void Invoke(string name) runtime managed
{
}
}
}
3)总结:
委托关键字delegate定义了一种类型;
事件关键字event的定义其实包含两部分,第一定义一个私有的委托的实例,使得外部用户不能直接访问此委托(不管此事件是public或private,此委托总是private),第二通过在IL层增加add和remove方法来对外公开委托的+=和-=从而使外部的用户对此委托赋值或取消赋值;
完!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步