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