2013年10月1日 星期二

[vb.net] 變數初始值的指定

因為在 C# 用習慣了,換到 vb.net 有點卡卡的,原先用 vb6 又沒有這種語法。

基本型別是沒有什麼問題。

常常會忘記的就是物件的初始值指定、集合物件(collection, dictionary) 的內容值指定這兩件事。

所以寫下來備忘。

對於物件的初始值指定,是使用 With 關鍵字。在大括號裡給予初始值。

Class Apple
    Public Place As String
    Public weight As Integer
End Class

Dim a As Apple = New Apple With {.Place = "Taiwan", .weight = 1}

對於集合物件,則是使用 From 關鍵字。在大括號裡給予初始值。這東西要 VisualStudio 2010 之後才有支援(又多了一個使用 C# 的理由)。太長可以換行。

Dim PostLabel As Dictionary(Of String, String) = New Dictionary(Of String, String) From
    {
        {"Customer", "Forest"},
        {"Address", "Cali"},
        {"Code", "302"}
    }

Dim Box As Collection = New Collection From {"Apple", 2, {"Made", "HC, Taiwan"}, PostLabel, a}

不過,寫到這,我有的疑問,key / value pair 是用大括號加逗點,list 也是。

一下子,上面的 collection,不曉得 {"Made", "HC, Taiwan"} 這一項是怎麼解釋?

寫了個小程式測試一下

For Each obj In Box
    Console.WriteLine("Type:{0}", obj.GetType().Name)
Next

得到的結果是

Type:String
Type:Int32
Type:String
Type:Dictionary`2
Type:Apple

嗯,得到了一個 String 的型別?!

如果把該項換成 {"Made", "HC, Taiwan", "XX"},則會得到「型別初始設定式發生例外狀況」的錯誤。所以要記得這個特性才行。自己不要誤以為是正確的。

若是想要得到一個 string array,多出一組大括號,像是這樣

Dim Box As Collection = New Collection From {"Apple", 2, {{"Made", "HC Taiwan"}}, PostLabel, a}

得到的結果是

Type:String
Type:Int32
Type:String[]
Type:Dictionary`2
Type:Apple

但我想試著弄出 dictionary 來,試寫成

Dim Box As Collection = New Collection From {"Apple", 2, {{"Made", "HC Taiwan"}, {"Make", "TP Taiwan"}}, PostLabel, a}

得到錯誤

型別 '1-維陣列屬於 String' 的值無法轉換成 'String'。

所以目前還沒辦法隨心所欲呢。

沒有留言:

張貼留言