匿名方法和Lambda表示式

2022-10-09 19:42:11 字數 2959 閱讀 8130

1、匿名方法

在c#2.0版本中引入了匿名方法,匿名方法與具名方法(即普通的方法)相對

簡單示例:

delegate void mydelegate(int x); //宣告乙個委託型別

void main()

");

}; del(20);

}

使用場景

給初始化委託變數

給組合委託賦值

給委託增加方法

語法

匿名方法必須與關聯的委託保持格式一致,也就是返回值和引數需要相同,注意語句塊後面是有分號的,不要漏掉

delegate(引數列表) ;

返回值

匿名方法不會顯示地宣告返回值,但是返回值要和對應的委託保持一致。如果委託沒有返回值,即為void時,匿名方法則不能有返回值;如果委託有返回值,則匿名函式需要在語句塊中返回對應型別的值。

delegate int mydelegate(int x); //宣告乙個委託型別

void main()

");

return (x + 10);

};

}

引數列表

引數列表要和宣告的委託保持一致,也就是引數的個數、型別及位置。

當委託沒有out引數或匿名方法沒有輸入引數時,則可以省略匿名方法的引數列表。當匿名方法不需要輸入引數時,這種情況下引數列表可以和委託不一致了,但同時在呼叫委託時,傳入的引數也不會起到作用。

delegate int mydelegate(int x); //宣告乙個委託型別

void main();

del(20);

}

如果在委託型別的宣告中,引數列表使用了params引數,則匿名方法的引數列表會忽略params關鍵字的作用。

外部變數的捕獲

在匿名方法中使用方法塊外部的變數很簡單,可以直接使用

delegate int mydelegate(int x); //宣告乙個委託型別

void main()

");

return 10;

}; del(20);

}

輸出:

匿名方法輸出:30

捕獲變數的生命週期會在委託被呼叫時得到擴充套件

mydelegate del;

");return 10;

};}del(20); //委託呼叫時,由於匿名方法捕獲了val變數,val變數的生命週期在此得到延續

2、lambda表示式

在c#3.0中引入lambda,簡化了匿名方法,用來替代匿名方法。lambda表示式相比匿名方法,不需要使用delegate關鍵字,並且有更精簡的寫法,易於理解也提高了效率。

使用場景

和匿名方法一樣,作為委託delegate的初始化方法或給委託增加方法

還可以用在屬性的get、set中

語法格式

lambda運算子=>,讀作 goes to

引數列表 => 方法塊

示例:

delegate void mydelegate(int x); //宣告乙個委託型別

void main()

"); }; //匿名方法

del = (int x) => "); }; //lambda表示式

del(20);

}

帶返回值

delegate int mydelegate1(int x); //宣告乙個委託型別

void main()

"); return 10;

}; del1(100);

}

引數列表

引數列表一般來說格式要和委託型別保持一致

沒有引數時,必須要用空的()來表示

只有乙個引數時,可以省略()

lambda表示式中引數型別可以省略,除非委託引數中有ref和out修飾的引數,則不可省略

引數列表帶有型別稱為顯示型別,沒有型別稱為隱式型別

delegate void mydelegate(int x); //宣告乙個委託型別

void main()

"); };

del = (x) => "); }; //省略型別

del = x => "); }; //省略()

del = x => console.writeline($"lambda表示式輸出:"); //只有一條語句,也可以放return的表示式

del(20);

}

多個引數

delegate int mydelegate2(int x, int y, int z); //宣告乙個委託型別

void main()

, y = , z = ");

return 20;

}; del3 = (x, y, z) => x + y + z; //省略引數型別,乙個語句作為return表示式

//del4 = x, y, z => x + y + z; //多個引數時無法省略()

del2(3, 5, 7);

console.writeline(del3(3, 5, 7));

}

輸出

x = 3, y = 5, z = 7

15

匿名方法和Lambda表示式

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

匿名方法 Lambda表示式和事件

在前面我們知道委託可以指向乙個或多個方法,當有乙個方法只需要用一次並且很簡短,例如 static int test1 int arg1,int arg2 使用委託指向這個方法 static void main string args 我們可以對 進行簡化,讓其看起來更為簡潔,所以我們可以使用匿名方法...

C 匿名方法和Lambda表示式

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