委托是一个类。

namespace ConsoleApplication1
{
    internal delegate void MyDelegate(int val);
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

使用Reflector查看委托的IL代码:

○ 委托的确是一个类
○ 委托的构造函数接收方法和类实例
○ 而且是多播委托,可以用+=为委托变量赋值
○ 委托内部使用Invoke方法触发方法
○ BeginInvoke和EndInvoke方法用于多线程场景

接下来体验委托如何使用,以及委托的Method和Target属性分别代表什么。

namespace ConsoleApplication1
{
    internal delegate void MyDelegate(int val);
    class Program
    {
        static void Main(string[] args)
        {
            //委托与静态方法
            MyDelegate d = new MyDelegate(M1);
            d(10);
            Console.WriteLine(d.Method);
            if (d.Target == null)
            {
                Console.WriteLine("当前委托调用的是静态方法,没有类实例");
            }
            else
            {
                Console.WriteLine("当前委托调用的是实例方法,类实例为:" + d.Target);
            }
            Console.WriteLine("-------------------");

            //委托与实例方法
            Program p = new Program();
            d = p.M2;
            d.Invoke(10);
            Console.WriteLine(d.Method);
            if (d.Target == null)
            {
                Console.WriteLine("当前委托调用的是静态方法,没有类实例");
            }
            else
            {
                Console.WriteLine("当前委托调用的是实例方法,类实例为:" + d.Target);
            }
        }

        static void M1(int val)
        {
            Console.WriteLine("我是静态方法,输出" + val);
        }

        void M2(int val)
        {
            Console.WriteLine("我是实例方法,输出" + val);
        }
    }
}


○ 委托创建:通过委托构造函数,new MyDelegate(M1);也可通过d = p.M2,这是一种"语法糖"写法,其内部也调用了委托构造函数。
○ 委托与静态方法:只要两者参数列表和返回类型一致,可把静态方法传给委托构造函数
○ 委托与实例方法:只要两者参数列表和返回类型一致,可把实例方法传给委托构造函数
○ 委托调用:像d.Invoke(10),通过委托的实例方法Invoke调用;像d(10),这是一种"语法糖"写法,其内部也调用了实例方法Invoke。
○ Target属性:委托所表示实例方法所属的类实例名称,如果是静态方法,Target为null
○ Method属性:委托所表示的方法,可能是静态方法,也有可能是实例方法

“委托、Lambda表达式、事件系列”包括:

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列02,什么时候该用委托

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托、Lambda表达式、事件系列05,Action委托与闭包

委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

委托、Lambda表达式、事件系列07,使用EventHandler委托

最新文章

  1. Linux命令学习总结: file命令
  2. Unity3D心得分享
  3. Bootstrap <基础二十五>警告(Alerts)
  4. 【转】 全世界最短的IE判定
  5. ubuntu12.04安装svn 1.7(转载)
  6. 转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
  7. 【nginx网站性能优化篇(2)】反向代理实现Apache与Nginx的动静分离(LNMPA)
  8. COJ 1006 树上操作
  9. 2015第16周六学习java建议
  10. 学习Java这几个快捷键你得知道(不断更新中)
  11. Apache 编译扩展的方法
  12. 【原创】Libjpeg 库使用心得(一) JPEG图像DCT系数的获取和访问
  13. Linux下的C----多进程与多线程
  14. spark各种模式提交任务介绍
  15. 转--HC05-两个蓝牙模块间的通信
  16. 20155326刘美岑 2016-2017-2 《Java程序设计》第二周学习总结
  17. HTML/CSS学习(二)
  18. Codeforces.666A.Reberland Linguistics(DP)
  19. 【Docker】第三篇 Docker容器管理
  20. nginx配置location总结及rewrite规则写法【转】

热门文章

  1. nginx参数优化
  2. python enumerate用法总结【转】
  3. File /data/binlog/mysql-bin.index' not found (Errcode: 13)
  4. 浅谈js设计模式之迭代器模式
  5. 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)
  6. php常用的安全过滤函数
  7. android之ExpandableListView 无法展开
  8. 安装Xampp-配置appche,mysql运行环境遇到的坑(转)
  9. Intellij IDEA调试功能总结
  10. Kotlin中var和val的区别