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


















