概述C# 匿名函數
放了一個長假,很是郁悶,休息沒休息好,學習沒學上,玩也沒怎么玩……這7天怎么就沒了?
哎,看來人生沒計劃,沒安排就會混混沌沌的過一天又一天,都不知道自己到底在干嘛。這樣下去只會一事無成!計劃好每一天的工作、學習、生活,或者安排好每一件事情,每一個目標的計劃,對取得成功還是非常有幫助的!
C# 匿名函數
- //匿名函數
- varp1=new{Name="張三",Age=28};
- varp2=new{Name="李四",Age=29};
- varintArr=new[]{1,2,3,4,5};
首先我們來看一下上面這段代碼,比較簡單,和我們平時定義一個實例基本沒什么區別,只是new后面沒有跟具體定義的類型;這里我們使用new關鍵字調用匿名初始化器創建了一個匿名類型對象; 匿名類型直接繼承自System.Object;匿名類型的成員是編譯器根據初始化器推斷而來的一些讀寫屬性。
這里我們注意到C# 匿名函數基本上是配合隱式類型var來使用的,而且定義的順序也是一定要注意,上面p1和p2初始化時定義的屬性名、類型和順序一致,因此編譯器認為他們是同一個類型,可以使用p1=p2這樣的賦值語句;特別是順序需要注意,如果初始化時名稱類型一致而順序不一致,則p1和p2就是兩個類型,如果使用p1=p2則編譯時會拋出錯誤 :無法將類型“AnonymousType#1”隱式轉換為“AnonymousType#2” .定義匿名函數時還需要注意,不能用null賦初始值。
C# 匿名函數解析:匿名函數的基礎是對象初始化器,匿名類型從對象初始化器(object initializer)自動推斷和生成的元組類型。下面我們來看看匿名函數到底怎么生成的和我們原來的定義方式有什么區別:var p1 = new {Name="張三",Age=28};我們給p1賦了一個匿名類型,在編譯時,編譯器使用對象初始化器推斷的屬性來創建見一個新的匿名類型,該類型擁有Name和Age的屬性,在運行時,會創建新類型的一個實例同時Name和Age屬性將會被設置為對象初始化器中指定的值“張三”、28;和上面幾節里描述的一樣這里大家一定會想到,肯定又是在編譯器里封裝了一些處理;確實是這樣,下面這段代碼描述編譯器針對匿名函數語句具體做了哪些工作:
- class__Anonymous1
- {
- privatestringname;
- privateintage;
- publicstringName{get{returnname;}set{name=value;}}
- publicintAge{get{returnage;}set{age=value;}}
- }
- __Anonymous1p1=new__Anonymous1();
- p1.Name="張三";
- p1.Age=28;
這段代碼就是我們非常熟悉的寫法,編譯器就是在后臺依據匿名函數解析類型,創建新類,初始化對象;如果你創建了多個相似的匿名類型,C#編譯器會聰明的發現這一點,只生成一個類和它的多個實例;小結匿名函數多數是和var隱式類型一起使用,因此多在局部(方法內部)內使用。同樣匿名函數是編譯器編譯時創建,內部實現與我們原來的寫法沒有本質區別。
【編輯推薦】