func 可以带返回值,action  不带返回值

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

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 > 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> 委托:两个传入参数,分别为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. Func 和 Action 委托

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

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

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

  3. Func和Action委托简单用法

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

  4. C#中常见的委托(Func委托、Action委托、Predicate委托)

    今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通 ...

  5. Func 委托 和 Action 委托 初步谈论

    继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一 ...

  6. c# 委托(Func、Action)

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

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

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

  8. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  9. 委托Func和Action【转】

    平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...

随机推荐

  1. 一个web项目在myeclipse中add deployment时无法被识别出来的原因

    当我们一个web项目,在myeclipse中,add deployment时,可能发现,根本无法被识别成web项目,可能的原因有:   1. 项目的properties ->Myeclipse ...

  2. PopupWindow组件的使用问题

    //如果默认屏幕的话,父view就写自己 popupWindow.showAtLocation(inflate, Gravity.BOTTOM, 0, 0); PopupWindow 顾名思义为弹出式 ...

  3. oracle-创建表空间报错 提示ora-01119 ora-27040:无法创建文件

    create tablespace syx datafile 'D:\yangk\oraclespace\syx.ora' size 1000m; 低级错误,这是因为指定路径的路径问题,因为指定的路径 ...

  4. 在ubuntu 上创建 ssl 证书

    soap webservice 调试工具: soap UI, 可以下载下来玩一玩. Introduction TLS, or transport layer security, and its pre ...

  5. 转 windows 下 Oracle 导出表结构

      分析Oracle下导出某用户所有表的方法 可能很多使用Oracle的客户都会遇到想把某用户所有表导出的情况,本文就提供这样一个方法帮你轻松解决这个问题. 首先在sqlplus下以该用户登录到Ora ...

  6. PAT (Advanced Level) 1068. Find More Coins (30)

    01背包路径输出. 保证字典序最小:从大到小做背包. #include<cstdio> #include<cstring> #include<cmath> #inc ...

  7. Java基于Socket文件传输示例

    http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...

  8. 杀死进程kill和fuser

    1 kill -9 id 2   不行的话使用    fuser -k -SIGHUP /opt/bre/cookiemapping/wsapi/123 fuser有一个特别的用法在于它可以一次杀死那 ...

  9. Struts2--Action属性接收参数

    1. JSP文件调用格式: <a href="user/user!add?name=a&age=8">添加用户</a> 2. struts.xml文 ...

  10. BNU OJ 50998 BQG's Messy Code

    #include <cstdio> #define _(l) int l #define ___(l,L) for (_(o)=0,x=l o*2;o<x;o++)O= L o; # ...