Visual Basic 9.0 って、どんなんかーなぁー♪ その2。- Object and Array Initializers -
なんだか深みにはまっていますが・・・今回はAnonymous Types (匿名型)です。
まずはフンイキから。
Dim torikobito = New With {.ID = 76, .Name = "とりこびと"}
もうね、なんのこっちゃわかりませんね。変数 torikobito の型は何なんですか?
変数 torikobito:「あの~、すみません。匿名でお願いします!!(汗」
・・・匿名型です。Visual Basic のコンパイラは、宣言の右側から以下のようなクラスを作成します。Object Initializer による推測っぽいですね。
Class _ID_As_Integer_Name_As_String_
Public Property ID As Integer
Public Property Name As String
End Class
あまりに不思議すぎて、いろいろやってみたくなったのでMicrosoft Visual Basic Codename Orcas Express Edition(バージョン情報で見るとMicrosoft
Visual Studio Codename Orcas Version 9.0.20404.0 Beta1になってる)で、ゴソゴソしてみました。
で、前回のを踏まえると、
Option Strict Off
Option Infer On
Public Class Program
Public Shared Sub Main()
Dim members() = { _
New With {.ID = 12, .Name = "επιστημη"}, _
New With {.ID = 28, .Name = "アクア"}, _
New With {.ID = 33, .Name = "刈歩 菜良"}, _
New With {.ID = 51, .Name = "ぽぴ王子"}, _
New With {.ID = 56, .Name = "シャノン"}, _
New With {.ID = 76, .Name = "とりこびと"}, _
New With {.ID = 95, .Name = "片桐 継"} _
}
End Sub
End Class
例によってOption Strict Offなのですがw
一見、わんくまお笑い同盟のメンバーに見えますが、匿名型での配列の宣言です。
Array Initializer がまだ未実装らしいので、とりあえず、変数 members はObject型の配列になりました。
で、以下の様子。
Option Strict Off
Option Infer On
Public Class Program
Public Shared Sub Main()
Dim members() = { _
New With {.ID = 12, .Name = "επιστημη"}, _
New With {.ID = 28, .Name = "アクア"}, _
New With {.ID = 33, .Name = "刈歩 菜良"}, _
New With {.ID = 51, .Name = "ぽぴ王子"}, _
New With {.ID = 56, .Name = "シャノン"}, _
New With {.ID = 76, .Name = "とりこびと"}, _
New With {.ID = 95, .Name = "片桐 継"} _
}
For Each member In members
Console.WriteLine("ID:{0} Name:{1}", member.ID.ToString, member.Name)
Next
End Sub
End Class
なにげにコードをお見せしていますが、members がObject型の配列なので、For Each のループ コントロール変数 member はObject 型です。なので
Console.WriteLine("ID:{0} Name:{1}", member.ID.ToString, member.Name)
member.ID とか、member.Name とかはインテリセンスに表示はされません。でも、実行すると以下のように出力に成功します。
ID:12 Name:επιστημη
ID:28 Name:アクア
ID:33 Name:刈歩 菜良
ID:51 Name:ぽぴ王子
ID:56 Name:シャノン
ID:76 Name:とりこびと
ID:95 Name:片桐 継
えっと・・・、すでにリアクションがとりづらいのですが(苦
完全に遅延バインディングモード全開です。全開なので配列の要素の型がバラバラでもメンバの呼び出しが可能です。
といっても、Array Initializer がまだ未実装らしいですし、リリース前なので今後変更になる可能性があります。っていうか、なると思います。っていうか、なってください。お願いします。なので、鵜呑みは禁物ですよ!