委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、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
随机推荐
- Android真机调试 Android.Util.AndroidRuntimeException: You cannot combine custom titles with other title features
参考连接:http://blog.csdn.net/scyatcs/article/details/9003285 Android.Util.AndroidRuntimeException: You ...
- DEV express 对Gridview某行的元素赋值
1:获取选中的行某列的值 string colValue= this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, this.g ...
- 欲望 VS 抗拒
总有很多事情在心里酝酿许久,但真要做起来却又很抗拒. 是在害怕,还是在逃避? 从心,快乐,都是这么难.
- Structs框架
一.准备工作及实例 1.解压struts-2.1.6-all.zip(structs网上下载) apps目录:struts2自带的例子程序 docs目录:官方文档. lib 目录:存放所有jar文件. ...
- android控件 ToggleButton的应用
ToggleButton是android给我们提供的开关按钮, 有两种状态:选中和未选择状态. 以下是代码实例: main.xml [html] view plain copy <?xml ve ...
- CodeForces 444C 分块
题目链接:http://codeforces.com/problemset/problem/444/C 题意:给定一个长度为n的序列a[].起初a[i]=i,然后还有一个色度的序列b[],起初b[i] ...
- 服务器&浏览器伪装的故事
今天要说的是伪装,为嘛要伪装呢?我想,首先是心虚,不够自信,比如你安全措施做的不够,你怕别人黑你的系统,所以就要伪装.其次呢,我想就是有不可告人的秘密了,比如你有竞争对手总是找你的茬,拦截你,那咋办呢 ...
- hdu 5677 ztr loves substring 多重背包
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- tibble包:高效显示表格数据的结构
1 tibble包简介 包名: tibble 编码: UTF- 最新版本: 1.2 标题: 简单数据框 描述: 构建一个 'tbl_df' 类,可以比传统的R数据框提供更好的检查和打印功能. 作者: ...
- XVI Open Cup named after E.V. Pankratiev. GP of SPB
A. Bubbles 枚举两个点,求出垂直平分线与$x$轴的交点,答案=交点数+1. 时间复杂度$O(n^2\log n)$. #include<cstdio> #include<a ...