当前位置: 移动技术网 > IT编程>开发语言>.net > 详解Func<T>与Action<T>区别

详解Func<T>与Action<T>区别

2017年12月12日  | 移动技术网IT编程  | 我要评论
func<t>、action<t> 的区别于说明 一、func func是一个.net内置的委托。 func<result>,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();
    }
  }
}

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网