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

  • 相关阅读:
    Android报表库aChartEngine系列(pie chart)
    二分查找算法java实现
    Android报表库aChartEngine系列(介绍)
    如何自定义view
    服务器性能瓶颈分析方法
    浅析C#中new、override、virtual关键字的区别
    Team Foundation Server 实例安装过程
    asp.net2.0站点应用程序池错误的问题
    C#字符串去除html标记
    web.config加密的问题
  • 原文地址:https://www.cnblogs.com/itech/p/1773911.html
Copyright © 2011-2022 走看看