zoukankan      html  css  js  c++  java
  • 委托

    概念:委托是方法的容器,是类。跟JavaScript的回调函数一样,把方法作为参数传入方法执行;

    一、简单例子

    /// <summary>
        /// 声明一个委托,需要与执行的方法的前面一样
        /// </summary>
        public delegate void TestDelegate();
        class Program
        {
            static void Main(string[] args)
            {
                //实例一个委托对象,相当于指针指向M1
                TestDelegate td = new TestDelegate(M1);
                //调用委托,相当于调用M1
                td.Invoke();//td();
    
           }
    
     /// <summary>
     /// 声明委托装的这个方法
     /// </summary> 
    static void M1()
     { 
       Console.WriteLine("委托执行这个方法,方法签名跟委托一样"); 
     }
    }
    

      

    二、反编译

    查看IL代码,可以看到本质就是一个类。继承MulticastDelegate

    翻译一下:
    public class TestDelegate.MulticastDelegate{ public TestDelegate(object @object, IntPtr method); public virtual IAsyncResult BeginInvoke(string name, AsyncCallback callback, object @object); public virtual void EndInvoke(IAsyncResult result); public virtual void Invoke(string name); }

    三、匿名方法和lambda表达式

    A:方法只用一次,但是却要声明,我们可以用匿名方法解决。顾名思义,就是没有名字的方法。代替上面的M1方法
                TestDelegate td = new TestDelegate(delegate() {
                    Console.WriteLine("委托执行这个方法,方法签名跟委托一样");
                });
    B:匿名方法写个delegate看起来不太友好,可以用lambda表达式
       TestDelegate td = new TestDelegate(() => Console.WriteLine("委托执行这个方法,方法签名跟委托一样"));
    
    C:lambda注意点
    有参数的话,我们直接在前面的括号写,不用写类型,因为是传的方法指针,执行委托的时候才是执行方法,才有参数填入。其二,参数类型跟委托跟对应的,委托定义好了。
    只有一句语句,可以省略大括号() =>{ Console.WriteLine("委托执行这个方法,方法签名跟委托一样");}. 是返回值,只有一句语句,也可以省略return
    

      

  • 相关阅读:
    在SQLite中使用索引优化查询速度
    SQLite支持的SQL数据操作
    left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
    深入理解Android内存管理原理(六)
    Merge Sorted Array
    Sort Colors
    Construct Binary Tree from Preorder and Inorder Traversal
    Binary Tree Postorder Traversal
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/entclark/p/7932681.html
Copyright © 2011-2022 走看看