C 3 0新體驗(四)匿名型別

2021-04-21 04:33:42 字數 1524 閱讀 9294

前言:

放了乙個長假,很是鬱悶,休息沒休息好,學習沒學上,玩也沒怎麼玩。。。。這7天怎麼就沒了?

哎,看來人生沒計畫,沒安排就會混混沌沌的過一天又一天,都不知道自己到底在幹嘛。這樣下去只會一事無成!計畫好每一天的工作、學習、生活,或者安排好每一件事情,每乙個目標的計畫,對取得成功還是非常有幫助的!

五.匿名型別

//匿名型別

var p1 = new ;

var p2 = new ;

var intarr = new ;

首先我們來看一下上面這段**,比較簡單,和我們平時定義乙個例項基本沒什麼區別,只是new後面沒有跟具體定義的型別;這裡我們使用new關鍵字呼叫匿名初始化器建立了乙個匿名型別物件;匿名型別直接繼承自system.object;匿名型別的成員是編譯器根據初始化器推斷而來的一些讀寫屬性。

這裡我們注意到匿名型別基本上是配合隱式型別var來使用的,而且定義的順序也是一定要注意,上面p1和p2初始化時定義的屬性名、型別和順序一致,因此編譯器認為他們是同乙個型別,可以使用p1=p2這樣的賦值語句;特別是順序需要注意,如果初始化時名稱型別一致而順序不一致,則p1和p2就是兩個型別,如果使用p1=p2則編譯時會丟擲錯誤 :無法將型別「anonymoustype#1」隱式轉換為「anonymoustype#2」 。定義匿名型別時還需要注意,不能用null賦初始值。

匿名型別解析:

匿名型別的基礎是物件初始化器,匿名型別從物件初始化器(object initializer)自動推斷和生成的元組型別。下面我們來看看匿名型別到底怎麼生成的和我們原來的定義方式有什麼區別:

var p1 = new ;

我們給p1賦了乙個匿名型別,在編譯時,編譯器使用物件初始化器推斷的屬性來建立見乙個新的匿名型別,該型別擁有name和age的屬性,在執行時,會建立新型別的乙個例項同時name和age屬性將會被設定為物件初始化器中指定的值「張三」、28;和上面幾節裡描述的一樣這裡大家一定會想到,肯定又是在編譯器裡封裝了一些處理;確實是這樣,下面這段**描述編譯器針對匿名型別語句具體做了哪些工作:

class __anonymous1

set}

public int age set}

}__anonymous1 p1 = new __anonymous1();

p1.name="張三";

p1.age=28;

這段**就是我們非常熟悉的寫法,編譯器就是在後台依據匿名型別解析型別,建立新類,初始化物件;如果你建立了多個相似的匿名型別,c#編譯器會聰明的發現這一點,只生成乙個類和它的多個例項;

小結匿名型別多數是和var隱式型別一起使用,因此多在區域性(方法內部)內使用。同樣匿名型別是編譯器編譯時建立,內部實現與我們原來的寫法沒有本質區別。

參考:http://dev.21tx.com/2006/03/13/10957.html

引自:http://blog.csdn.net/maotin/archive/2008/10/09/3040632.aspx

C 3 0特性之 匿名型別

匿名型別提供了一種方便的方法,可用來將一組唯讀屬性封裝到單個物件中,而無需首先顯式定義乙個型別。型別名由編譯器生成,並且不能在源 級使用。每個屬性的型別由編譯器推斷。可通過使用 new 運算子和物件初始值建立匿名型別。var person new console.writeline date.use...

C 3 0新特性之匿名型別

c 3.0允許將 new和乙個匿名物件初始化器一起來建立乙個匿名型別的物件。具體語法格式為 匿名物件建立表示式 new 匿名物件初始化器 匿名物件初始化器 成員宣告器列表 成員宣告器 成員宣告器列表,成員宣告器 成員宣告器 簡單名稱 成員訪問 識別符號 表示式 賦值表示式 注 簡單名稱就是已經定義在...

C 3 0新體驗 三 物件與集合初始化器收

c 3.0新體驗 三 maotin 20080925 前言 每天起得很早,花將近1.5個小時的路程來到公司,晚上下班到家基本上19 30以後 每天除了睡覺的7個多小時,有將近1 5時間在路上,呵呵,不知道有多少人和我一樣,我想所謂大城市的快節奏是不是因為住得離公司太遠,每天為了不遲到趕到公司,下班為...