委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、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 框架练成 教你打造高效的图片加载框架(转)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41874561,本文出自:[张鸿洋的博客] 1.概述 优秀的图片加载框架不要太多, ...
- js中替换返回json中的空格为
使用.replace(/\s/g, ' ');来替换空格.在IE中 不起作用,可以指定编码将字体设置为:{font-family: Simsun;}
- iOS NSOperation 封装 通知实现界面更新
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MYOperation : NSOpe ...
- Jquery利用Iframe实现跨子域
cross_sub.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 解决Win8无法升级.NET Framework 3.5.1 提示错误0x800F0906
搞了好久,发现了这篇文,很清晰,就引用了过来.http://www.xdowns.com/article/239/Article_3065.html 起因是windows8.1装oracle10g提示 ...
- 解决Windows Server2008R2中导入Excel不能使用Jet 4.0
操作系统使用了Windows Server2008R2(Windows Server2008R2是64位系统,同时配置IIS7.0 原读取Excel文件代码为: string strConn = st ...
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- Xamarin的不归路-连接MAC失败
昨天费了老大劲才配置连接好MAC虚拟机,今天居然又连接不上了. 记录一下最后的解决办法: 直接用“Add Mac”添加虚拟机,一定要填写ip地址,为啥要写ip?我也不知道,因为我填写“MacdeMac ...
- PHP基础知识之函数
定义: <?phpclass foo-----定义类{ function do_foo()---类的方法 { echo "Doing foo."; ...
- 安卓初級教程(1):@Database(1)
package com.example.android.db01; import android.app.Activity; import android.content.ContentValues; ...