匿名方法 Lambda表示式和事件

2021-08-09 03:13:49 字數 1460 閱讀 9211

在前面我們知道委託可以指向乙個或多個方法,當有乙個方法只需要用一次並且很簡短,例如:

static

int test1(int arg1,int arg2)

//使用委託指向這個方法

static

void main(string args)

我們可以對**進行簡化,讓其看起來更為簡潔,所以我們可以使用匿名方法,直接忽略方法名,因為我們需要用委託指向這個方法,所以這個方法是什麼名字對於委託來說不重要。我們在建立委託變數的時候就可以直接建立匿名方法,並且不需要返回值:

static

void main(string args)

;}

這樣我們就不需要再額外定義乙個方法,直接使用委託變數指向這個方法,因為編譯器會根據return後面的值來判斷返回值,所以我們也不需要寫返回值。

需要注意的是,我們需要使用delegate關鍵字定義這個方法。

lambda表示式其實也是匿名方式,只是換了一種表現形式。在匿名方式的例子裡我們可以看得出,匿名方式將原來的**簡化成4行,但是其實我們可以使用lambda表示式將**再次簡化。

func f = (arg1, arg2) => ;
這樣我們直接將**簡化成一行,因為在func委託裡,已經寫了引數的型別,所以我們後面不需要再重新定義資料的型別。在lambda表示式中,我們只需要寫引數以及方法體就可以了。

當引數只有乙個的時候,大括號和return都可以省去

func a = b => b + 1;
這個語句的意思是建立了乙個名字為a的委託變數,指向了乙個只有b引數的方法,方法體為返回乙個b+1的值。

關於lambda表示式外部的變數

我們通過lambda表示式也可以訪問方法外部的變數,但是這個功能使用的時候需要謹慎,因為如果訪問了外部的變數,那麼這個表示式就不僅僅受傳入的引數的控制了,結果可能還會因外部的變數的改變而改變。

例如:

//訪問外部變數

int val = 15;

func c = plus => plus + val;

console.writeline(c(10));

val = 20;

console.writeline(c(10));

這段**中,輸出的結果是不一樣的,因為lambda表示式中訪問了外部val這個變數,當val的值改變,這個表示式所返回的值也隨之改變。

我們可以認為事件是一種具有特殊簽名的委託,它基於委託,為委託提供了乙個發布/訂閱機制。

事件的宣告

public

event 委託型別 事件名;

public

delegate

void

mydelegate();

匿名方法和Lambda表示式

出於mvvm學習的需要,複習下匿名方法和lambda表示式,因為之前用的也比較少,所以用的也不是很熟練,baidu下相關的知識,寫了這個demo,目標是用簡單的方法展示這個怎麼用。這裡偏重的和linq中的lambda表示式 var fileslookup files.tolookup f f.sub...

匿名方法和Lambda表示式

1 匿名方法 在c 2.0版本中引入了匿名方法,匿名方法與具名方法 即普通的方法 相對 簡單示例 delegate void mydelegate int x 宣告乙個委託型別 void main del 20 使用場景 給初始化委託變數 給組合委託賦值 給委託增加方法 語法 匿名方法必須與關聯的委...

C 匿名方法和Lambda表示式

有一次看見別人的 裡 以及花裡胡哨的省略寫法感覺好炫酷,就去整理了一下匿名方法和lambda表示式的寫法。1.無返回值型別actiontellname delegate string name 2.委託為方法引數時,省略構造委託例項listlistarray new list listarray.f...