日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#匿名類型對象分析

學(xué)習(xí)C#語言時,經(jīng)常會遇到C#匿名類型對象問題,這里將介紹C#匿名類型對象問題的解決方法。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寧陽ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寧陽網(wǎng)站制作公司

C#匿名類型對象

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

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

 
 
 
  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。我們可以看到,匿名類型的屬性連類型都省掉了,完全是由編譯器根據(jù)相應(yīng)屬性的初始化表達(dá)式推斷出來的。這三行稱作“C#匿名類型對象初始化器”,編譯器在遇到這樣的語句時,首先會創(chuàng)建一個具有內(nèi)部名稱的類型(所謂的“匿名”只是源代碼層面上的匿名,在最終編譯得到的元數(shù)據(jù)中還是會有這樣一個名字的),這個類型擁有兩個可讀寫屬性,同時有兩個私有域用來存放屬性值;然后,和對待對象初始化器一樣,編譯器產(chǎn)生對象聲明代碼,并依次為每個屬性賦值。

上面代碼的最后三行用來檢驗(yàn)?zāi)涿愋驮谶\(yùn)行時的類型,如果嘗試編譯并運(yùn)行上述代碼,會得到類似下面的輸出:

 
 
 
  1. lover_P.CSharp3Samples.Ex03.Program+f__0  
  2. lover_P.CSharp3Samples.Ex03.Program+f__1  
  3. lover_P.CSharp3Samples.Ex03.Program+f__0 

這表明編譯器的確為C#匿名類型對象創(chuàng)建了實(shí)際的類型,并且該類型在代碼中是不可訪問的,因?yàn)轭愋偷拿植环螩#語言命名規(guī)則(其中出現(xiàn)了+、<、>等非法字符)。

另外,我們還發(fā)現(xiàn)一個有趣的現(xiàn)象,由于b1和b2在初始化的時候其屬性的順序和推斷出來的類型完全一致,它們的運(yùn)行時類型也是一樣的;而b2因?yàn)閷傩猿霈F(xiàn)的順序不同于另外兩個對象,因此具有不同的運(yùn)行時類型。通過下面的代碼,我們可以驗(yàn)證這一事實(shí):

 
 
 
  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. f__1’ to ’lover_P.CSharp3Samples.Ex03.Program.
  10. f__0’。 

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


分享名稱:C#匿名類型對象分析
文章起源:http://www.dlmjj.cn/article/dphsppd.html