C# 委托、Lambda表达式和事件——学习总结
1.概括
1.1、委托是寻址方法的.NET版本,类似C++中的指针。委托可以理解成指向函数的指针,它是类型安全的,定义了具体的参数和返回值。
——定义一个委托,实际上是定义一个类。委托是对方法的引用,如方法Func,把其功能交给委托的类来实现。
——委托的作用:结合泛型,可以实现功能上的扩展(如针对整型的函数,可以通过委托指向多种函数,实现类中某个属性的比较)。Lambda表达式需要使用委托定义。事件需要使用到委托。
1.2、Lambda表达式与委托直接相关。Lambda表达式可以理解成一个简单的方法定义(包含参数、返回值),表达式由委托来指向。
——Lambda表达式的作用,减少代码量。
1.3、事件,基于委托,为委托提供了一种发布/订阅机制。最直接的就是Button的Click事件。
2.代码展示
2.1、委托
2.1.1:如何定义一个委托:
1、这是需要进行委托的函数
public static double MultiplyByTwo(double value)
{
return value * ;
} public static double Square(double value)
{
return value * value;
}
2、然后定义一个委托DoubleOp
delegate double DoubleOp(double x);
DoubleOp[] operations =
{
MathOperations.MultiplyByTwo,
MathOperations.Square
};
3、调用委托
Console.WriteLine(operations[]());
Console.WriteLine(operations[]());
4、返回结果

2.1.2:Action<T>委托和Func<T>委托
Action为返回值void的委托,Func为带返回类型(最后一个参数为返回类型)。
如A中的第2步,可以改写做:
Func<double, double>[] operations2 =
{
MathOperations.MultiplyByTwo,
MathOperations.Square
};
委托更多的用处是作为函数的参数,可以把符合一定要求(参数、返回值一致)的函数作为参数传入其他函数(是不是很类似指针?)。
如C#高级编程中的冒泡排序法:
//Func的参数是动态的,根据实际添加的个数决定。
static public void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{
bool swapped = true;
do
{
swapped = false;
for (int i = ; i < sortArray.Count - ; i++)
{
if (comparison(sortArray[i+], sortArray[i]))
{
T temp = sortArray[i];
sortArray[i] = sortArray[i + ];
sortArray[i + ] = temp;
swapped = true;
}
}
} while (swapped);
}
其中一个参数为Func<T,T,bool> comparison。Sort<T>为泛型函数,可以对不同类型T的对象进行排序,而排序方法使用委托comparison。这样使用委托的改动,可以提高Sort函数的适用性,如范例中需要根据员工工资来进行排序,只需要传入一个根据类型Employee来比较员工工资的comparison即可。
以下为调用的范例:
Employee[] employees =
{
new Employee("Bugs Bunny", ),
new Employee("Elmer Fudd", ),
new Employee("Daffy Duck", ),
new Employee("Wile Coyote", 1000000.38m),
new Employee("Foghorn Leghorn", ),
new Employee("RoadRunner", )
}; BubbleSorter.Sort(employees, Employee.CompareSalary);
比较员工工资的comparison——即Employee.CompareSalary是这么写的:
public static bool CompareSalary(Employee e1, Employee e2)
{
return e1.Salary < e2.Salary;
}
2.2、Lambda表达式
简单的定义函数的方式。
string mid = ",2,";
//有花括号(多条语句的情况)的需要return语句
Func<string, string> lambdaTest = param =>
{
param += mid;
param += "";
return param;
};
Console.WriteLine(lambdaTest("")); //没有花括号的会隐式添加一条return语句
Func<string, string> oneParam = s => String.Format("change uppercase {0}", s.ToUpper());
Console.WriteLine(oneParam("test")); Func<double, double, double> twoParams = (x, y) => x * y;
Console.WriteLine(twoParams(, )); Func<double, double, double> twoParamsWithTypes = (double x, double y) => x * y;
Console.WriteLine(twoParamsWithTypes(, )); Func<double, double> operations = x => x * ;
operations += x => x * x; ProcessAndDisplayNumber(operations, 2.0);
C# 委托、Lambda表达式和事件——学习总结的更多相关文章
- C#编程 委托 Lambda表达式和事件
委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...
- C#学习笔记三(委托·lambda表达式和事件,字符串和正则表达式,集合,特殊的集合)
委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事件修饰的是一个对象 public delegate vo ...
- 委托、Lambda表达式、事件系列07,使用EventHandler委托
谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用 ...
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...
- 委托、Lambda表达式、事件系列05,Action委托与闭包
来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...
- 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...
- 委托、Lambda表达式、事件系列03,从委托到Lamda表达式
在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...
- 委托、Lambda表达式、事件系列02,什么时候该用委托
假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int&g ...
- 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...
随机推荐
- ubuntu linux断点续传下载工具 uGet 的安装
网址 http://ugetdm.com/downloads-ubuntu 使用命令行安装 sudo add-apt-repository ppa:plushuang-tw/uget-stable s ...
- April 14 2017 Week 15 Friday
Try to be a rainbow in someone's cloud. 当乌云萦绕心头,我愿意成为你的彩虹. Actually there are many rainbows in our l ...
- 自定义报告,用Java写一个html文件
因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...
- 为什么实例没有prototype属性?什么时候对象会有prototype属性呢?
为什么实例没有prototype属性?什么时候对象会有prototype属性呢? javascript loudou 1月12日提问 关注 9 关注 收藏 6 收藏,554 浏览 问题对人有帮助,内容 ...
- MapReduce执行jar练习
1.用程序生成输入文件1.txt和2.txt 生成程序源码如下: https://www.cnblogs.com/jonban/p/10555364.html 2. 上传文件到hdfs文件系统 创建 ...
- cutil.h问题
CUDA5.0没有cutil.h头文件,貌似用helper_cuda.h文件代替,暂时没出问题.
- 带有data-ng-bind表达式
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- android design 新控件
转载请标明出处: http://blog.csdn.net/forezp/article/details/51873137 本文出自方志朋的博客 最近在研究android 开发的新控件,包括drawe ...
- MBProgressHUD 优雅地去提示
项目主页: MBProgressHUD 实例下载: 点击下载 快速上手: 当执行需要较长时间的任务时,使用MBProgressHUD最重要的一点是: 保证主线程是空闲的,这样可以使UI实时更新.因此: ...
- MySql客户端远程连接MySql服务器
设置MySql服务器以接听端口及以绑定IP地址 MySql服务器默认监听3306端口,确定防火墙以开放此端口. 编辑/etc/my.cnf 添加绑定IP地址.bind-address=192.168. ...