委托

什么是委托?

如果我们要把方法当做参数来传递的话,就要用到委托。简单来说委托是一个类型,这个类型可以赋值一个方法的引用。

声明委托

在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象。在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后,创建该委托的实例。 定义委托的语法如下:

delegate void IntMethodInvoker(int x);

定义了一个委托叫做IntMethodInvoker,这个委托可以指向什么类型的方法呢?

这个方法要带有一个int类型的参数,并且方法的返回值是void的。

定义一个委托要定义方法的参数和返回值,使用关键字delegate定义。 定义委托的其他案例:

delegate double TwoLongOp(long first,long second);
delegate string GetAString();

使用委托

private delegate string GetAString();

static void Main(){
    int x = 40;
    GetAString firstStringMethod = new GetAString(x.ToString);
    Console.WriteLine(firstStringMethod());
}

在这里我们首先使用GetAString委托声明了一个类型叫做fristStringMethod,接下来使用new 对它进行初始化,使它引用到x中的ToString方法上,这样firstStringMethod就相当于x.ToString,我们通过firstStringMethod()执行方法就相当于x.ToString()

通过委托示例调用方法有两种方式

fristStringMethod();
firstStringMethod.Invoke();

委托的赋值

GetAString firstStringMethod = new GetAString(x.ToString);//只需要把方法名给一个委托的构造方法就可以了
GetAString firstStringMethod = x.ToString;//也可以把方法名直接给委托的实例

简单委托示例

定义一个类MathsOperations里面有两个静态方法,使用委托调用该方法

class MathOperations{
    public static double MultiplyByTwo(double value){
        return value*2;
    }
    public static double Square(double value){
        return value*value;
    }
}
delegate double DoubleOp(double x);
static void Main(){
    DoubleOp[] operations={ MathOperations.MultiplyByTwo,MathOperations.Square };
    for(int i =0;i<operations.Length;i++){
        Console.WriteLine("Using operations "+i);
        ProcessAndDisplayNumber( operations[i],3.0 );
    }
}
static void ProcessAndDisplayNumber(DoubleOp action,double value){
    double res = action(value);
    Console.Writeline("Value :"+value+" Result:"+res);
}

输出

Using operations 0
Value :3 Result:6
Using operations 1
Value :3 Result:9

results matching ""

    No results matching ""