func 和action 委托的使用
2015-08-18 09:49
357 查看
func 可以带返回值,action 不带返回值
平时我们如果要用到委托一般都是先声明一个委托类型,比如:
string说明适用于这个委托的方法的返回类型是string类型,委托名Say后面没有参数,说明对应的方法也就没有传入参数。
写一个适用于该委托的方法:
最后调用:
这里我们先声明委托,然后再将方法传给该委托。有没有办法可以不定义委托变量呢?
答案是肯定的,我们可以用Func.
Func是.NET里面的内置委托,它有很多重载。
Func<TResult>:没有传入参数,返回类型为TResult的委托。就像我们上面的Say委托,就可以用Func<string>来替代,调用如下:
怎么样,有了Func很简单吧。看一下Func别的重载。
Func<T, TResult> 委托:有一个传入参数T,返回类型为TResult的委托。如:
Func<T1, T2, TResult> 委托:有两个传入参数:T1与T2,返回类型为TResult。
类似的还有Func(T1, T2, T3, TResult) 委托、Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面为方法的传入参数,最后一个为方法的返回类型。
Func也可以与匿名方法一起使用如:
同样它也可以接 lambda 表达式
Func都是有返回类型的,如果我们的方法没有返回类型该怎么办呢?铛铛铛,这时Action就要粉墨登场了。
Action 委托:没有传入参数,也没有返回类型,即Void。如:
Action<T> 委托:传入参数为T,没有返回类型。如:
Action<T1, T2> 委托:两个传入参数,分别为T1与T2,没有返回类型。
Action同样的还有许多其它重载,每个重载用法一样,只是方法的传入参数数量不一样。
其实Action与Func的用法差不多,差别只是一个有返回类型,一个没有返回类型,当然Action也可以接匿名方法和Lambda表达式。
匿名方法:
Lambda表达式:
平时我们如果要用到委托一般都是先声明一个委托类型,比如:
private delegate string Say();
string说明适用于这个委托的方法的返回类型是string类型,委托名Say后面没有参数,说明对应的方法也就没有传入参数。
写一个适用于该委托的方法:
public static string SayHello() { return "Hello"; }
最后调用:
static void Main(string[] args) { Say say = SayHello; Console.WriteLine(say()); }
这里我们先声明委托,然后再将方法传给该委托。有没有办法可以不定义委托变量呢?
答案是肯定的,我们可以用Func.
Func是.NET里面的内置委托,它有很多重载。
Func<TResult>:没有传入参数,返回类型为TResult的委托。就像我们上面的Say委托,就可以用Func<string>来替代,调用如下:
static void Main(string[] args) { Func<string> say = SayHello; //Say say = SayHello; Console.WriteLine(say()); }
怎么样,有了Func很简单吧。看一下Func别的重载。
Func<T, TResult> 委托:有一个传入参数T,返回类型为TResult的委托。如:
//委托 传入参数类型为string,方法返回类型为int Func<string, int> a = Count;
//对应方法 public int Count(string num) { return Convert.ToInt32(num); }
Func<T1, T2, TResult> 委托:有两个传入参数:T1与T2,返回类型为TResult。
类似的还有Func(T1, T2, T3, TResult) 委托、Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面为方法的传入参数,最后一个为方法的返回类型。
Func也可以与匿名方法一起使用如:
public static void Main() { Func<string, int, string[]> extractMeth = delegate(string s, int i) { char[] delimiters = new char[] { ' ' }; return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters); }; string title = "The Scarlet Letter"; // Use Func instance to call ExtractWords method and display result foreach (string word in extractMeth(title, 5)) Console.WriteLine(word); }
同样它也可以接 lambda 表达式
public static void Main() { char[] separators = new char[] {' '}; Func<string, int, string[]> extract = (s, i) => i > 0 ? s.Split(separators, i) : s.Split(separators) ; string title = "The Scarlet Letter"; // Use Func instance to call ExtractWords method and display result foreach (string word in extract(title, 5)) Console.WriteLine(word); }
Func都是有返回类型的,如果我们的方法没有返回类型该怎么办呢?铛铛铛,这时Action就要粉墨登场了。
Action 委托:没有传入参数,也没有返回类型,即Void。如:
static void Main(string[] args) { Action say = SayHello; say(); } public static void SayHello( ) { Console.WriteLine("Say Hello"); }
Action<T> 委托:传入参数为T,没有返回类型。如:
static void Main(string[] args) { Action<string> say = SayHello; say("Hello"); } public static void SayHello(string word ) { Console.WriteLine(word); }
Action<T1, T2> 委托:两个传入参数,分别为T1与T2,没有返回类型。
Action同样的还有许多其它重载,每个重载用法一样,只是方法的传入参数数量不一样。
其实Action与Func的用法差不多,差别只是一个有返回类型,一个没有返回类型,当然Action也可以接匿名方法和Lambda表达式。
匿名方法:
static void Main(string[] args) { Action<string> say = delegate(string word) { Console.WriteLine(word); }; say("Hello Word"); }
Lambda表达式:
static void Main(string[] args) { Action<string> say = s => Console.WriteLine(s); say("Hello Word"); }
相关文章推荐
- 我的openwrt学习笔记(二):OpenWrt 开发环境搭建
- Java中删除List中的某些数据的方法
- Unity中针对Android Apk的签名验证(C#实现)
- java基础知识回顾——集合
- 你还在写一堆的findViewById()吗?
- Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法
- 汉化pycharm4.5.3方法
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
- 对象的比较及hashCode、equals方法的使用
- CSS选择器及用法
- 无法找到 PInvoke DLL“sqlceme30.dll”
- POJ 2531 Network Saboteur(DFS)
- USB之(六)USB设备驱动
- HDU 3466
- 黑马程序员-----Java基础-----Collection-list
- JS+DIV+CSS实现仿表单下拉列表效果
- html table设置边框线
- 算法竞赛入门经典:第八章 高效算法设计 8.7二分查找之upperBound
- pl/sql developer执行计划详解
- zigbee最大功率设置及协调器PA