C#语法糖之第三篇: 匿名类 & 匿名方法
今天時間有點早,所以上來在寫一篇文章吧,繼續(xù)上一篇的文章,在我們平時編程過程中有沒有遇到過這樣的一個情景,你定義的類只是用來封裝一些相關(guān)的數(shù)據(jù),但并不需要相關(guān)聯(lián)的方法、事件和其他自定義的功能。同時,這個類僅僅在當(dāng)前的應(yīng)用程序中使用,而不需要在項目間重用。你所需要的只是一個“臨時的”類型,現(xiàn)在我們來看看這個傳統(tǒng)類的定義:
1internalclassoneClass
2
3{
4
5//定義若干私有數(shù)據(jù)成員
6
7//通過屬性來封裝每個數(shù)據(jù)成員
8
9//…
10
11}
View Code
從上面代碼構(gòu)建上看,這個類雖然說不上有多難,但是如果這個類有很多數(shù)據(jù)成員的話,那么還是要消耗相當(dāng)時間的。為了解決這個問題微軟給我們提出來一個新的概念叫匿名類型。
匿名類型:匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,并且不能在源代碼級使用。 每個屬性的類型由編譯器推斷。
以下示例顯示了用兩個名為 Amount 和 Message 的屬性進(jìn)行初始化的匿名類型。
1varv=new{Amount=108,Message="Hello"};
2
3Console.WriteLine(v.Amount+""+v.Message);
4
5Console.ReadLine();
View Code
從該例子可以看出來這個匿名類型看起來比傳統(tǒng)類型要簡單明了。
輸出結(jié)果為:
匿名類型也可以嵌套使用,代碼如下:
1varAemployee=new
2
3{
4
5joinDate="2007-7-31",
6
7Apeople=new{Sex="male",Name="Linc",Age="26"},
8
9title="projManager"
10
11};
View Code
該類在這里就簡單的說一下,該類在lambda表達(dá)式中用的比較多,在分享lambda表達(dá)式時在看會理解的更透徹一些。
使用它的限制條件:
1:匿名類型不支持事件、自定義方法和自定義重寫
2:匿名類型是隱式封閉的(sealed)
3:匿名類型的實例創(chuàng)建只使用默認(rèn)構(gòu)造函數(shù)
4:匿名類型沒有提供可供控制的類名稱(使用var 定義的)
匿名方法:普通方法定義方式,因為方法的存在是為了 復(fù)用 一段代碼,所以一般會給方法取個名字,這個方法的引用就可以通過 "方法名"調(diào)用。但是有的方法,不需要復(fù)用,僅僅是使用一次就夠了,所以不需要方法名,這種方法就叫做匿名方法。匿名方法必須結(jié)合 委托使用。(潛在的意思就是:盡管沒有方法名了,但方法的指針還是存放在了某個委托對象中)
C# 3.0 及更高版本中,Lambda 表達(dá)式取代了匿名方法,作為編寫內(nèi)聯(lián)代碼的首選方式。 不過,本主題中有關(guān)匿名方法的信息同樣也適用于 Lambda 表達(dá)式。 有一種情況下,匿名方法提供了 Lambda 表達(dá)式中所沒有的功能。 您可使用匿名方法來忽略參數(shù)列表。 這意味著匿名方法可轉(zhuǎn)換為具有各種簽名的委托。 這對于 Lambda 表達(dá)式來說是不可能的。
看到這些估計大家都云里霧里吧,咱們直接曬代碼來更深的理解一下:
首先我們寫一個傳統(tǒng)方式的一個簡單例子:
1publicclassNNFF
2
3{
4
5//定義委托簽名
6
7publicdelegatevoidPrinter(strings);
8
9publicstaticvoidCeshi()
10
11{
12
13//傳統(tǒng)方式
14
15Printerprinter=SayHello;
16
17printer("你好");
18
19}
20
21publicstaticvoidSayHello(strings)
22
23{
24
25Console.WriteLine("我是普通方法:"+s);
26
27}
28
29}
View Code
比如下面的Sayhello方法只有在Ceshi方法體內(nèi)調(diào)用,不再別的地方使用時該方法在外面單獨寫一個方法時給人感覺有點繁瑣。下載我們再來看看匿名方法的寫法:
1publicclassNNFF
2
3{
4
5//定義委托簽名
6
7publicdelegatevoidPrinter(strings);
8
9publicstaticvoidCeshi()
10
11{
12
13//匿名方法
14
15printer=delegate(strings)
16
17{
18
19Console.WriteLine("我是匿名方法:"+s);
20
21};
22
23printer("你好");
24}
25
26}
View Code
從上面可以看出把輸出內(nèi)容的方法寫到方法Ceshi里了,這樣對于該方法是屬于受保護(hù)的外界是沒有辦法調(diào)用的。
在下兩次課分享lambda表達(dá)式時在舉個更具體的例子,并對比一下,其實lambda表達(dá)式在某種程度上就是匿名方法。匿名方法的簡寫!
注意:
1.在編譯后,會為每個匿名方法創(chuàng)建一個 私有的靜態(tài)方法,然后將此靜態(tài)方法傳給 委托對象使用。
2.匿名方法:編譯后會生成委托對象,生成方法,然后把方法裝入委托對象,最后賦值給 聲明的委托變量。
3.匿名方法可以省略參數(shù):編譯的時候 會自動為這個方法 按照 委托簽名的參數(shù) 添加參數(shù)
總結(jié)
以上是生活随笔為你收集整理的C#语法糖之第三篇: 匿名类 & 匿名方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql重启root不能登_Mysql
- 下一篇: 编码UTF-8