1、委託:
完成一個委託應分三個步驟:
//step01:首先用delegate定義一個委託;
public delegate int CalculatorAdd(int x, int y);
//step02:聲明一個方法來對應委託.
public int Add(int x, int y)
{
return x + y;
}
protected void FrmTest_Load(object sender, EventArgs e)
{
//step03:用這個方法來實例化這個委託.
CalculatorAdd cAdd = new CalculatorAdd(Add);
//int result = cAdd(5, 6);
int result = cAdd.Invoke(5,6);
}
step01:首先用delegate定義一個委託.
step02:聲明一個方法來對應委託.
step03:用這個方法來實例化這個委託.
至此,一個委託的應該就完成了,就能夠調用委託了.
事件是委託的一個實例,此處暫且不說.數據結構
2、匿名方法:
匿名方法是用來簡化上邊的三個步驟的語法糖.
//step01:首先用delegate定義一個委託;
public delegate int CalculatorAdd(int x, int y);
protected void FrmTest_Load(object sender, EventArgs e)
{
//step02:把一個方法賦值給委託
CalculatorAdd cAdd = delegate(int x, int y) { return x + y; };
//int result = cAdd(5, 6);
int result = cAdd.Invoke(5,6);
}
step01:首先用delegate定義一個委託.
step02:把一個方法賦值給委託,其實這種寫法就是匿名方法.函數
3、Lambda表達式:
微軟對C#的設計理念是簡單易用,對匿名方法再次進行簡化,Lambda就出現了,幾種lambda表達式的寫法.
public delegate int CalculatorAdd(int x, int y);
protected void FrmTest_Load(object sender, EventArgs e)
{
//方法一:
CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
int result1 = cAdd1(5, 6);設計
//方法二:
CalculatorAdd cAdd2 = (x, y) => { return x + y; };
int result2 = cAdd2(5, 6);事件
//方法三:
CalculatorAdd cAdd3 = (x, y) => x + y;
int result3 = cAdd2(5, 6);
}
方法一:簡單的把delegate去掉,在()與{}之間加上"=>";
方法二:在方法一的基礎上把參數類型幹掉;
方法三:在方法二的基礎上把{},以及return關鍵字都去掉了;io
4、泛型委託:
無論是匿名方法仍是Lambda表達式,完成一個委託的應用,都逃不過兩個步驟,一步定義委託,另外一步是用一個方法來實例化一個委託。
泛型委託把這兩步合成一步。用Func來簡化一個委託的定義,其中的Func就是所謂的泛型委託。若是委託函數是返回void,就將Func<>換成Action<>.
protected void FrmTest_Load(object sender, EventArgs e)
{
//方法一:
Func<int,int,int> cAdd1 = (int x, int y) => { return x + y; };
int result1 = cAdd1(5, 6);容器
//方法二:
Func<int, int, int> cAdd2 = (x, y) => { return x + y; };
int result2 = cAdd2(5, 6);基礎
//方法三:
Func<int, int, int> cAdd3 = (x, y) => x + y;
int result3 = cAdd3(5, 6);
}泛型
5、表達式樹:
表達式樹是存放委託的容器,或者說是存取Lambda表達式的一種數據結構。要用Lambda表達式的時候,直接從表達式中獲取出來,Compile()就能夠直接用了。
protected void FrmTest_Load(object sender, EventArgs e)
{
Expression<Func<int, int, int>> exp = (x, y) => x + y;
Func<int, int, int> fun = exp.Compile();
int result = fun(2, 3);
}lambda