Func与Action

平时咱们若是要用到委托通常都是先声明一个委托类型,好比:post

private delegate string Say();

string说明适用于这个委托的方法的返回类型是string类型,委托名Say后面没有参数,说明对应的方法也就没有传入参数。spa

写一个适用于该委托的方法:code

     public static string SayHello() { return "Hello"; }

最后调用:blog

       static void Main(string[] args) { Say say = SayHello; Console.WriteLine(say()); }

这里咱们先声明委托,而后再将方法传给该委托。有没有办法能够不定义委托变量呢?string

答案是确定的,咱们能够用Func.it

Func是.NET里面的内置委托,它有不少重载。io

Func<TResult>:没有传入参数,返回类型为TResult的委托。就像咱们上面的Say委托,就能够用Func<string>来替代,调用以下:class

      static void Main(string[] args) { Func<string> say = SayHello; //Say say = SayHello;  Console.WriteLine(say()); }

怎么样,有了Func很简单吧。看一下Func别的重载。变量

Func<T, TResult> 委托:有一个传入参数T,返回类型为TResult的委托。如:lambda

     //委托 传入参数类型为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"); }

 

 

 

若是个人文章对你有帮助,就点一下推荐吧.(*^__^*)
相关文章
相关标签/搜索