C# 入門(9) 委託(delegate),匿名方法,Lambda表示式
阿新 • • 發佈:2019-01-11
C#的委託,匿名方法,Lambda表示式
委託就像C++的函式指標一樣,可以指向一個函式,但委託更牛逼,指的其實是一個函式列表,依次執行函式。
在C++中,匿名方法和Lambda表示式其實是一回事,C#裡就是兩回事了。
委託
委託的初始化
delegate void MyDel(int value);
//下面兩句等價,SomeClass.SomeFunction是某個相同返回值,引數列表的函式。
MyDel del = new MyDel(SomeClass.SomeFunction);
MyDel del = SomeClass.SomeFunction;
組合委託 & 為委託新增方法 & 刪除方法 & 委託呼叫
//可以直接使用 + 操作符將方法或委託組合在一起。委託允許重複,及執行多次。
MyDel del = delA + delA + delB + SomeClass.SomeFunction;
//或者使用 += 操作符新增方法或委託。
del += delC + SomeClass.SomeFunction;
//當要注意使用 += 操作符時,左值要先初始化。
MyDel del2;
del2 += del; //錯誤,del2沒有初始化。
//刪除用 -= 操作符。
del -= delA;
del = del - SomeClass.SomeFunction;
//呼叫,相當於給列表中所有方法給了666的引數。
del(666);
- 在使用 += 運算子時,實際發生的是建立一個新的委託,把左邊的委託加上右邊方法的組合,再賦值個左邊的委託。
- 使用 -= 運算子時,如果匹配有多個相同的方法,會從列表最後向前搜尋,刪掉第一個匹配的方法的例項。
- 空委託用 -= 運算子會報異常。
匿名方法
匿名方法是要帶delegate關鍵字的。
//正常的畫風應該是這樣的。
MyDel del = delegate(int value)
{
return value + 100;
}
//省略圓括號,但必須滿足以下兩個條件
//1.委託的引數列表裡面不包含任何out引數。
//2.匿名方法不使用任何引數。
MyDel del = delegate
{
SomeFunction();
SomeFunction2(1,2,3,4);
}
del(666); //傳進去的666對上面沒有引數的匿名函式沒有影響。
//params引數,如果委託有params引數,匿名方法的引數列表將忽略params關鍵字。
delegate void anotherDel(int X,params int[] Y);
anotherDel aDel = delegate(int X,int Y) { }; //省略了params
Lambda表示式
相比匿名方法,Lambda表示式看起來簡單許多,直接上圖。