C#中delegate详解

首先,delegate是什么?有过C语言或者C++基础的同学可以把他当做C语言和C#的函数的指针。 委托(Delegate   是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。如果可到这里茫然了, 请先忽略。继续往下看。  看完例子再回头看一下delegate 的含义。 或者说了解delegate是什么(所谓认识事物先感性,然后再理性)。

一、实例化委托:一旦声明了委托类型,委托类型必须要通过new关键字来创建(相当于面向对象中的实例化一个对象),当创建委托时,传递到new语句中的参数就像方法的调用一样书写, 但是不带参数。如:

public delegate void PrintSting(string s); // 委托的声明


PrintSting ps=new PrintString(WriteToScreen);//实例化委托。

二、范型委托:为了方便使用,微软事先定义好了三个范型委托。分别是Predicate、Action和Func

1、Predicate定义:

    public delegate bool Predicate<T>(T obj);

    这个委托只能传入一个参数,并且如参的类型由使用者自行提供,返回一个bool类型的值。

2、Action定义:

    public delegate void Action<T>(T obj1,Tobj2,...);

    这个委托代表了一类方法,可以由0——16个入参,入参类型由使用者自己确定。返回值类型为void(通俗来说就是不能由返回值)。

3、Func定义:

    public delegate<T> Func<T>(T obj1,Tobj2,...);

     这个委托同样代表了一类方法, 为了弥补了Action 返回值类型只能为void的不足,.net提供了Func范型委托,Func的入参最多由16个, 并且由返回值,其入参类型和返回值类型均由使用者确定。

4、ActionFunc的异同点:

(1)、相同点,两者的入参类型由使用者提供,并且两者的入参的参数个数最多有16个。   

(5)、不同点:Action的返回值类型只能是void。而Func的返回值类型时使用者自定义。

5、匿名方法:

    本来呢委托定义(声明)好之后,还得再单独定义委托需要使用的方法。不如说你定义了一个计算器的委托, 你还需要重新写计算加减乘除的方法了来供计算器委托来使用。这时候我们就想到了匿名方法。用匿名方法就不需要再单独写加减乘除这些方法了,只需要在匿名方法的方法体内实现这些逻辑就好了。例子如下:

delegate int calculator(int x, int y); //委托类型
        static void Main(string[] args)
        {
            //创建委托对象(确定与哪些方法进行绑定),委托实例名=new 委托名(某个类的方法,本例与加法向绑定
            calculator Adding =delegate( int x, int y)
            {
               return x+y;
            };


            calculator Moveing = delegate(int x, int y)
            {
                return x - y;
            };


            calculator Multiply = delegate(int x, int y)
            {
                return x * y;
            };


            calculator Divide = delegate(int x, int y)
            {
                return x / y;
            };
            Adding(4, 4);//8
            Moveing(4, 4);//0
            Multiply(4, 4);//16
            Divide(4, 4);//1

        }









猜你喜欢

转载自blog.csdn.net/qq_36684665/article/details/80839808