VB在建立對(duì)象時(shí)的新寫(xiě)法

字號(hào):

在VB 2008當(dāng)中,配合LINQ新增了許多新的語(yǔ)法,底下這也是VB在建立對(duì)象時(shí)的新寫(xiě)法:
    Dim stud1 As New students With {.name = "David", .score = 100}
    上述指令會(huì)建立一個(gè)students 對(duì)象的實(shí)體,并且填入默認(rèn)的值。
    這樣的寫(xiě)法簡(jiǎn)便不少,該對(duì)象的類(lèi)聲明如下:
    Public Class students
    ’這邊應(yīng)該寫(xiě)成property, 只是我稍微偷懶一下寫(xiě)成field,不影響demo
    Public name As String
    Public score As Single
    End Class
    上面黃色程序代碼這樣的方式我們稱(chēng)之為命名類(lèi)型的對(duì)象聲明,既然,有命名類(lèi)型,就一定會(huì)有匿名類(lèi)型的聲明方式,語(yǔ)法如下:
    Dim stud2 = New With {.name = "David", .score = 100}
    這個(gè)就炫了吧,不用類(lèi)型照樣可以聲明出一個(gè)對(duì)象實(shí)體,這個(gè)在VB 2008稱(chēng)為匿名類(lèi)型,其實(shí)和LINQ有相當(dāng)大的關(guān)系,干嘛搞出一個(gè)匿名類(lèi)型呢? 它可以方便我們不需要事先建立一個(gè)類(lèi),就可以具有對(duì)象實(shí)體,會(huì)有這樣的需求?
    某些時(shí)候,我們只想要產(chǎn)生一個(gè)對(duì)象,并且隨手就拿來(lái)用了,我們可能懶的聲明一個(gè)對(duì)象的類(lèi),然后再用New指令產(chǎn)生一個(gè)對(duì)象實(shí)體,也有時(shí)候我們只是希望建立一個(gè)臨時(shí)的對(duì)象來(lái)存放特定數(shù)據(jù)處理(查詢(xún))之后的結(jié)果,最典型的例子就是LINQ(之后再述),因此匿名類(lèi)型就應(yīng)運(yùn)而生了。
    匿名類(lèi)型并不特別也不神奇,實(shí)現(xiàn)的方式很簡(jiǎn)單,Compiler 會(huì)自動(dòng)依照你的需要,幫您建立一個(gè)類(lèi)Class,幫你自動(dòng)決定類(lèi)中屬性的型態(tài)。這個(gè)自動(dòng)建立的類(lèi)沒(méi)有名稱(chēng)(因?yàn)槭蔷幾g階段自動(dòng)建立的,所以沒(méi)名稱(chēng)也不要緊,反正我們?cè)诔绦虼a當(dāng)中也不會(huì)用到這個(gè)類(lèi),只會(huì)用到這個(gè)類(lèi)產(chǎn)生的對(duì)象實(shí)體)、這個(gè)類(lèi)會(huì)直接繼承自 Object,并且包含您在聲明對(duì)象時(shí)指定的屬性。
    這個(gè)特性是一個(gè)基礎(chǔ),它讓LINQ查詢(xún)的結(jié)果可以自動(dòng)建立成一個(gè)對(duì)象,例如我們?cè)诮榻B的LINQ功能中,有一段程序代碼:
    Structure BMI
    Dim name As String
    Dim height As Integer
    Dim weight As Integer
    Dim BmiValue As Single
    End Structure
    Dim matrix(5) As BMI
    (...略...)
    ’查詢(xún)BMI值大于25的人
    Dim result = From c In matrix Where c.BmiValue > 25
    其中matrix是一個(gè)對(duì)象沒(méi)有錯(cuò),但是result是什么類(lèi)型? 怎么出現(xiàn)的? LINQ查詢(xún)會(huì)建立出一個(gè)對(duì)象? 怎么建立的呢? 關(guān)鍵就在匿名類(lèi)型。
    有了匿名類(lèi)型這樣的技術(shù)作為基礎(chǔ),LINQ的查詢(xún)結(jié)果(對(duì)象)就可以不需要事先建立一個(gè)特定類(lèi)作為存放查詢(xún)結(jié)果的數(shù)據(jù)類(lèi)型。而可以通過(guò)編輯器自動(dòng)產(chǎn)生這個(gè)類(lèi),我們只需要直接把結(jié)果(對(duì)象)拿來(lái)用,因?yàn)槲覀冊(cè)谝獾氖沁@個(gè)查詢(xún)結(jié)果對(duì)象而非該類(lèi)本身。
    不過(guò)這邊要注意,并非所有的LINQ查詢(xún)結(jié)果一定就需要建立一個(gè)匿名類(lèi)型來(lái)存放,也有可能只需要系統(tǒng)內(nèi)建的類(lèi)型即可。
    例如:
    Dim result = From c In matrix Where c.BmiValue > 25 Select c.name
    result 就只需要String類(lèi)型即可。
    anyway, 匿名類(lèi)型確實(shí)讓開(kāi)發(fā)人員在編寫(xiě)程序代碼的時(shí)候有更多的可能性,也方便許多,同時(shí)間,你也會(huì)發(fā)現(xiàn),編譯程序暗地里幫我們做了很多的事情...說(shuō)到這個(gè),下次有機(jī)會(huì)時(shí)來(lái)談?wù)劸幾g程序是怎么看待LINQ指令的,你會(huì)發(fā)現(xiàn)VB2008的編譯程序比過(guò)去忙碌了許多。