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

  • 相关阅读:
    d3js 获取元素以及设置属性
    javascript 转义函数
    es6 对象浅拷贝的2种方法
    SwitchyOmega 代理设置
    table 设置边框
    Highcharts 配置选项详细说明
    windows环境下生成ssh keys
    vue 给组件绑定原生事件
    Vue 字面量语法 vs 动态语法
    Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究
  • 原文地址:https://www.cnblogs.com/itech/p/1773911.html
Copyright © 2011-2022 走看看