成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#匿名類型對象分析

開發 后端
這里介紹C#匿名類型對象,在很多情況下,我們需要一種能夠臨時將一批具有一定關聯的數據存放起來的對象;或者在某些情況下,我們對僅一個對象的“形狀”(如屬性的名字和類型等)比較感興趣。

學習C#語言時,經常會遇到C#匿名類型對象問題,這里將介紹C#匿名類型對象問題的解決方法。

C#匿名類型對象

在很多情況下,我們需要一種能夠臨時將一批具有一定關聯的數據存放起來的對象;或者在某些情況下,我們對僅一個對象的“形狀”(如屬性的名字和類型等)比較感興趣。例如前面我們提到的Book,當它和其他商品放在一起進行查詢時,我們可能僅對其名稱和價格感興趣,并且希望將這兩種屬性放在另外一個單獨的臨時對象中以備今后使用。這時,我們關注的僅僅是這個臨時對象具有Name和Price的屬性感興趣,至于它究竟是什么類型就無關緊要了。然而,為了使這樣一個對象得以存在,我們不得不為這個無關緊要的類型寫上一大堆“樣本代碼”,無非就是定義一個如BookAsGood的類,其中無非也就是形如 m_name和m_price的私有域和名為Name與Price的公共可讀寫方法。

而在C# 3.0中,我們無須為這些無關緊要的類型浪費時間。通過使用“匿名類型”,只要在需要一個這樣的對象時使用沒有類型名字的new表達式,并用前面提到的對象初始化器進行初始化即可。如:

  1. var b1 = new { Name = "The First Sample Book"Price = 88.0f };  
  2. var b2 = new { Price = 25.0f, Name = "The Second Sample Book" };  
  3. var b3 = new { Name = "The Third Sample Book"Price = 35.00f };  
  4.  
  5. Console.WriteLine(b1.GetType());  
  6. Console.WriteLine(b2.GetType());  
  7. Console.WriteLine(b3.GetType()); 

首先,前面三行聲明并初始化了三個具有C#匿名類型對象,它們都將具有公共可讀寫屬性Name和Price。我們可以看到,匿名類型的屬性連類型都省掉了,完全是由編譯器根據相應屬性的初始化表達式推斷出來的。這三行稱作“C#匿名類型對象初始化器”,編譯器在遇到這樣的語句時,首先會創建一個具有內部名稱的類型(所謂的“匿名”只是源代碼層面上的匿名,在最終編譯得到的元數據中還是會有這樣一個名字的),這個類型擁有兩個可讀寫屬性,同時有兩個私有域用來存放屬性值;然后,和對待對象初始化器一樣,編譯器產生對象聲明代碼,并依次為每個屬性賦值。

上面代碼的最后三行用來檢驗匿名類型在運行時的類型,如果嘗試編譯并運行上述代碼,會得到類似下面的輸出:

  1. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__0  
  2. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__1  
  3. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__0 

這表明編譯器的確為C#匿名類型對象創建了實際的類型,并且該類型在代碼中是不可訪問的,因為類型的名字不符合C#語言命名規則(其中出現了+、<、>等非法字符)。

另外,我們還發現一個有趣的現象,由于b1和b2在初始化的時候其屬性的順序和推斷出來的類型完全一致,它們的運行時類型也是一樣的;而b2因為屬性出現的順序不同于另外兩個對象,因此具有不同的運行時類型。通過下面的代碼,我們可以驗證這一事實:

  1. // 正確的賦值,b1和b3具有相同的類型  
  2. b1 = b3;  
  3.  
  4. // 錯誤的賦值,b1和b2的類型不同  
  5. b1 = b2;  
  6.  
  7. //如果嘗試編譯這段代碼,對于第二個賦值我們會得到一條編譯錯誤
  8. Cannot implicitly convert type ’lover_P.CSharp3Samples.Ex03.Program.
  9. <Projection>f__1’ to ’lover_P.CSharp3Samples.Ex03.Program.
  10. <Projection>f__0’。 

這實際上是C# 3.0編譯器固有的特性,在同一個程序集中,編譯器將為屬性出現順序和類型完全相同的C#匿名類型對象生成唯一的一個類型。而一旦屬性的出現順序或類型有所不同,編譯器就會生成不同的類型。另外,在兩個程序集之中,即使屬性出現的順序和類型一致,編譯器也可能會生成不同的類型,因此具有C#匿名類型對象是不能跨程序集訪問的。

【編輯推薦】

  1. C# System.Xml集合
  2. C#實現Strategy接口
  3. C#編寫操作TreeView組件剖析
  4. C#實現IDisposable接口淺析
  5. C#異常處理詳細剖析
責任編輯:佚名 來源: 百度空間
相關推薦

2009-08-10 17:25:58

C#匿名類型

2009-08-26 15:46:01

C#匿名類型

2009-08-27 10:19:22

C#匿名類型

2009-08-26 10:34:59

C# Hashtabl

2009-09-10 14:21:58

LINQ匿名類型

2009-08-21 17:45:40

C#調用COM對象

2009-09-01 18:05:17

C#類型聲明

2009-08-20 16:28:45

C#匿名方法

2009-08-20 16:15:19

C# 匿名方法

2009-09-04 14:01:30

C#存儲BLOB對象

2009-07-31 14:08:54

C# 匿名函數

2009-08-27 17:51:34

C#匿名方法

2009-08-28 09:25:59

C#查看Excel對象

2009-08-12 18:28:49

C#強制類型轉化

2009-08-20 16:25:59

C# 匿名方法

2009-08-21 18:01:32

C#匿名方法

2009-08-27 17:47:18

C#匿名方法作為參數傳

2009-08-24 15:02:05

C# 類型

2009-08-20 17:13:37

C# FileSyst

2009-08-28 16:50:25

C# PromptPo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成年人黄色小视频 | 中文字幕一区二区三区乱码图片 | 久久99精品久久久久久国产越南 | 久久久激情视频 | 极品在线 | 精品无码久久久久久国产 | www.日本三级| 99亚洲精品 | 激情久久网 | 一本综合久久 | 亚洲国产精品自拍 | 中文在线一区二区 | 天天看逼 | 久久久91精品国产一区二区三区 | 久久最新精品视频 | 日韩欧美三级在线 | 亚洲风情在线观看 | 久久精品国产免费一区二区三区 | 欧美日韩在线视频一区二区 | dy天堂 | 亚洲国产精品99久久久久久久久 | 亚洲综合资源 | 日韩国产精品一区二区三区 | av在线电影网 | 欧美精品综合在线 | 日本三级播放 | 午夜免费福利片 | 国产精品久久久久久吹潮 | 丝袜 亚洲 欧美 日韩 综合 | 国产乱一区二区三区视频 | 精品一区在线 | 伊人久久大香线 | 国产精品美女久久久av超清 | 国产一区 日韩 | 成人免费视频网站在线观看 | 黄视频国产 | 亚洲精品一区中文字幕乱码 | 欧美成视频在线观看 | 色爱区综合 | 成人h视频在线 | 91av在线视频观看 |