什么是委托?
函数指针的升级版,间接实现
数据和算法本质上都是地址
直接调用:通过函数的名字进行调用,直接获得函数所在地址并开始执行
间接实现:通过读取函数指针存储的函数所在地址并开始执行
Java不允许直接访问地址
Action和Func都是委托的一种
Action委托
Action是返回值和参数列表都为空的,只有符合这个条件的才可以用Action
Action action = new Action(calculator.Report);//这里只需要方法名,不需要在后面加圆括号
calculator.Report();//直接调用
action.Invoke();//间接调用
action();//间接调用的简写版
Func委托
泛型委托Func<>
尖括号中写参数类型和返回值类型
Func<int, int, int> func1= new Func<int, int, int>(calculator.Add);
Func<int, int, int> func2= new Func<int, int, int>(calculator.Sub);
int x=100;
int y=200;
int z=0;
z = func1.Invoke(x, y);
z = func1(x, y);//间接调用的简写版本
声明委托
委托是一种类,类一种引用类型的数据类型。
声明格式:
和类层级平行
//声明ming
public delegate double Calc(double x, double y);//类型约束
//实例化
Calc calc1= new Calc(calculator.Add);//实例化的时候括号中填写方法名,其中的方法需要和声明的委托中的一致
//调用
c= calc1.Invoke();
c= calc1;
委托和封装的方法必须类型兼容,也就是返回值类型和参数列表一致
数据model和表现层分开
用property来写数据model
public static calss CounterModel{
private static int mCount =0;
public static Action<int> OnCountChanged;
public static int Count{
get {return mCount;}
set { if (value != mCount){mCount = value;}}
}
}