雖然經歷了ASP.NET MVC的文檔我看到這個成語被很多使用:新的關鍵字
new { foo = "bar", baz = "foo" }
這是一個字典文字語法? 它是一個新的類/結構與被調用的函數定義推斷的類型? 如果它是怎麼來的變量不需要一個類型定義,甚至不是var
?
雖然經歷了ASP.NET MVC的文檔我看到這個成語被很多使用:新的關鍵字
new { foo = "bar", baz = "foo" }
這是一個字典文字語法? 它是一個新的類/結構與被調用的函數定義推斷的類型? 如果它是怎麼來的變量不需要一個類型定義,甚至不是var
?
這是一個匿名類型。
匿名類型提供一種方便的方式來封裝一組 只讀屬性到一個單一的對象,而不必明確 第一個定義一個類型。類型名稱由編譯器生成,並且 在源代碼級別不可用。每個屬性的類型是由編譯器推斷的 。
http://msdn.microsoft.com/en-us/library/bb397696.aspx
匿名類型是強類型。從公共語言運行時的角度來看,匿名類型與任何其他引用類型沒有區別。
如果同一程序集中的兩個或多個匿名類型具有相同的數量和類型的屬性,則按照相同的順序,編譯器會將它們視爲相同的類型。它們共享相同的編譯器生成的類型信息。
不應該在程序集之間傳遞匿名類型,甚至不要在方法中使用return values(可能,但很少,很少建議)。
匿名類型是一種方便的機制,例如, LINQ的工作時,如以下projection:
LINQ例
var result = myEnumerable.Select(o => new { foo = o.Foo, bar = o.Bar });
// "result" is an enumerable of a new anonymous type containing two properties
其他問題
這是一個字典文字語法?
不,雖然有很多相似之處。 ASP .Net MVC使用RouteValueDictionary
和匿名類型來表示許多方法重載中的相同信息。
爲什麼變量不需要類型定義,甚至不是var?
值類型推斷,雖然推論並不總是可能的:http://msdn.microsoft.com/en-us/library/bb531357.aspx(VB版,如果有人知道的C#等價的URL請更新)
這是一個anonymous type syntax。類型名稱由編譯器生成,並且在源代碼級別不可用。每個屬性的類型由編譯器推斷。
這是匿名類型。這意味着它返回的是一個foo
屬性,一個baz
屬性都是字符串類型。
很棒的回答。謝謝! – improv32