平时我们如果要用到委托一般都是先声明一个委托类型,比如:

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> 委托:有两个传入参数:T1T2,返回类型为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 > ? 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, ))
Console.WriteLine(word);
}

同样它也可以接 lambda 表达式

  public static void Main()
{
char[] separators = new char[] {' '};
Func<string, int, string[]> extract = (s, i) =>
i > ? 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, ))
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> 委托:两个传入参数,分别为T1T2,没有返回类型。

Action同样的还有许多其它重载,每个重载用法一样,只是方法的传入参数数量不一样。

其实ActionFunc的用法差不多,差别只是一个有返回类型,一个没有返回类型,当然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");
}

Func与Action的更多相关文章

  1. 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

    先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...

  2. Func,Action 的介绍

    Func,Action 的介绍 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中 ...

  3. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

  4. c# 委托(Func、Action)

    以前自己写委托都用 delegate, 最近看组里的大佬们都用 Func , 以及 Action 来实现, 代码简洁了不少, 但是看得我晕晕乎乎. 花点时间研究一下,记录一下,以便后期的查阅. 1.F ...

  5. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. p ...

  6. C# Func与Action

    Func与Action是C#的内置委托,在使用委托时,可不必再定义. (1)Func:有返回类型的委托. Func类型的委托,肯定有一个返回类型,如果Func只有一个参数,那么它就是代表没有参数但是有 ...

  7. .NET自带泛型委托方法Func、Action和Predicate

    Func.Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的. 一.Func是有返回值的方 ...

  8. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

  9. 回炉重造系列-C# func and action委托是什么?

    如题: C# func and action委托是什么? 1) 回答这个问题之前,我们需要了解什么是委托(英文 Delegate )? 为了便于理解,再往前推一步,回到c语言时代,指针的概念. 什么是 ...

随机推荐

  1. 14-前端开发之CSS

    什么是 CSS ? CSS 指层叠样式表 (Cascading Style Sheets),用于对页面进行美化. 存在的方式有3种: 元素内联:在标签中使用 style='xx:xxx;' 页面嵌入: ...

  2. eclipse的几个快捷键

    Alt / 自动补全 Ctrl Shift F 整理代码 Ctrl / 注释或取消注释 Ctrl 鼠标移到变量或类名上 转到声明/实现的接口/返回类型等 Ctrl Shift O import所有缺失 ...

  3. thrift中的超时(timeout)坑

    最近在项目中采用thrift作为后台服务rpc框架,总体用下来性能还不错,跨语言特性使用起来也还行,但是也遇到了一些坑,其中之一就是超时问题(timeout),如果服务端些的某些业务场景耗时较长,th ...

  4. Javascript最简单的把html字符串编码的方法

    html字符串是指’<div id=”a”>aklsdjfklsjdfl</div>’这样的带html特殊符号的字符串,我们通常要对他进行处理再输出以免输出成了真正的html元 ...

  5. Exception Handling引入MVP

    异常处理(Exception Handling)是所有系统的最基本的基础操作之一,其它的比如日志(Logging).审核(Auditing).缓存(Caching).事务处理(Transaction) ...

  6. RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描

    现在的 CPU 都提供了单指令流多数据流(single instruction multiple data, SIMD)指令集.最常见的是用于大量的浮点数计算,但其实也可以用在文字处理方面. 其中,S ...

  7. jquery-leonaScroll-1.2-自定义滚动条插件

    leonaScroll-1.2.js 下载链接地址:http://share.weiyun.com/bb531dd6b1916c0023c176897182dc15 (密码:iZck)[内含压缩版] ...

  8. 非对称加密算法RSA

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们 ...

  9. ABP之依赖注入

    写在开头 ABP开源项目最近有点小火,还开展了线下活动.本着学习DDD的心态与学习开源代码的的好奇,我也看了一遍ABP源码,在此将自己学习ABP的一些心得记录下来. 作为核心的IoC 作为一种解耦的方 ...

  10. 快速上手php:使用PhpStrom部署项目

    闲话 上学的时候一直以为可以专注自己的领域,以为与php无缘的,但是这种想法是错误,在完成任务的时候,你不得不使用你不熟悉的语言或者框架.正所谓业务驱动开发,这次接手已经离职的前辈的留下来的项目,最蛋 ...