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