委托是一个类。

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委托

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

  1. 委托/lambda表达式/事件

    委托 委托是执行安全的类,它的使用方式与类类似(即都需要定义再实例化),不同在于,类在实例化之后叫对象或类的实例,但委托在实例化后仍叫委托,委托可以把函数作为参数传递. 语法声明: delegate ...

  2. 委托+内置委托方法+多播委托+lambda表达式+事件

    委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...

  3. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  4. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  5. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

  6. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  7. C#编程 委托 Lambda表达式和事件

    委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...

  8. 委托 lambda表达式浅显理解

    方法不能跟变量一样当参数传递,怎么办,C#定义了委托,就可以把方法当变量一样传递了,为了简单,匿名方法传递,省得再声明方法了:再简单,lambda表达式传递,比匿名方法更直观. public dele ...

  9. Lambda 表达式浅谈- 01

    已经有一段时间没有发布博文了... 今天就写一写lambda的一些简单的使用方法 Lambda 在Msdn 上的描述: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 ...

随机推荐

  1. python进阶之魔法函数

    __repr__ Python中这个__repr__函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串.如果我们直接打印一个类,向下面这样 class A():     ...

  2. ASP.NET MVC3 Model的常用验证示例

    1.金额(10位整数,2位小数) #region 余额 /// <summary> /// 余额 /// </summary> [DisplayName("余额&qu ...

  3. mysql及linux发行版下载源

    MySQL国内镜像资源 搜狐开源镜像站:http://mirrors.sohu.com/ 国内开源镜像站点汇总 http://segmentfault.com/a/1190000000375848   ...

  4. 解决cef中title不现实tooltip的问题

    本文转自:https://blog.csdn.net/hu1340748/article/details/79030569 感谢感谢 最近在使用chromiumFX做项目,突然发现页面标签中的titl ...

  5. ajax调用WebService 不能跨域

    http://www.cnblogs.com/dojo-lzz/p/4265637.html "Access-Control-Allow-Origin":'http://local ...

  6. On the Bias/Variance tradeoff in Machine Learning

    参考:https://codesachin.wordpress.com/2015/08/05/on-the-biasvariance-tradeoff-in-machine-learning/ 之前一 ...

  7. java 通过异常处理错误

    java的基本理念是"结构不佳的代码不能够运行" 一.概念 发现错误的理想时机是编译阶段,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决. 二.基本异常 异常情形 ...

  8. 16.网络《果壳中的c#》

    16.1 网络体系结构 System.Net.* 命名空间包含各种支持标准网络协议的通信. WebClient 外观类:支持通信HTTP或FTP执行简单的下载/上传操作. WebRequest 和 W ...

  9. js字符串驼峰和下划线互相转换

    // 下划线转换驼峰 function toHump(name) { return name.replace(/\_(\w)/g, function(all, letter){ return lett ...

  10. bzoj 1103

    题目大意:有一棵树根为1,刚开始每条边的权值为1,  现在有m + n - 1 个操作, A :x  y  , 将x和y相连的边权值变为1, W:x, 询问x到1路径上的权值和. 思路 : 方法一: ...