前言
放了一個長假很是郁悶休息沒休息好學習沒學上玩也沒怎麼玩……這天怎麼就沒了?
哎看來人生沒計劃沒安排就會混混沌沌的過一天又一天都不知道自己到底在干嘛這樣下去只會一事無成!計劃好每一天的工作學習生活或者安排好每一件事情每一個目標的計劃對取得成功還是非常有幫助的!
五匿名函數
//匿名函數
var p = new {Name=張三Age=}
var p = new {Name=李四Age=}
var intArr = new[] {}
首先我們來看一下上面這段代碼比較簡單和我們平時定義一個實例基本沒什麼區別只是new後面沒有跟具體定義的類型 這裡我們使用new關鍵字調用匿名初始化器創建了一個匿名類型對象 匿名類型直接繼承自SystemObject 匿名類型的成員是編譯器根據初始化器推斷而來的一些讀寫屬性
這裡我們注意到匿名函數基本上是配合隱式類型var來使用的而且定義的順序也是一定要注意上面p和p初始化時定義的屬性名類型和順序一致因此編譯器認為他們是同一個類型可以使用p=p這樣的賦值語句特別是順序需要注意如果初始化時名稱類型一致而順序不一致則p和p就是兩個類型如果使用p=p則編譯時會拋出錯誤 無法將類型AnonymousType#隱式轉換為AnonymousType# 定義匿名函數時還需要注意不能用null賦初始值
匿名函數解析匿名函數的基礎是對象初始化器匿名類型從對象初始化器(object initializer)自動推斷和生成的元組類型下面我們來看看匿名函數到底怎麼生成的和我們原來的定義方式有什麼區別var p = new {Name=張三Age=} 我們給p賦了一個匿名類型在編譯時編譯器使用對象初始化器推斷的屬性來創建見一個新的匿名類型該類型擁有Name和Age的屬性在運行時會創建新類型的一個實例同時Name和Age屬性將會被設置為對象初始化器中指定的值張三和上面幾節裡描述的一樣這裡大家一定會想到肯定又是在編譯器裡封裝了一些處理確實是這樣下面這段代碼描述編譯器針對匿名函數語句具體做了哪些工作
class __Anonymous
{
private string name
private int age
public string Name{get{return name } set{name=value }}
public int Age{get{return age } set{age=value }}
}
__Anonymous p = new __Anonymous()
pName=張三
pAge=
這段代碼就是我們非常熟悉的寫法編譯器就是在後台依據匿名函數解析類型創建新類初始化對象如果你創建了多個相似的匿名類型C#編譯器會聰明的發現這一點只生成一個類和它的多個實例小結匿名函數多數是和var隱式類型一起使用因此多在局部(方法內部)內使用同樣匿名函數是編譯器編譯時創建內部實現與我們原來的寫法沒有本質區別
From:http://tw.wingwit.com/Article/program/net/201311/13205.html