PDC 2008 : Visual Basic 10 (VB10) et les "Collections Initializer"

Voici une nouveauté sympa du compilateur de Visual Basic 10 (VB10), les "Collections Initializers" !

Supposons que nous souhaitions initialiser un List(Of Integer) avec des valeurs, voici le code classique que nous écrierions aujourd'hui :

Dim monTableau As New List(Of Integer)
monTableau.Add(2)
monTableau.Add(3)
monTableau.Add(4)
monTableau.Add(5) 

Et bien, avec Visual Basic 10, voilà ce qu'il suffira d'écrire pour obtenir la même chose :

Dim monTableau As New List(Of Integer) From {2, 3, 4, 5}

Notez l'utilisation du mot-clé From. Et ne vous y trompez pas, bien que cette syntaxe soit simple et très lisible, le compilateur va bien générer le premier code que vous auriez écrit dans l'assembly finale, à savoir :

.method private instance void Button1_Click(object sender, class [mscorlib]System.EventArgs e) cil managed
{
.maxstack 2
.locals init (
[0] class [mscorlib]System.Collections.Generic.List`1<int32> monTableau,
[1] class [mscorlib]System.Collections.Generic.List`1<int32> VB$t_ref$S0)
L_0000: nop
L_0001: newobj instance void [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
L_0006: stloc.1
L_0007: ldloc.1
L_0008: ldc.i4.2
L_0009: callvirt instance void [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
L_000e: nop
L_000f: ldloc.1
L_0010: ldc.i4.3
L_0011: callvirt instance void [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
L_0016: nop
L_0017: ldloc.1
L_0018: ldc.i4.4
L_0019: callvirt instance void [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
L_001e: nop
L_001f: ldloc.1
L_0020: ldc.i4.5
L_0021: callvirt instance void [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
L_0026: nop
L_0027: ldloc.1
L_0028: stloc.0
L_0029: ldarg.0
L_002a: callvirt instance class [System.Windows.Forms]System.Windows.Forms.ListBox Demos_VB10.Form1::get_ListBox1()
L_002f: ldloc.0
L_0030: callvirt instance void [System.Windows.Forms]System.Windows.Forms.ListControl::set_DataSource(object)
L_0035: nop
L_0036: nop
L_0037: ret
}

On voit parfaitement ici les 4 appels à la méthode Add. On peut également utiliser ceci avec des choses plus complexes :

Dim monDictonnaire As New Dictionary(Of Integer, String) From {
{1, "Valeur1"},
{2, "Valeur2"},
{3, "Valeur3"},
{4, "Valeur4"}
}

Alors, c'est-y pas cool ça ? :-)