每次看到函數後面跟一大串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 參數指定的類型值的方法。
能夠使用此委託構造一個能以參數形式傳遞的方法,而不用顯式聲明自定義的委託。該方法必須與此委託定義的方法簽名相對應。也就是說,封裝的方法必須具備四個均經過值傳遞給它的參數,而且必須返回值。