zoukankan      html  css  js  c++  java
  • C#的Delegate和Event


    参考:

    C# 中的委托和事件

    C# 中的委托和事件(续)

    我的总结如下: 

    1)实例:

    namespace Test
    {
        
    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
            {
            }
        }
    }



    3)总结:

    委托关键字delegate定义了一种类型;

    事件关键字event的定义其实包含两部分,第一定义一个私有的委托的实例,使得外部用户不能直接访问此委托(不管此事件是public或private,此委托总是private),第二通过在IL层增加add和remove方法来对外公开委托的+=和-=从而使外部的用户对此委托赋值或取消赋值;

    完!


    作者:iTech
    微信公众号: cicdops
    出处:http://itech.cnblogs.com/
    github:https://github.com/cicdops/cicdops

  • 相关阅读:
    图像边界扩展
    数据增强之图像旋转及坐标对应(附代码)
    Opencv中的阈值函数
    linux下C++遍历文件夹下的全部文件;Windows/Linux下C++批量修改文件名,批量删除文件
    提取内环图像
    linux中tab键不能补全,却能切换窗口
    Mathtype部分数学符号不能显示,只能显示方框时的解决办法
    Qt运行不出现界面
    直方图处理
    DTCMS自定义标签:面包屑导航,栏目中通过栏目调用名称获得栏目名称
  • 原文地址:https://www.cnblogs.com/itech/p/1773911.html
Copyright © 2011-2022 走看看