Func 与 Action

转载 2015年11月17日 16:07:35

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

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<TTResult> 委托:有一个传入参数T,返回类型为TResult的委托。如:

     //委托 传入参数类型为string,方法返回类型为int
     Func<string, int> a = Count;
      //对应方法
        public int Count(string num)
        {
            return Convert.ToInt32(num);
        }

Func<T1T2TResult> 委托:有两个传入参数: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<T1T2> 委托:两个传入参数,分别为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");
        }


转自 : http://www.cnblogs.com/Gyoung/archive/2013/04/04/2997050.html

相关文章推荐

Action,Func的Demo

  • 2016年06月27日 16:31
  • 40KB
  • 下载

Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)

#region 调用timer控件实时查询开关机时间 private void timer1_Tick(object sender, EventArgs e) { string sql = "...

委托C#(delegate、Action、Func、predicate,Predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。   1.委托的声明   (1). delegate         delegate我们常...

Func,Action 的介绍及其用法

Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能。...
  • antsnm
  • antsnm
  • 2011年09月21日 15:58
  • 1956

提问c# action<> func<> 这2个委托怎么用和理解

其实很好理解的呢!~首先你需要明白,他们是委托的简写形式。 一。【action 1.1定义一个委托: 比如,我们原来写委托: public delegate void myDelegate(s...

C# -- 委托的介绍(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。   1.委托的声明   (1). delegate         deleg...

.Net——Func<>与Action<>

首先来先写几个测试函数: public delegate void SayHello(string strName); pub...

C#委托之Action、Func与Predicate用法

C#委托之Action与Func用法 一、Action,可以传入参数,没有返回值的委托   1、调用方法static void Main(string[] args) { Actio...

C#委托介绍(delegate、Action、Func、predicate)(一)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。   1.委托的声明   (1). delegate         delegate我们常...
  • Root915
  • Root915
  • 2017年05月31日 16:01
  • 213

C#.NET:高级编程之系统内置委托(有Func/无返回值Action)

转载声明:转载本文是为了方便自己查看,有需要的朋友建议查看原文(注:原文中有作者纠正的评论,我没有搬运) 原文地址:http://www.cnblogs.com/akwwl/p/3232679.ht...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Func 与 Action
举报原因:
原因补充:

(最多只允许输入30个字)