描述C# Anonymous Type
在C#2.0中,引入了一個新的Feature:Anonymous Method,允許我們已Inline的方式來定義Delegate,為Developer在Coding的時候帶來了很大的便利。在C#3.0中,我們又有了另一個相似的Feature:Anonymous Type。Anonymous Type允許我們已Inline的方式的創建一個基于未知類型、具有所需數據結構的對象。
C# Anonymous Type Overview在傳統的編程模式中,對象依賴于一個既定的Type,我們只能在Type的基礎上創建相應的Instance。比如如果我們需要創建一個Employee Instance,前提是我們已經有了一個相應的Emplyee Type的定義。比如:
- publicclassEmployee
- {
- privateGuid_id;
- privatestring_name;
- publicGuidID
- {
- get{return_id;}
- set{_id=value;}
- }
- publicstringName
- {
- get{return_name;}
- set{_name=value;}
- }
- }
有了這樣一個Employee Type,我們才可以創建相應的Employee Instance。
var v = new Employee{ ID = Guid.NewGuid(), Name = "Zhang San" };
注:在上面的Code中,實際上使用到了另外兩個C# 3.0的new feature: Implicitly typed local variable & Object Initializer.
這樣基于一個預先定義的Type的對象創建方式的一個最大的限制就是:對于我們需要創建的每一個對象,我們必先定于該對象對應的Type。Anonymous Type有效地解決了這個問題。我認為Anonymous Type主要是基于下面的目的而設計:
一個Type是對一個現實中實體的State(Data)和Behavior(Method)的抽象。對于一些僅僅只包含State(Data)的 Type(這樣對象通常作為Data Package在Application各個Layer之間、以及一個分布式環境中各個Application之間進行數據的傳遞),我們關心的僅僅是這個由這些數據成員組成結構:Type由哪些數據成員構成,它們的名稱是什么,具有怎樣的數據類型。換句話說,這樣的Data-based Type定義了一個Data Structure,相應地,我們可以說一個固定的Data Structure對應著一個特定的Type。而C# Anonymous Type就提供了這樣的實現:Compiler通過我們在Source Code定義的數據成員的具體結構為我們創建相應的Type。
比如我們現在需要一個在上面定義的Employee對象,實際上我們不是需要的一個Type Name叫做Employee的對象,而是需要一個具有如下特征的對象:該對象具有兩個數據成員: ID & Name,他們的數據類型分別為GUID和string。在Source Code中,我們通過以下各結構指定這種特征:var v = new{ID = Guid.NewGuid(), Name= "Zhang San" };
我們仔細分析上面這段代碼,實際上它包含兩部分的信息的:
為 Compiler Type的創建定義一個數據結構。{}中的內容指明了:包含兩個數據成員,第一個是名稱為ID,第二個為Name(成員的順序也是一個決定因素,也就是說 {ID = Name= "Zhang San" ,Guid.NewGuid()}和{ID = Guid.NewGuid(), Name= "Zhang San" }對于的Anonymous Type將是不同的。我不太清楚這樣的設計到底處于一個什么樣的目的);和Implicitly typed local variable一樣,成員的類型由指定的數據或者表達式計算結果的數據類型決定。
為在運行時對象的創建提供數據,就像Constructor的參數一樣。以上介紹C# Anonymous Type。
【編輯推薦】