標籤:des style blog http color 使用
今天時間有點早,所以上來在寫一篇文章吧,繼續上一篇的文章,在我們平時編程過程中有沒有遇到過這樣的一個情景,你定義的類只是用來封裝一些相關的資料,但並不需要相關聯的方法、事件和其他自訂的功能。同時,這個類僅僅在當前的應用程式中使用,而不需要在項目間重用。你所需要的只是一個“臨時的”類型,現在我們來看看這個傳統類的定義:
1 internal class oneClass
2
3 {
4
5 //定義若干私人資料成員
6
7 //通過屬性來封裝每個資料成員
8
9 //…
10
11 }View Code
從上面代碼構建上看,這個類雖然說不上有多難,但是如果這個類有很多資料成員的話,那麼還是要消耗相當時間的。為瞭解決這個問題微軟給我們提出來一個新的概念叫匿名型別。
匿名型別:匿名型別提供了一種方便的方法,可用來將一組唯讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器產生,並且不能在原始碼級使用。 每個屬性的類型由編譯器推斷。
以下樣本顯示了用兩個名為 Amount 和 Message 的屬性進行初始化的匿名型別。
1 var v = new { Amount = 108, Message = "Hello" };
2
3 Console.WriteLine(v.Amount +" "+ v.Message);
4
5 Console.ReadLine();View Code
從該例子可以看出來這個匿名型別看起來比傳統類型要簡單明了。
輸出結果為:
匿名型別也可以嵌套使用,代碼如下:
1 var Aemployee = new
2
3 {
4
5 joinDate = "2007-7-31",
6
7 Apeople = new {Sex = "male", Name = "Linc", Age = "26"},
8
9 title = "projManager"
10
11 };View Code
該類在這裡就簡單的說一下,該類在lambda運算式中用的比較多,在分享lambda運算式時在看會理解的更透徹一些。
使用它的限制條件:
1:匿名型別不支援事件、自訂方法和自訂重寫
2:匿名型別是隱式封閉的(sealed)
3:匿名型別的執行個體建立只使用預設建構函式
4:匿名型別沒有提供可供控制的類名稱(使用var 定義的)
匿名方法:普通方法定義方式,因為方法的存在是為了 複用 一段代碼,所以一般會給方法取個名字,這個方法的引用就可以通過 "方法名"調用。但是有的方法,不需要複用,僅僅是使用一次就夠了,所以不需要方法名,這種方法就叫做匿名方法。匿名方法必須結合 委託使用。(潛在的意思就是:儘管沒有方法名了,但方法的指標還是存放在了某個委派物件中)
C# 3.0 及更高版本中,Lambda 運算式取代了匿名方法,作為編寫內聯代碼的首選方式。 不過,本主題中有關匿名方法的資訊同樣也適用於 Lambda 運算式。 有一種情況下,匿名方法提供了 Lambda 運算式中所沒有的功能。 您可使用匿名方法來忽略參數列表。 這意味著匿名方法可轉換為具有各種簽名的委託。 這對於 Lambda 運算式來說是不可能的。
看到這些估計大家都雲裡霧裡吧,咱們直接曬代碼來更深的理解一下:
首先我們寫一個傳統方式的一個簡單例子:
1 public class NNFF
2
3 {
4
5 //定義委託簽名
6
7 public delegate void Printer(string s);
8
9 public static void Ceshi()
10
11 {
12
13 //傳統方式
14
15 Printer printer = SayHello;
16
17 printer("你好");
18
19 }
20
21 public static void SayHello(string s)
22
23 {
24
25 Console.WriteLine("我是普通方法:" + s);
26
27 }
28
29 }View Code
比如下面的Sayhello方法只有在Ceshi方法體內調用,不再別的地方使用時該方法在外面單獨寫一個方法時給人感覺有點繁瑣。下載我們再來看看匿名方法的寫法:
1 public class NNFF
2
3 {
4
5 //定義委託簽名
6
7 public delegate void Printer(string s);
8
9 public static void Ceshi()
10
11 {
12
13 //匿名方法
14
15 printer = delegate(string s)
16
17 {
18
19 Console.WriteLine("我是匿名方法:" + s);
20
21 };
22
23 printer("你好");
24 }
25
26 }View Code
從上面可以看出把輸出內容的方法寫到方法Ceshi裡了,這樣對於該方法是屬於受保護的外界是沒有辦法調用的。
在下兩次課分享lambda運算式時在舉個更具體的例子,並對比一下,其實lambda運算式在某種程度上就是匿名方法。匿名方法的簡寫!
注意:
1.在編譯後,會為每個匿名方法建立一個 私人的靜態方法,然後將此靜態方法傳給 委派物件使用。
2.匿名方法:編譯後會產生委派物件,產生方法,然後把方法裝入委派物件,最後賦值給 聲明的委託變數。
3.匿名方法可以省略參數:編譯的時候 會自動為這個方法 按照 委託簽名的參數 添加參數