参考:
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方法来对外公开委托的+=和-=从而使外部的用户对此委托赋值或取消赋值;
完!