委託的實現匿名函式和朗姆達表示式

2022-04-17 03:21:00 字數 3809 閱讀 1188

**委託(delegate):乙個表示方法的資料型別。間接派生於system.delegate

委託是乙個引用型別,但不必用new來例項化它。直接傳遞名稱,而不是現實例項化。這是c#2.0開始支援的乙個新語法,成為委託推斷(delegate inference)

1

namespace

delegateex 2

17if (comparisonmethod == null

) 18

2122for (i = items.length - 1; i >= 0; i--)

23

33}

34}

35}

36//

匹配委託的引數greaterthan(int first, int second)

37public

static

bool greaterthan(int first, int

second)

38

41}

42class

program

43

52//

將委託例項作為引數傳遞

53delegatesample.bubblesort(items,delegatesample.greaterthan);

5455

for (int i = 0; i < items.length; i++) 56"

,items[i]);

58}

59console.readkey();

60}

61}

62 }

**匿名方法:就是沒有實際方法宣告委託例項,或者說,他們的定義是直接內嵌在**中的。

1

static

void main(string

args) 2

11//

委託的定義直接內嵌在**中。

12 comparisonmethod = delegate(int first, int

second)

13;

16bubblesort(items,comparisonmethod);

1718

for (int i = 0; i < items.length; i++) 19"

, items[i]);

21}

22console.readkey();

23 }

或者使用更直接的方法:

1

bubblesort(items,

2delegate(int first, int

second)

3);

注意,在任何情況下,引數和返回值型別必須相容於委託的資料型別。

*匿名方法是允許省略引數列表的,但是返回值型別需要與委託一致。

**系統定義的委託:

system.func 在.net 3.5中代表有返回型別的委託

system.action代表無返回型別的委託。

不能將乙個委託型別賦給另乙個委託型別的變數,即使型別引數匹配。

*為委託使用可變性[還沒理解]

action broadaction=delegate(object

data)

action

narrowaction=broadaction;

func

narrowfunction=delegate();

func

broadfunction=narrowaction;

func

func1=degate(

object

data)

;func

func2=fun1;

**lamda表示式 (關鍵字=>) :分為lamda表示式和lamda語句

[csharp]view plain

copy

1

bubblesort(items,

2delegate(int first, int

second)

3);

與上述等價的lamda語句(用於)

1

bubblesort(items,

2 (int first, int second)=> 3

6 );

*省略引數型別:通常,只要編譯器能推斷出引數型別,或者能將引數型別隱式轉換成期望的資料型別,語句lamda就不需要引數型別。如果要制定型別,那麼制定的型別必須和委託型別完全匹配。只要lamda語句包含了乙個型別,則所有的型別都要加上。

1

bubblesort(items,

2 (first,second)=> 3

6 );

*c#要求用一對圓括號來封閉lamda表示式的引數類表,不管是否指定了這些引數的資料型別。圓括號的另外乙個規則是,當編譯器能推斷出資料型別,而且只有乙個輸入引數的時候,語句lamda可以不帶圓括號。

funcgetuserinput=

string input;;

dowhile(input.trim()==0);

return input;

}*lamda表示式(滿足……條件)

bubblesort(items,  

(int first, int second)=> first < second );  

**lamda表示式本身沒有型別

所以.運算子不會被編譯,呼叫object的方法也不行。

不能出現在is的左側

lamda表示式一旦被賦值或者轉型,就會有lamda表示式的型別這種非正式的說法

不能賦值給隱式型別的變數

如果目的在lamda表示式的外部,c#就不允許在匿名函式內部使用跳轉語句(break,continue,goto)

*外部變數:在lamda表示式(包括引數)的外部宣告,但是lamda表示式的內部捕捉(訪問)的區域性變數稱為外部變數。this也是乙個外部變數。

intcomparisoncount=0;

bubblesort(item,

(int first ,int second)=>

comparisoncount++;

return firstconsole.writeline(comparisoncount);

**表示式樹[不理解]

「解釋」是c#引入表示式樹(expression trees)這一概念的重要動機。如果一種lamda表示式代表的是與表示式有關的資料,而不是編譯好的**,這中lamda表示式就是表示式樹。由於表示式樹代表的是資料而非編譯好的**,所以可以把資料轉換成一種替代格式。例如,轉換成sql**。

persons.where(person=>person.name.toupper()=="inigo montoya")

select *from person where upper(name)='inigo montoya'

C 匿名方法和拉姆達表示式

匿名方法本質上是一傳遞給委託的 塊,是使用委託的另一種方法。規則 1 匿名方法中不能使用跳轉語句跳至次匿名方法的外部,反之亦然 匿名方法外部的跳轉語句也不能跳轉到匿名方法的內部 2 在匿名方法的內部不能訪問不安全的 另外,也不能訪問在匿名方法外部定義的ref和out引數。3 可以使用在匿名方法外部定...

C 匿名方法和拉姆達表示式

匿名方法本質上是一傳遞給委託的 塊,是使用委託的另一種方法。規則 1 匿名方法中不能使用跳轉語句跳至次匿名方法的外部,反之亦然 匿名方法外部的跳轉語句也不能跳轉到匿名方法的內部 2 在匿名方法的內部不能訪問不安全的 另外,也不能訪問在匿名方法外部定義的ref和out引數。3 可以使用在匿名方法外部定...

匿名函式 委託和Lambda表示式

其中匿名的函式簽名可以包括兩種,一種是隱式的匿名函式簽名另一種是顯式的匿名函式簽名 隱式的函式簽名 p p1,p1 顯式的函式簽名 int p int p1,int p2 ref int p1,out int p2 匿名的函式體可以是表示式或者 塊。從上面我們可以看出,lambda表示式的引數形式可...