欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Func与Action区别

程序员文章站 2024-03-30 21:20:33
func、action 的区别于说明 一、func func是一个.net内置的委托。 func,fu...

func<t>、action<t> 的区别于说明

一、func

func是一个.net内置的委托。

func<result>,func<t1,result>是一个.net内置的泛型委托。

func<tresult>
func<t,tresult>
func<t1,t2,tresult>
func<t1,t2,t3,tresult>
func<t1,t2,t3,t4,tresult>

它有5种形式,只是参数个数不同;第一个是无参数,但是有返回值;

下面是一个简单的普通委托来传方法的示例。

private delegate string say();
public static string sayhello()
{
  return "hello";
}
static void main(string[] args)
{
  say say = sayhello;
  console.writeline(say());
  console.readkey();
}

所以,在有时候,我们不知道一个接口同时要做什么操作的时候,我可以给它留一个委托。

为了更方便,.net直接默认有了委托。我们再来试试.net默认带的委托。

public static string sayhello()
{
  return "hello";
}
static void main(string[] args)
{
  func<string> say = sayhello;
  console.writeline(say());
  console.readkey();
}

如果需要参数的,还可以这样传一份。

public static string sayhello(string str)
{
  return str + str;
} 
static void main(string[] args)
{
  func<string, string> say = sayhello;
  string str = say("abc");  
  console.writeline(str);   //输出abcabc
  console.readkey();
}

二、action

action<t>的用法与func几乎一样,调用方法也类似。

action
action<t>
action<t1,t2>
action<t1,t2,t3>
action<t1,t2,t3,t4>
private delegate string say();
public static void sayhello(string str)
{
  console.writeline(str);
}
static void main(string[] args)
{
  action<string> say = sayhello;
  say("abc");
  console.readkey();
}

三、func与action的区别

func与action作用几乎一样。只是

func<result>有返回类型;

action<t>只有参数类型,不能传返回类型。所以action<t>的委托函数都是没有返回值的。

四、func与action都支持lambda的形式调用

还是以一个输入后,返回重复一次的值作为示例。

func<string, string> say = m => m + m;
console.writeline(say("abc"));    //输出abcabc

五、最常见到func的地方

通常我们最常见到func是在方法的参数里如下面这样:

string xxx(func<string, string>)

咱们来看看linq里面的其中一个sum:

public static int sum<tsource>(this ienumerable<tsource> source, func<tsource, int> selector);

里面看到两点:

1、扩展方法,与这篇文章无关(扩展的是ienumerable<tsource>,主要是为了能够实现ienumerable<tsource>接口的集合.出函数)。

2、func<tsource, int> selector这个参数。

尝试写一个linq的first函数吧,命名为first2。linq源代码里有很多异常情况处理,好多设计模式,可惜我不懂,只提取简单逻辑了。

namespace consoleapplication2
{
  static class extend
  {
    public static tsource first2<tsource>(this ienumerable<tsource> source, func<tsource, bool> predicate)
    {
      //.net本身的源代码好多异常情况处理,好多设计模式,我也不懂,只提取逻辑
      foreach (tsource item in source)
      {
        if (predicate(item))
        {
          return (item);
        }
      }
      throw new exception("不存在满足条件的第一个元素!");
    }
  }
  class program
  {
    static void main(string[] args)
    {
      list<int> listint = new list<int>(){ 1, 2, 3, 4, 5 };
      int k = listint.first2(m => m > 4);   //输出5
      console.writeline(k);
 
      console.readkey();
    }
  }
}

以上所述是本文的全部内容,有问题的可以和小编联系,谢谢对的支持!