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"); }

 

 

 

若是個人文章對你有幫助,就點一下推薦吧.(*^__^*)
相關文章
相關標籤/搜索