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);// 乘方
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);
};
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);
但是委托本身不安全,如果能用接口就不用委托。犹如函数指针一样,如果其他人设置了函数指针,任何地方都可以被调用,防人之心不可无,害人之心不可有。
虽然事件是基于委托,但事件是安全的,因为事件在外部不可以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);
相关文章推荐
- C#操作Access类
- C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串
- 获取C#代码执行的时间(精确到毫秒)
- C#中timer类 在C#里关于定时器类就有3个
- 如何在 C#中添加 dll 文件
- 【整理】C#文件操作大全(SamWang)
- C# threeView 静态添加,动态添加,全部展开,全部折叠
- C#学习笔记005-构造函数
- C# 四舍五入,向上取整,向下取整
- c#怎样获取excel单元格的RGB颜色
- C# WPF MediaElement 停在第一帧
- c#串口完全接收程序
- C#学习笔记003-方法
- c# 串口最简单接收十六进制
- C#学习笔记002-数组和冒泡排序
- c# 串口数据接收
- C#关于params的用法(使用数量可变的参数)
- C# 关于out关键字的用法(一个方法返回多个值的问题)
- C#关于ref的用法(多个实参值的传递)
- C#中“@”的作用和用法