今天時間有點早,所以上來在寫一篇文章吧,繼續上一篇的文章,在我們平時編程過程中有沒有遇到過這樣的一個情景,你定義的類只是用來封裝一些相關的數據,但并不需要相關聯的方法、事件和其他自定義的功能。同時,這個類僅僅在當前的應用程序中使用,而不需要在項目間重用。你所需要的只是一個“臨時的”類型,現在我們來看看這個傳統類的定義:
1internalclassoneClass23{45//定義若干私有數據成員67//通過屬性來封裝每個數據成員89//…1011}View Code從上面代碼構建上看,這個類雖然說不上有多難,但是如果這個類有很多數據成員的話,那么還是要消耗相當時間的。為了解決這個問題微軟給我們提出來一個新的概念叫匿名類型。
匿名類型:匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,并且不能在源代碼級使用。 每個屬性的類型由編譯器推斷。
以下示例顯示了用兩個名為 Amount 和 Message 的屬性進行初始化的匿名類型。
1varv=new{Amount=108,Message="Hello"};23Console.WriteLine(v.Amount+""+v.Message);45Console.ReadLine();View Code從該例子可以看出來這個匿名類型看起來比傳統類型要簡單明了。
輸出結果為:
匿名類型也可以嵌套使用,代碼如下:
使用它的限制條件:
1:匿名類型不支持事件、自定義方法和自定義重寫
2:匿名類型是隱式封閉的(sealed)
3:匿名類型的實例創建只使用默認構造函數
4:匿名類型沒有提供可供控制的類名稱(使用var 定義的)
匿名方法:普通方法定義方式,因為方法的存在是為了 復用 一段代碼,所以一般會給方法取個名字,這個方法的引用就可以通過 "方法名"調用。但是有的方法,不需要復用,僅僅是使用一次就夠了,所以不需要方法名,這種方法就叫做匿名方法。匿名方法必須結合 委托使用。(潛在的意思就是:盡管沒有方法名了,但方法的指針還是存放在了某個委托對象中)
C# 3.0 及更高版本中,Lambda 表達式取代了匿名方法,作為編寫內聯代碼的首選方式。 不過,本主題中有關匿名方法的信息同樣也適用于 Lambda 表達式。 有一種情況下,匿名方法提供了 Lambda 表達式中所沒有的功能。 您可使用匿名方法來忽略參數列表。 這意味著匿名方法可轉換為具有各種簽名的委托。 這對于 Lambda 表達式來說是不可能的。
看到這些估計大家都云里霧里吧,咱們直接曬代碼來更深的理解一下:
首先我們寫一個傳統方式的一個簡單例子:
1publicclassNNFF23{45//定義委托簽名67publicdelegatevoidPrinter(strings);89publicstaticvoidCeshi()1011{1213//傳統方式1415Printerprinter=SayHello;1617printer("你好");1819}2021publicstaticvoidSayHello(strings)2223{2425Console.WriteLine("我是普通方法:"+s);2627}2829}View Code比如下面的Sayhello方法只有在Ceshi方法體內調用,不再別的地方使用時該方法在外面單獨寫一個方法時給人感覺有點繁瑣。下載我們再來看看匿名方法的寫法:
1publicclassNNFF23{45//定義委托簽名67publicdelegatevoidPrinter(strings);89publicstaticvoidCeshi()1011{1213//匿名方法1415printer=delegate(strings)1617{1819Console.WriteLine("我是匿名方法:"+s);2021};2223printer("你好");24}2526}View Code從上面可以看出把輸出內容的方法寫到方法Ceshi里了,這樣對于該方法是屬于受保護的外界是沒有辦法調用的。
在下兩次課分享lambda表達式時在舉個更具體的例子,并對比一下,其實lambda表達式在某種程度上就是匿名方法。匿名方法的簡寫!
注意:
1.在編譯后,會為每個匿名方法創建一個 私有的靜態方法,然后將此靜態方法傳給 委托對象使用。
2.匿名方法:編譯后會生成委托對象,生成方法,然后把方法裝入委托對象,最后賦值給 聲明的委托變量。
3.匿名方法可以省略參數:編譯的時候 會自動為這個方法 按照 委托簽名的參數 添加參數
新聞熱點
疑難解答