您的位置:首页 > 编程语言 > C#

C#委托&Lambda

2015-12-27 00:52 309 查看
委托类似于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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: