C#和Visual Basic之匿名型別
為了支援類似雜湊表的資料結構和像分組這樣的查詢操作,由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-541453/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Visual Basic for ApplicationAPP
- c#中值型別和引用型別的區別C#型別
- C#學習筆記之值型別與引用型別C#筆記型別
- c#:值型別&引用型別C#型別
- C# Lambda表示式和linq表示式 之 匿名物件查詢接收C#物件
- C#引用型別和值型別在堆、棧中的儲存C#型別
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- 關於Java和C#的型別對比JavaC#型別
- c#入門-型別轉換和運算C#型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- JS專題之資料型別和型別檢測JS資料型別
- C#型別詳解C#型別
- C# 型別轉換C#型別
- C#快速入門教程(11)—— 字元和字串型別C#字元字串型別
- C#中常用集合型別C#型別
- Netcore webapi action swagger response返回引數使用匿名型別NetCoreWebAPISwagger型別
- C#學習 [型別系統] 型別轉換(11)C#型別
- C#快速入門教程(9)——浮點數、Decimal型別和數值型別轉換C#Decimal型別
- PHP 資料型別之檢視和判斷資料型別PHP資料型別
- C# 程式集、模組和型別概念及關係C#型別
- Visual Basic 6.0(VB6.0)詳細安裝過程
- Basic認證和Bearer Token認證的區別
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- C#學習 [型別系統] 基本型別介紹(10)C#型別
- 值型別和引用型別型別
- C#語法——元組型別C#型別
- C#集合型別大揭祕C#型別
- C#基礎資料型別C#資料型別
- 瞭解下C# 型別轉換C#型別
- 瞭解下C# 資料型別C#資料型別
- C# 中的動態型別C#型別
- C# 泛型集合的自定義型別排序C#泛型型別排序
- C#學習 [型別系統] 泛型(16)C#型別泛型
- C# 獲取PPT幻燈片背景型別和顏色C#型別
- C# 9.0 新特性之目標型別推導 new 表示式C#型別
- 重學c#系列——委託和匿名函式[二十五]C#函式
- Visual C++ 6.0專案檔案型別簡介C++型別
- JavaScript基本資料型別之undefined和nullJavaScript資料型別UndefinedNull
- Map和String型別之間的轉換型別