匿名方法,Lambda表示式,高階函式

2021-09-22 20:47:48 字數 4039 閱讀 3106

原文:

匿名方法,lambda表示式,高階函式

c#2.0引入匿名方法,不必建立單獨的方法,因此減少了所需的編碼系統開銷。 常用於將委託和匿名方法關聯,例如

1. 使用委託和方法關聯:

this.btnrefresh.click += 

newsystem.eventhandler(this.btnrefresh_click);

private

void

btnrefresh_click(

object

sender, eventargs e)

2. 使用委託和匿名方法關聯:

this.btnrefresh.click += delegate

(object

sender, eventargs e) ;

毫無疑問,如果關聯的方法是「一句話方法」的話,**2更為簡潔(實際上編譯器在背後為我們建立了類似btnrefresh_click的方法)。

定義匿名方法時候,引數列表是可以省略的,編譯器可以根據委託的簽名來確定函式的簽名。例如,

delegate void func(int x);

//帶引數

func f1= delegate (int p)

// 不帶引數

func f2 = delegate //編譯器自動推斷函式簽名帶int引數

使用不帶引數的匿名方法,注意問題

一是因為沒有引數,所以在方法內就不能使用引數。

二是有些情況不能使用匿名方法,有ambiguous的問題,例如

public thread(parameterizedthreadstart start);

public thread(threadstart start);

而// public delegate void parameterizedthreadstart(object obj);

// public delegate void threadstart();

所以使用

thread thread = new thread(

delegate

);就會有問題

error  the call is ambiguous between the following methods or properties: 'system.threading.thread.thread(system.threading.threadstart)' and 'system.threading.thread.thread(system.threading.parameterizedthreadstart)' 

編譯器不知道應該將delegate 這一匿名方法還原為哪個函式,解決方法是顯式給定引數列表,讓編譯器知道你要用那個函式:

thread thread = new thread(

delegate()

);lambda表示式:

thread thread = new thread(

() => );

lambda表示式為編寫匿名方法提供了更簡明的函式式的句法,但結果卻在編寫linq查詢表示式時變得極其有用,因為它們提供了乙個非常緊湊的而且類安全的方式來編寫可以當作引數來傳遞,在以後作運算的函式。

lambda 表示式和 匿名方法 其實是一件事情。唯一的不同是:他們語法表現形式不同。lambda 表示式是在語法方面的更進一步的進化。在本質上,他們是一件事情。他們的作用都是:產生方法。即:內聯方法。

books是system.collections.generic.list型別, 即list, 有find方法

使用匿名方法:              books.find(delegate(book book));

使用lambda表示式:      books.find(book=>book.price<50);

book是輸入引數; =>讀作go to,是lambda操作符;book.price<50是表示式或者語句塊。

lambda表示式中的輸入引數省略引數型別,因為當前find擴充套件方法物件是books,編譯器會自動推斷book引數屬於book型別.

對比另乙個例子:

//使用匿名方法

string

list 

=new

string

; string

alist 

=array.findall(list, 

delegate

(string

s)  

); foreach

(string

var 

inalist)  //

使用lambda表示式

string

list 

=new

string

; string

alist 

=array.findall(list, s 

=>

(s.indexof("a

") >=

0)); 

lambda表示式式範例:

//x的型別省略了,編譯器可以根據上下文推斷出來,後面跟著的是表示式

x =>x+

1deleage(

intx)

//後面跟著的是語句塊

x=>

delegate

(int

x)//

輸入引數也可以帶型別,帶型別後別忘記小括號哦

(int

x) =>x+

1delegate

(int

x)//

也可以多個輸入引數,逗號分隔,別忘記小括號

(x,y)

=>x+

ydelegate

(int

x,int

y)//

無參的也行

() =>

1delegate()

高階函式(higher-order function)

是指把另乙個函式作為引數或返回值的函式。

例如在system.array類中就有許多靜態的高階函式,其中的convertall方法可謂是最常用的高階函式之一了: 

private

static

datetime stringtodatetime(

string

s) static

void

main(

string

args) ;

//convertall將乙個陣列對映為另乙個陣列, new converter是構建乙個委託物件

//類似於 new system.eventhandler(this.btnrefresh_click);

datetime dates 

=array.convertall

<

string

, datetime

>

(datestrings, 

newconverter

<

string

, datetime

>

(stringtodatetime));}//

c# 2.0中,又引入了匿名方法這一構建委託物件的方式:

datetime dates 

=array.convertall

<

string

, datetime

>

(datestrings,

delegate

(string

s) );

//新增了lambda表示式和擴充套件方法等語言特性,再加上范型型別的自動判斷,在c# 3.0中使用匿名方法更是異常簡潔,甚至與ruby的語法如出一轍

ienumerable

<

datetime

>

dates 

=datestrings.select(

s =>

datetime.parseexact(s, 

"yyyy-mm-dd", 

null

));

reference

Lambda表示式 匿名方法 委託

lambda表示式 匿名方法 委託 16 9 2017 代替匿名方法的簡單演示 using system using system.collections.generic using system.linq using system.text using system.threading.tasks...

匿名方法和Lambda表示式

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

匿名方法與Lambda表示式

匿名方法的概念 這個方法沒有具體的名稱,而只有委託關鍵字 方法引數 方法體,所以稱為匿名方法,匿名方法允許將 塊通過委託變數作為引數傳遞,以代替單獨定義的方法。首先宣告乙個委託 public delegate int calculatordelegate int a,int b 然後使用匿名方法 c...