知识点:
委托是一种类,类是数据类型,所以委托也是一种数据类型,证明如下:
//如何证明委托是一种类
Type type = typeof(Action);
Console.WriteLine(type.IsClass);//结果为True
委托的声明方式与一般的类不同
注意声明委托的位置——避免写错地方结果声明成嵌套类型
委托与所封装的方法必须“类型兼容”,能不能封装方法由类型决定
注释中也包括解释,上代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace DelegateExample
{
//因为委托是一种类,所以要声明在命名空间下,与下面的Program类同级
public delegate double Calc(double x, double y);
//public delegate double(目标方法的返回值类型) Calc(里面是目标方法的参数列表)
//三个double称为类型约束
class Program
{
static void Main(string[] args)
{
//委托是一种类,类是数据类型,所以委托也是一种数据类型
//委托的声明方式与一般的类不同
//注意声明委托的位置——避免写错地方结果声明成嵌套类型
//委托与所封装的方法必须“类型兼容”,能不能封装方法由类型决定
/*
*
delegate double Calc(double x, double y);
double Add(double x, double y) { return x + y; }
double Sub(double x, double y) { return x - y; }
double Mul(double x, double y) { return x * y; }
double Div(double x, double y) { return x / y; }
返回值的数据类型要一致
参数列表在个数和数据类型上一致
*/
//如何证明委托是一种类
//Type type = typeof(Action);
//Console.WriteLine(type.IsClass);//结果为True
Calculator calculator = new Calculator();// 有了实例以后才能访问其变量与方法
Calc calc1 = new Calc(calculator.Add);//创建委托的实例与变量
Calc calc2 = new Calc(calculator.Sub);//创建委托的实例与变量
Calc calc3 = new Calc(calculator.Mul);//创建委托的实例与变量
Calc calc4 = new Calc(calculator.Div);//创建委托的实例与变量
//委托的实例参数中传入的是方法,对这个传入的方法要求是有两个double参数
double a = 100, b = 200, c = 0;
//委托的间接调用
c = calc1.Invoke(a, b);//实际上这个两个参数是传送给了对应的方法
Console.WriteLine(c);
c = calc2.Invoke(a, b);
Console.WriteLine(c);
c = calc3.Invoke(a, b);
Console.WriteLine(c);
c = calc4.Invoke(a, b);
Console.WriteLine(c);
//Invoke可以省略
c = calc1(a, b);
Console.WriteLine(c);
c = calc2(a, b);
Console.WriteLine(c);
c = calc3(a, b);
Console.WriteLine(c);
c = calc4(a, b);
Console.WriteLine(c);
//以上是自定义委托的声明和使用
}
}
class Calculator
{
public double Add(double x,double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
}