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方法来对外公开委托的+=和-=从而使外部的用户对此委托赋值或取消赋值;
完!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理