匿名方法 VS Lambda表示式

2021-06-22 02:18:37 字數 1295 閱讀 8856

c#引入匿名方法是為了簡化**函式(delegate method)定義。

關於anonymous method的語法參考官網。

1. 匿名方法不能訪問外部方法的ref和out引數。

why?!

不安全

2. 匿名方法內的區域性變數不可以與外部方法的區域性變數重名,否則編譯會報重定義錯誤。

why? !

c#的作用域最小單元是方法作用域,所以方法內的所有變數是不能重名的。雖然匿名方法也是一種「方法」,但是他被定義在方法內,所以應該也遵循最小作用域的原則。

像for,do-while等語句也遵循這個原則。匿名方法內的區域性變數可以與外部類的成員變數同名(作用域不同啊,當然可以了^_^)。

3. 匿名方法可以訪問外部方法定義的區域性變數,也可以訪問外部類成員方法和成員變數(即使是訪問許可權是private的成員)。

這會使得所引用的外部變數或者外部類的成員變數生命週期變長。

3-1: 匿名方法引用外部方法區域性變數:

class myanonymous;}

static void main(string args)}

結果輸出:-1

按理說方法returnfun執行完後,其內部的區域性變數result的生命週期就完了,但是由於匿名方法類引用了該區域性變數,所以區域性變數result的生命週期並沒有結束,而是被延長了直到指向其所在的匿名方法的delegate生命週期結束。

3-2:匿名方法引用外部類成員:

類似3-1。

總體說如果匿名方法引用了外部變數(外部方法的區域性變數或者外部類成員)就好比增量乙個訪問外部變數的方式(通過匿名方法)。

更方便的書寫匿名表示式,他的引入就是為了簡化匿名方法的書寫。所以在使用到匿名方法的地方,以及對匿名方法的規則同樣適用於lambda表示式。

但是!!!!官網上說兩者還是有點區別的:「有一種情況下,匿名方法提供了 lambda 表示式中所沒有的功能。

您可使用匿名方法來忽略引數列表。

這意味著匿名方法可轉換為具有各種簽名的委託。

這對於 lambda 表示式來說是不可能的」。簡單的來講就是匿名方法可以省略形參,而lambda表示式不可以省略。

舉例說明:

funcfunc = delegate(int p);

這個表示式可以省略形參簡寫為:

funcfunc = delegate //注意這個地方省略的形參。;

而對於lambda表示式來說不能省略形參,必須顯示的指明形參:

funcfunc =  i => 1990;

不能簡寫成:

funcfunc =  () => 1990;

委託,匿名方法, 表示式

1 委託 委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c 的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理 事件本質上就是委託,是委託的一種典型應用 使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定...

委託,匿名方法, 表示式

1 委託 委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c 的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理 事件本質上就是委託,是委託的一種典型應用 使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定...

委託,匿名方法, 表示式

1 委託 委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c 的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理 事件本質上就是委託,是委託的一種典型應用 使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定...