簡(jiǎn)單介紹VB.NET和C#
在VB.NET和C#***次被發(fā)布時(shí),很多人認(rèn)為它們只是在語(yǔ)法和一些小的方面不一樣的相同語(yǔ)言而已。但隨著時(shí)間的推移,VB.NET和C#之間的不同越來(lái)越明顯,比如對(duì)匿名類型(Anonymous Type)的處理就有著天壤之別。
為了支持類似哈希表的數(shù)據(jù)結(jié)構(gòu)和像分組這樣的查詢操作,由LINQ創(chuàng)建的匿名類型必須提供穩(wěn)定的哈希碼。而哈希碼通常是由對(duì)象里的字段(Field)來(lái)創(chuàng)建的。
早期的匿名類型版本是不穩(wěn)定的。換句話說(shuō),對(duì)象所包含的值可能會(huì)改變。而改變那些值的同時(shí)也改變了哈希碼,然后會(huì)破壞一些哈希表或者恰好儲(chǔ)存了對(duì)象的字典。
C#團(tuán)隊(duì)使得匿名類型穩(wěn)定下來(lái)。如果對(duì)象不能被改變,那么哈希碼也永遠(yuǎn)不變。通常這些穩(wěn)定的類型規(guī)則被放在非默認(rèn)的構(gòu)造器(Constructor)和只有Getter的屬性(Property)里。
而VB團(tuán)隊(duì)卻不想放棄修改匿名類的功能。Paul Vick這樣寫到:
盡管是有這樣的問(wèn)題存在,我們不想在潑水的時(shí)候把孩子也扔掉?,F(xiàn)在匿名類型某種程度上是受限的,因?yàn)樗鼈儾荒鼙幻?,但是將?lái)你可以用綁定來(lái)應(yīng)用它們,甚至在它們被聲明的上下文(Context)外面?,F(xiàn)在我們?cè)谂Φ囊恍┬绿匦?,比如有名字的匿名類型(Nominal Anonymous Type)和動(dòng)態(tài)接口,將來(lái)會(huì)使匿名類型更加有用。本身而言,要使匿名類型穩(wěn)定下來(lái)是不可想象的,特別是因?yàn)檫@會(huì)導(dǎo)致只有一條險(xiǎn)徑可走——也就是一旦它們穩(wěn)定了,在未來(lái)的某個(gè)時(shí)候,兼容性會(huì)使它想要再不穩(wěn)定變得異常困難,如果它們想要這么做的話。
VB團(tuán)隊(duì)選擇了一個(gè)相對(duì)復(fù)雜的方案,但這會(huì)給開(kāi)發(fā)者更多的靈活性。當(dāng)創(chuàng)建匿名類型時(shí),程序員可以用關(guān)鍵詞“Key”表示那些字段是穩(wěn)定的。另外要使屬性只讀的話,哈希碼函數(shù)會(huì)只用那些Key字段產(chǎn)生哈希碼。結(jié)果就是哈希碼保證是穩(wěn)定的。而且在被條件子句(Clause)用在聯(lián)合(Join)和分組(Group)里時(shí),字段可以被編譯器自動(dòng)地標(biāo)識(shí)成Key。
VB.NET和C#之所以能不同的實(shí)現(xiàn)方式是因?yàn)槟涿愋褪且粋€(gè)編譯器特性。CLR自己對(duì)匿名類型沒(méi)有什么概念,只是把它們看作有著自動(dòng)產(chǎn)生名字的普通類。
和VB其他的語(yǔ)法一樣,這個(gè)功能在Orcas Beta 2版本中才會(huì)提供。
【編輯推薦】