• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
【我是谁】
博客园    首页    新随笔    联系   管理    订阅  订阅

委托

概念:委托是方法的容器,是类。跟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

  

 

posted @ 2017-11-30 23:41  【我是谁】  阅读(251)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3