VB當中的新語法(一) - 匿名型別
上周跟大家介紹了LINQ在VB當中的應用之後,這次順帶介紹一下VB在這個版本中的改變,在VB 2008當中,配合LINQ新增了許多新的語法,底下這也是VB在建立物件時的新寫法:
Dim stud1 As New students With {.name = "David", .score = 100}
上述指令會建立一個students 物件的實體,並且填入預設的值。
這樣的寫法簡便不少,該物件的類別宣告如下:
Public Class students
'這邊應該寫成property, 只是我稍微偷懶一下寫成field,不影響demo
Public name As String
Public score As Single
End Class
上面黃色程式碼這樣的方式我們稱之為具名型別的物件宣告,既然,有具名型別,就一定會有匿名型別的宣告方式,語法如下:
Dim stud2 = New With {.name = "David", .score = 100}
這個就炫了吧,不用型別照樣可以宣告出一個物件實體,這個在VB 2008稱為匿名型別,其實和LINQ有相當大的關係,幹嘛搞出一個匿名型別呢? 它可以方便我們不需要事先建立一個類別,就可以具有物件實體,會有這樣的需求?
某些時候,我們只想要產生一個物件,並且隨手就拿來用了,我們可能懶的宣告一個物件的類別,然後再用New指令產生一個物件實體,也有時候我們只是希望建立一個臨時的物件來存放特定資料處理(查詢)之後的結果,最典型的例子就是LINQ(容後再述),因此匿名型別就應運而生了。
匿名型別並不特別也不神奇,實現的方式很簡單,Compiler 會自動依照你的需要,幫您建立一個類別Class,幫你自動決定類別中屬性的型態。這個自動建立的類別沒有名稱(因為是編譯階段自動建立的,所以沒名稱也不打緊,反正我們在程式碼當中也不會用到這個類別,只會用到這個類別產生的物件實體)、這個類別會直接繼承自 Object,並且包含您在宣告物件時指定的屬性。
這個特性是一個基礎,它讓LINQ查詢的結果可以自動建立成一個物件,例如我們在 2008年6月18日 星期三 介紹的LINQ功能中,有一段程式碼:
Structure BMI
Dim name As String
Dim height As Integer
Dim weight As Integer
Dim BmiValue As Single
End Structure
Dim matrix(5) As BMI
(...略...)
'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25
其中matrix是一個物件沒有錯,但是result是什麼型別? 怎麼出現的? LINQ查詢會建立出一個物件? 怎麼建立的呢? 關鍵就在匿名型別。
有了匿名型別這樣的技術作為基礎,LINQ的查詢結果(物件)就可以不需要事先建立一個特定類別作為存放查詢結果的資料型別。而可以透過編輯器自動產生這個類別,我們只需要直接把結果(物件)拿來用,因為我們在意的是這個查詢結果物件而非該類別本身。
不過這邊要注意,並非所有的LINQ查詢結果一定就需要建立一個匿名型別來存放,也有可能只需要系統內建的型別即可。
例如:
Dim result = From c In matrix Where c.BmiValue > 25 Select c.name
result 就只需要String型別即可。
anyway, 匿名型別確實讓開發人員在撰寫程式碼的時候有更多的可能性,也方便許多,同時間,你也會發現,編譯器暗地裡幫我們做了很多的事情...說到這個,下次有機會時來談談編譯器是怎麼看待LINQ指令的,你會發現VB2008的編譯器比過去忙碌了許多。
Dim stud1 As New students With {.name = "David", .score = 100}
上述指令會建立一個students 物件的實體,並且填入預設的值。
這樣的寫法簡便不少,該物件的類別宣告如下:
Public Class students
'這邊應該寫成property, 只是我稍微偷懶一下寫成field,不影響demo
Public name As String
Public score As Single
End Class
上面黃色程式碼這樣的方式我們稱之為具名型別的物件宣告,既然,有具名型別,就一定會有匿名型別的宣告方式,語法如下:
Dim stud2 = New With {.name = "David", .score = 100}
這個就炫了吧,不用型別照樣可以宣告出一個物件實體,這個在VB 2008稱為匿名型別,其實和LINQ有相當大的關係,幹嘛搞出一個匿名型別呢? 它可以方便我們不需要事先建立一個類別,就可以具有物件實體,會有這樣的需求?
某些時候,我們只想要產生一個物件,並且隨手就拿來用了,我們可能懶的宣告一個物件的類別,然後再用New指令產生一個物件實體,也有時候我們只是希望建立一個臨時的物件來存放特定資料處理(查詢)之後的結果,最典型的例子就是LINQ(容後再述),因此匿名型別就應運而生了。
匿名型別並不特別也不神奇,實現的方式很簡單,Compiler 會自動依照你的需要,幫您建立一個類別Class,幫你自動決定類別中屬性的型態。這個自動建立的類別沒有名稱(因為是編譯階段自動建立的,所以沒名稱也不打緊,反正我們在程式碼當中也不會用到這個類別,只會用到這個類別產生的物件實體)、這個類別會直接繼承自 Object,並且包含您在宣告物件時指定的屬性。
這個特性是一個基礎,它讓LINQ查詢的結果可以自動建立成一個物件,例如我們在 2008年6月18日 星期三 介紹的LINQ功能中,有一段程式碼:
Structure BMI
Dim name As String
Dim height As Integer
Dim weight As Integer
Dim BmiValue As Single
End Structure
Dim matrix(5) As BMI
(...略...)
'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25
其中matrix是一個物件沒有錯,但是result是什麼型別? 怎麼出現的? LINQ查詢會建立出一個物件? 怎麼建立的呢? 關鍵就在匿名型別。
有了匿名型別這樣的技術作為基礎,LINQ的查詢結果(物件)就可以不需要事先建立一個特定類別作為存放查詢結果的資料型別。而可以透過編輯器自動產生這個類別,我們只需要直接把結果(物件)拿來用,因為我們在意的是這個查詢結果物件而非該類別本身。
不過這邊要注意,並非所有的LINQ查詢結果一定就需要建立一個匿名型別來存放,也有可能只需要系統內建的型別即可。
例如:
Dim result = From c In matrix Where c.BmiValue > 25 Select c.name
result 就只需要String型別即可。
anyway, 匿名型別確實讓開發人員在撰寫程式碼的時候有更多的可能性,也方便許多,同時間,你也會發現,編譯器暗地裡幫我們做了很多的事情...說到這個,下次有機會時來談談編譯器是怎麼看待LINQ指令的,你會發現VB2008的編譯器比過去忙碌了許多。
留言