Action和Func原理和用法

每次看到函數後面跟一大串Func就頭痛,平時也沒關注他究竟是什麼,此次學mvc的時候,正好看一下html

使用Action、Func和Lambda表達式mvc

在.NET在,咱們常用委託,委託的做用沒必要多說,在.NET 2.0以前,咱們在使用委託以前,得自定義一個委託類型,再使用這個自定義的委託類型定義一個委託字段或變量。.NET 2.0給咱們帶來了Action、Func兩個泛型委託,.NET3.0給咱們帶來了Lambda,這一切使得委託的定義和使用變得簡單起來。下面的例子中的委託都使用了Lambda表達式。函數

一.Action系列的泛型委託this

Action系列的委託定義的是沒有返回值(返回值爲void)的委託。它有多個版本包括沒有輸入參數,1個輸入參數,2個輸入參數,3個輸入參數,4個輸入參數共5個版本這幾個版本的原型以下:orm

1.       沒有輸入參數返回值爲void的委託.htm

Action委託 封裝一個方法,該方法不採用參數而且不返回值。對象

能夠使用此委託以參數形式傳遞一個執行某操做的方法,而不用顯式聲明一個自定義的委託來封裝此方法。該封裝的方法必須與此委託定義的方法簽名相對應。這意味着該方法不得具備參數和返回值。例:blog

using System;get

using System.Windows.Forms;原型

public class Name

{

   private string instanceName;

   public Action ShowName;

   public Show()

{

   If(ShowName != null)

    ShowName();

}

   public Name(string name)

   {

      this.instanceName = name;

   }

   public void DisplayToConsole()

   {

      Console.WriteLine(this.instanceName);

   }

   public void DisplayToWindow()

   {

      MessageBox.Show(this.instanceName);

   }

}

public class ActionStudy

{

   public static void Main()

   {

      Name testName = new Name("Koani");

      testName.ShowName  = () => testName.DisplayToWindow();

      testName.Show();

   }

}

2.       有1個輸入參數返回值爲void的委託

Action<T>泛型委託封裝一個方法,該方法只採用一個參數而且不返回值。

能夠使用此委託以參數形式傳遞方法,而不用顯式聲明自定義的委託。該方法必須與此

委託定義的方法簽名相對應。也就是說,封裝的方法必須具備一個經過值傳遞給它的參數,而且不能返回值。例:

using System;

using System.Windows.Forms;

 

public class ActionStudy

{

   public static void Main()

   {

      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)

         messageTarget = s => MessageBox.Show(s);

      else

         messageTarget = s => Console.WriteLine(s);

 

      messageTarget("Hello, World!");

   }

}

下面的示例演示如何使用 Action(T) 委託來打印 List(T) 對象的內容。在此示例中,使用 Print 方法將列表的內容顯示到控制檯上。此外,C# 示例還演示如何使用匿名方法將內容顯示到控制檯上。

using System;

using System.Collections.Generic;

 

class Program

{

    static void Main()

    {

        Action<string> PrintInConsole = s => Console.WriteLine(s);

        Action<string> PrintInDialog = s=>MessageBox.Show(s);

        List<String> names = new List<String>();

        names.Add("Bruce");

        names.Add("Alfred");

        names.Add("Tim");

        names.Add("Richard");

        names.ForEach(PrintInConsole);

        names.ForEach(PrintInDialog);      

    }

}

3.       有2個輸入參數返回值爲void的委託

Action<T1,T2> 封裝一個方法,該方法具備兩個參數而且不返回值。

能夠使用 Action(T1, T2) 委託以參數形式傳遞方法,而不用顯式聲明自定義的委託。該

方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備兩個均經過值傳遞給它的參數,而且不能返回值。

using System;

using System.IO;

 

public class ActinStudy

{

   public static void Main()

  {

      string message1 = "The first line of a message.";

      string message2 = "The second line of a message.";

      Action<string, string>  concat;

 

      if (Environment.GetCommandLineArgs().Length > 1)

         concat = (s1, s2) =>

{

StreamWriter writer = null; 

      try

      {

         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);

         writer.WriteLine("{0}"n{1}", s1, s2);

      }

      catch

      {

         Console.WriteLine("File write operation failed...");

      }

      finally

      {

         if (writer != null) writer.Close();

      }

};

      else

         concat = (s1, s2) => Console.WriteLine("{0}"n{1}", s1, s2);

 

      concat(message1, message2);

   }

4.       有3個輸入參數返回值爲void的委託

Action<T1,T2,T3>委託,封裝一個方法,該方法採用三個參數而且不返回值。

能夠使用 Action(T1, T2, T3) 委託以參數形式傳遞方法,而不用顯式聲明自定義的委託。

該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備三個均經過值傳遞給它的參數,而且不能返回值。

5.       有4個輸入參數返回值爲void的委託

Action<T1,T2,T3,T4>委託, 封裝一個方法,該方法具備四個參數而且不返回值。

能夠使用 Action(T1, T2, T3, T4) 委託以參數形式傳遞方法,而不用顯式聲明自定義的委託。封裝的方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備四個均經過值傳遞給它的參數,而且不能返回值。

二.Func系統的泛型委託

Func系列的委託定義的是返回值的委託。它有多個版本包括沒有輸入參數,1個輸入參數,2個輸入參數,3個輸入參數,4個輸入參數共5個版本這幾個版本的原型以下:

1.       沒有輸入參數有返回值(返回值不爲void)的委託

Func<TResult>封裝一個不具備參數但卻返回 TResult 參數指定的類型值的方法。
能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該

方法必須與此委託定義的方法簽名相對應。這意味着封裝的方法不得具備參數,但必須返回值。

2.       具備一個輸入參數有返回值(返回值不爲void)的委託

   Func<T,TResult>封裝一個具備一個參數並返回 TResult 參數指定的類型值的方法。

能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備一個經過值傳遞給它的參數,而且必須返回值。

3.       具備二個輸入參數有返回值(返回值不爲void)的委託

  Func<T1,T2,TResult>封裝一個具備一個參數並返回 TResult 參數指定的類型值的方法。

能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備兩個均經過值傳遞給它的參數,而且必須返回值

4.       具備三個輸入參數有返回值(返回值不爲void)的委託

   Func<T1,T2,T3,TResut>封裝一個具備三個參數並返回 TResult 參數指定的類型值的方法。

能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備三個均經過值傳遞給它的參數,而且必須返回值。

5.       具備四個輸入參數有返回值(返回值不爲void)的委託

 Func<T1,T2,T3,TResult>封裝一個具備四個參數並返回 TResult 參數指定的類型值的方法。

能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備四個均經過值傳遞給它的參數,而且必須返回值。

相關文章
相關標籤/搜索