委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言:
最初学习c#时,感觉委托、事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托、事件学习笔记。今天重新温故委托、事件,并且把最近学习到和委托相关的匿名方法、Lambda表达式及泛型委托记录下来,以备复习使用。
委托:
日常工作中,常常见到委托用在具体的项目中。而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下:
class Program
{
public delegate int CalculateDelegate(int x, int y); static void Main(string[] args)
{
CalculateDelegate calculateDelegate = new CalculateDelegate(Add);
int result = calculateDelegate(, );
} public static int Add(int x, int y)
{
return x + y;
}
}
从上例中可以看出,使用一个委托分为三个步骤:
1)声明一个委托:public delegate int CalculateDelegate(int x, int y);
2)定义一个委托对象并绑定方法:CalculateDelegate calculateDelegate = new CalculateDelegate(Add);
3)调用委托:int result = calculateDelegate(2, 3);
其中第二步、第三步的写法和大家有出入,通常很多人喜欢这样写:
1)声明一个委托
2)定义一个委托要绑定的方法
3)定义一个委托,绑定上述定义的方法
匿名方法:
使用上面编写的委托实例,描述匿名方法到底为何物,是怎么使用的。委托绑定方法实现如下:
CalculateDelegate calculateDelegate = new CalculateDelegate(Add); public static int Add(int x, int y)
{
return x + y;
}
如果使用匿名方法重写上面的方法,代码如下:
CalculateDelegate calculateDelegate = delegate(int x, int y){return x + y;};
可见:匿名方法绑定委托直接省去了编写一个单独的方法,使得代码更为简洁。
项目中,使用委托时,很多时候编辑器会帮助我们把方法直接放入合适的委托对象中,但有时候编辑器帮助不了我们,比如:Control.Dispatcher.Invoke(delegate). 例如:
this.btnExit .Dispatcher .Invoke (new Action(() => {}));
注:感谢园友上位者的怜悯的意见。
Lambda表达式:
用Lambda表达式重写上面使用匿名方法编写的委托实例,在匿名方法的基础上,编写如下:
方式一:
CalculateDelegate calculateDelegate = (int x, int y) => { return x + y; };
方式二:
CalculateDelegate calculateDelegate = (x, y) => { return x + y; };
方式三:
CalculateDelegate calculateDelegate = (x, y) => x + y;
从上面可以看出,Lambda仅仅是在匿名方法的基础上加上 => 符号,但是却让整个代码实现起来显得更为优雅。
泛型委托:
在.net平台下有Microsoft自带的泛型委托,如:Action,Action<T>,Fun<T>等。实际使用中,如果需要用到泛型委托,系统内置的委托基本上就能满足需求了,下面一一介绍它们的原型及调用实例。
Action
系统封装的Action委托,没有参数没有返回值。调用实例为:
class Program
{
public delegate void Action(); static void Main(string[] args)
{
Action action = new Action(Method);
action();
} private static void Method()
{
Console.WriteLine("i am is a action");
}
}
如果方法的表达很简单,可以使用Lambda表达式,代码如下:
Action action = () => { Console.WriteLine("i am is a action"); };
action();
Action<T>
系统封装的Action<T>委托,有参数但是没有返回值。调用实例为:
class Program
{
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2); static void Main(string[] args)
{
Action<int,int> action = new Action<int,int>(Method);
action(,);
} private static void Method(int x,int y)
{
Console.WriteLine("i am is a action");
}
}
使用Lambda表达式编写Action<T>代码如下:
Action<int, int> action = (x, y) => { Console.WriteLine("i am is a action"); };
action(,);
Fun<T>
系统封装的Fun<T>委托,有返回值。调用实例为:
class Program
{
public delegate TResult Fun<in T1, in T2, out TResult>(T1 arg1, T2 arg2); static void Main(string[] args)
{
Fun<int, int, bool> fun = new Fun<int, int, bool>(Method);
bool ret = fun(,);
} private static bool Method(int x,int y)
{
if (x + y == )
{
return true;
}
else
{
return false;
}
}
}
使用Lambda表达式编写Fun<T>,代码如下:
Fun<int, int, bool> fun = (x, y) =>
{
if (x + y == )
{
return true;
}
else
{
return false;
}
}; bool ret = fun(,);
Fun<T>没有参数有返回值的情况:
Fun<bool> fun = () =>
{
int x = ;
int y = ;
if (x + y == )
{
return true;
}
else
{
return false;
} }; //也可以如此编写
Fun<bool> fun = () => false;
此种情况很少使用,而且由于能力有限,暂且看不出来使用它们的意义所在。
总结:
在平时的项目中,常见的委托种类及实例本质上也是上述所说的几种。除此之外还有一些其他的委托方法,资质有限精力有限,此处暂且不提,以后碰到在另当别论。
委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式的更多相关文章
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】
1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- C#多线程+委托+匿名方法+Lambda表达式
线程 下面是百度写的: 定义英文:Thread每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它 ...
- C#委托总结-匿名方法&Lambda表达式
1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类 ...
- C#学习笔记(四):委托和事件
刚开始学习C#的时候就写过了,直接给地址了: 委托.匿名函数.Lambda表达式和事件的学习 委托学习续:Action.Func和Predicate
随机推荐
- 结合stack数据结构,实现不同进制转换的算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- [生活日记]参与unity非游戏行业开发者大会小结
今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国, ...
- sql 动态行转列
create table u01 (医案编号 varchar(5),药物编号 varchar(5)) insert into u01 select '01','01' union all select ...
- Oracle 取随机数
1.从表中随机取记录 select * from (select * from staff order by dbms_random.random) where rownum < 4 ...
- MyEclipse10的一些问题(git插件,jdk7)
egit: MyEclipse10 要装 egit2.3,版本错了安装不成功; jdk7: 10.5好像是不支持JDK1.7的,换成10.7; JDK1.7中的switch支持String类型的,1. ...
- 单例模式双重检查锁(DCL)问题
单例模式DoubleCheck 锁问题 先贴代码 public class DoubleCheckSingleton { private static DoubleCheckSingleton ins ...
- [转]关于AS3 Socket和TCP不得不说的三两事
磨刀不误砍柴工,让我们从概念入手,逐步深入. 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...
- Android中AsyncTask使用
一.AsyncTask的作用: 代替Thread+Handler的组合,使创建异步任务变得简单. AsyncTask执行后台操作,并在用户界面上发布结果,而不必处理线程. 二.AsyncTask的定义 ...
- 【Alpha】Daily Scrum Meeting总结
一.项目预期计划和现实进展 项目预期计划 现实进展 登陆 完成 使用菜单 完成 查看自己的信息 完成(额外完成可修改) 完成能用的界面 完成(额外美化) 可以导入导出表格 导入表格完成,导出未完成 教 ...
- BZOJ3687 计算子集和的异或和
题不知道怎么不见了,bzoj上已经没了3687这题了 题意:给你一个n 然后输入n个数 求这n个数的所有子集的和的异或和 思路:用bitset记录某个数是否在子集和中出现,利用bitset对二进制位的 ...