委托类似于C/C++中的函数指针,与函数指针不同的是委托是一种类型安全的类。
但是委托本身不安全,如果能用接口就不用委托。犹如函数指针一样,如果其他人设置了函数指针,任何地方都可以被调用,防人之心不可无,害人之心不可有。
虽然事件是基于委托,但事件是安全的,因为事件在外部不可以Invoke显示调用,而委托在外部则可以Invoke显示调用。
1、声明委托。
注意:因为委托是类,所以如果想被当前类(假设当前类名为A)以外的类所用,应放在类A同等级,否则使用时需要A.xxxDelegate来使用,如果为private时即使在同一个命名空间则其他类也无法使用。
public delegate int AddDelegate(int a, int b);// 加
public delegate int SubDelegate(int a, int b);// 减
public delegate int MulDelegate(int a, int b);// 乘
public delegate int DivDelegate(int a, int b);// 除
public delegate int PowerDelegate(int a, int b);// 乘方
private AddDelegate myAddDelegate;// 加
private SubDelegate mySubDelegate;// 减
private MulDelegate myMulDelegate;// 乘
private DivDelegate myDivDelegate;// 除
private PowerDelegate myPowerDelegate;// 乘方
2、使用委托
int x = 9;
int y = 2;
int result = 0;
myAddDelegate = delegate { return add(x, y); };// 匿名委托
mySubDelegate = delegate (int a, int b)// 匿名委托
{
return a - b;
};
myMulDelegate = (int a, int b) =>// Lambda表达式
{
return (a * b);
};
myDivDelegate = new DivDelegate(div);// 从这里看出委托是一种类,此处new了一个实例。直接传入方法
myPowerDelegate = new PowerDelegate((int a, int b) =>// 从这里看出委托是一种类,此处new了一个实例。此处使用ambda表达式
{
return (int)Math.Pow(a, b);
});
Func<int, int, int> func = (int a, int b) =>// Lambda表达式(泛型委托)
{
return (a / b);
};
private int add(int a, int b)
{
return (a + b);
}
private int div(int a, int b)
{
return (a / b);
}
3、调用
result = myAddDelegate.Invoke(x, y);// Invoke显示调用
result = myAddDelegate(x, y);
result = mySubDelegate(x, y);
result = myMulDelegate(x, y);
result = myDivDelegate(x, y);
result = myPowerDelegate(x, y);
result = func(x, y);