一.匿名方法
1.匿名方法的演變
匿名方法是為了簡(jiǎn)化委托的實(shí)現(xiàn),方便調(diào)用委托方法而出現(xiàn)的,同時(shí),匿名方法也是學(xué)好lambda表達(dá)式的基礎(chǔ)。在委托調(diào)用的方法中,如果方法只被調(diào)用一次,這個(gè)時(shí)候我們就沒(méi)有必要?jiǎng)?chuàng)建具名方法,從而用匿名方法更為方便。
下面一段代碼是聲明并使用了一個(gè)名稱(chēng)為Add20的方法(和之前的寫(xiě)法一樣)
namespace demo1_0726
{
public delegate int OtherDel(int n);//聲明委托
internal class Program
{
public static int Add20(int x)
{
return x + 20;
}
static void Main(string[] args)
{
OtherDel otherDel = new OtherDel(Add20);
Console.WriteLine("{0}", otherDel(5));
Console.WriteLine("{0}", otherDel(6));
Console.ReadKey();
}
}
}
下面的一段代碼使用了匿名方法來(lái)替代Add20
namespace demo2_0726
{
public delegate int OtherDel(int n);//聲明委托
internal class Program
{
static void Main(string[] args)
{
OtherDel otherDel = delegate (int x)
{
return x + 20;
};
Console.WriteLine("{0}", otherDel(5));
Console.WriteLine("{0}", otherDel(6));
Console.ReadKey();
}
}
}
2.匿名方法的使用
可以在如下地方使用匿名方法
(1)聲明委托變量時(shí)作為初始化表達(dá)式
(2)組合委托時(shí)在賦值語(yǔ)句的右邊
(3)為委托增加事件時(shí)在賦值語(yǔ)句的右邊
3.匿名方法的語(yǔ)法
匿名方法表達(dá)式的語(yǔ)法包含如下部分:
//delegate類(lèi)型關(guān)鍵字
//參數(shù)列表,如果語(yǔ)句塊沒(méi)有使用任何參數(shù)則可以省略
//語(yǔ)句塊,包含了匿名方法的代碼
//關(guān)鍵字( 參數(shù)列表) { 語(yǔ)句塊 }
delegate (Parameters) {ImplementationCode}
1.返回類(lèi)型
匿名方法不會(huì)顯示聲明返回值。如果委托有void類(lèi)型的返回值,匿名方法就不能有返回值。
//這里委托類(lèi)型的返回類(lèi)型是整形
delegate int OtherDel(int InParam);
static void Main()
{
OtherDel del=delegate(int x)
{
return x+20;//返回一個(gè)整型值
};
......
}
2.參數(shù)
除了數(shù)組參數(shù),匿名方法的參數(shù)列表必須在以下3方面與委托匹配:
參數(shù)數(shù)量;參數(shù)類(lèi)型及位置;修飾符
以下情況,我們可以使圓括號(hào)為空或省略圓括號(hào)來(lái)簡(jiǎn)化匿名方法的參數(shù)列表(兩項(xiàng)同時(shí)成立)
1 委托的參數(shù)列表不包含任何out參數(shù)
2 匿名方法不使用任何參數(shù)
舉例
namespace demo2_0726
{
public delegate void OtherDel(int n);//聲明委托
internal class Program
{
static void Main(string[] args)
{
Program program = new Program();
//OtherDel otherDel = delegate (int n)//可以寫(xiě)全
OtherDel otherDel = delegate //也可以省略括號(hào)
{
program.sum();
program.subtract();
};
otherDel(5);
Console.ReadKey();
}
void sum()
{
int n = 4;
n += 3;
}
void subtract()
{
int n = 4;
n -= 2;
}
}
}
3.params參數(shù)
如果聲明委托的參數(shù)列表包含了params參數(shù),那么params關(guān)鍵字在匿名方法的參數(shù)列表中就會(huì)被省略:
delegate void SomeDel(int X,params int[] Y)//在委托聲明中使用params關(guān)鍵字
SomeDel mDel=delegate(int X, int[] Y)//在匹配的匿名方法中省略關(guān)鍵字
{
...
};
4.變量和參數(shù)的作用域
1 參數(shù)以及聲明在匿名方法內(nèi)部的局部變量的作用域限制在實(shí)現(xiàn)方法的主體之內(nèi).
2 與委托的具名方法不同,匿名方法可以訪(fǎng)問(wèn)它們外圍作用域的局部變量和環(huán)境,方法中的代碼可以訪(fǎng)問(wèn)外圍變量并且輸出它的值。
二.Lambda表達(dá)式
1.Lambda表達(dá)式簡(jiǎn)介
C#2.0引入了匿名方法,C#3.0引入了Lambda表達(dá)式,匿名方法演變成Lambda表達(dá)式,在使用中我們更希望使用Lambda表達(dá)式來(lái)替代匿名方法。
2.匿名方法轉(zhuǎn)換為L(zhǎng)ambda表達(dá)式的步驟
1 刪除delegate關(guān)鍵字
2 在參數(shù)列表和匿名方法主體之間放lambda運(yùn)算符=>。lambda運(yùn)算符讀作goes to
Mydel del=delegate(int x) {return x+1;};//匿名方法
Mydel le1= (int x)=>{return x+1;};//Lambda表達(dá)式
3.簡(jiǎn)化Lambda表達(dá)式
(1) 編譯器可以從委托的聲明中知道委托參數(shù)的類(lèi)型,因此Lambda表達(dá)式允許我們省略類(lèi)型參數(shù)。
帶有類(lèi)型的參數(shù)列表稱(chēng)為顯示類(lèi)型
省略類(lèi)型的參數(shù)列表稱(chēng)為隱式類(lèi)型
(2)如果只有一個(gè)隱式類(lèi)型參數(shù),我們可以省略周?chē)睦ㄌ?hào)。
(3)Lambda表達(dá)式允許表達(dá)式的主體是語(yǔ)句塊或者表達(dá)式。如果語(yǔ)句塊包含了一個(gè)返回語(yǔ)句,我們可以將語(yǔ)句塊替換為return關(guān)鍵字后的表達(dá)式(即去掉關(guān)鍵字return)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-616782.html
Mydel del=delegate(int x) {return x+1;};//匿名方法
Mydel le1= (int x)=>{return x+1;};//Lambda表達(dá)式
Mydel le1= (x)=>{return x+1;};//省略類(lèi)型的Lambda表達(dá)式
Mydel le1= x =>{return x+1;};//省略隱式類(lèi)型周?chē)睦ㄌ?hào)的Lambda表達(dá)式
Mydel le1= x => x+1 ;//去掉關(guān)鍵字return的Lambda表達(dá)式
4.Lambda表達(dá)式的注意事項(xiàng)
(1) Lambda表達(dá)式參數(shù)列表中的參數(shù)必須在參數(shù)數(shù)量、類(lèi)型和位置上與委托相匹配;
(2) 表達(dá)式的參數(shù)列表中的參數(shù)不一定需要包含類(lèi)型(隱式類(lèi)型),除非委托有ref或out參數(shù)–此時(shí)必須注明類(lèi)型(顯示類(lèi)型)
(3) 如果只有一個(gè)參數(shù)并且是隱式類(lèi)型的,我們可以省略周?chē)睦ㄌ?hào)。,否則必須有括號(hào)
(4) 如果沒(méi)有參數(shù),必須使用一組空的圓括號(hào)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-616782.html
到了這里,關(guān)于C# 匿名方法和Lambda表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!