C#委托&Lambda

来源:互联网 发布:java yield在Runnable 编辑:程序博客网 时间:2024/06/06 05:14

委托类似于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);

0 0
原创粉丝点击