1. 程式人生 > >C# 入門(9) 委託(delegate),匿名方法,Lambda表示式

C# 入門(9) 委託(delegate),匿名方法,Lambda表示式

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表示式看起來簡單許多,直接上圖。
Lambda表示式