委托
什么是委托?
如果我们要把方法当做参数来传递的话,就要用到委托。简单来说委托是一个类型,这个类型可以赋值一个方法的引用。
声明委托
在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