C#和Visual Basic漸行漸遠之匿名型別

iDotNetSpace發表於2009-04-01

在VB.NET和C#第一次被髮布時,很多人認為它們只是在語法和一些小的方面不一樣的相同語言而已。但隨著時間的推移,它們(C#和VB)之間的不同越來越明顯,比如對匿名型別(Anonymous Type)的處理就有著天壤之別。

為了支援類似雜湊表的資料結構和像分組這樣的查詢操作,由LINQ建立的匿名型別必須提供穩定的雜湊碼。而雜湊碼通常是由物件裡的欄位(Field)來建立的。

早期的匿名型別版本是不穩定的。換句話說,物件所包含的值可能會改變。而改變那些值的同時也改變了雜湊碼,然後會破壞一些雜湊表或者恰好儲存了物件的字典。

C#團隊使得匿名型別穩定下來。如果物件不能被改變,那麼雜湊碼也永遠不變。通常這些穩定的型別規則被放在非預設的構造器(Constructor)和只有Getter的屬性(Property)裡。

而VB團隊卻不想放棄修改匿名類的功能。Paul Vick這樣寫到:

儘管是有這樣的問題存在,我們不想在潑水的時候把孩子也扔掉。現在匿名型別某種程度上是受限的,因為它們不能被命名,但是將來你可以用繫結來應用它們,甚至在它們被宣告的上下文(Context)外面。現在我們在努力的一些新特性,比如有名字的匿名型別(Nominal Anonymous Type)和動態介面,將來會使匿名型別更加有用。本身而言,要使匿名型別穩定下來是不可想象的,特別是因為這會導致只有一條險徑可走——也就是一旦它們穩定了,在未來的某個時候,相容性會使它想要再不穩定變得異常困難,如果它們想要這麼做的話。

VB團隊選擇了一個相對複雜的方案,但這會給開發者更多的靈活性。當建立匿名型別時,程式設計師可以用關鍵詞“Key”表示那些欄位是穩定的。另外要使屬性只讀的話,雜湊碼函式會只用那些Key欄位產生雜湊碼。結果就是雜湊碼保證是穩定的。而且在被條件子句(Clause)用在聯合(Join)和分組(Group)裡時,欄位可以被編譯器自動地標識成Key。

VB和C#之所以能不同的實現方式是因為匿名型別是一個編譯器特性。CLR自己對匿名型別沒有什麼概念,只是把它們看作有著自動產生名字的普通類。

和VB其他的語法一樣,這個功能在Orcas Beta 2版本中才會提供。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-582438/,如需轉載,請註明出處,否則將追究法律責任。

相關文章