En inglés: Object initializers. Esto... bueno, esto es "lo más"
(o casi). Aunque en esta versión, al menos para Visual Basic, no estará con
todas las características que debería tener y por tanto, tendremos que
esperar a una nueva versión (pa variá), aunque los "afortunados" de C# si
que tendrán todas (o casi) las características de la inicialización de
objetos y colecciones.
Te explico, con la inicialización de objetos lo que puedes hacer es crear
un objeto, pero "inicializándolo" al mismo tiempo, es decir, crear un objeto
y asignarle los valores a las propiedades o campos públicos.
Y no te confundas, que lo mismo piensas que con New (el constructor) ya
lo podemos hacer. Pero no es lo mismo, veamos un par de ejemplos, para que
te "aclares".
Para este ejemplo vamos a usar una clase "Colega" muy simple:
Class Colega
Public Nombre As String
Public Correo As String
Public Telefono As String
Public Overrides Function ToString() As String
Return Nombre & ", " & Correo & " (" & Telefono & ")"
End Function
End Class
Si quieres crear un objeto y asignar, por ejemplo el nombre, tendrías que
hacer algo así:
Dim colega1 As New Colega
colega1.Nombre = "Pepe"
Pues con la inicialización de objetos, eso mismo lo puedes hacer así:
Dim colega2 = New Colega With {.Nombre = "Pepe"}
Es decir, usa With seguido de una llave de apertura y
asigna a las propiedades que quieras asignar los valores y después cierras
la llave.
Como ves, no hace falta que exista un constructor que reciba esos
parámetros, que sería lo que habría que hacer con Visual Basic 2005 (o
anterior).
Lo bueno, es que puedes inicializar cualquiera de las propiedades (o
campos públicos, como en este caso), que defina la clase (o tipo). Por
ejemplo, si solo quieres inicializar el nombre y el teléfono, puedes hacerlo
así:
Dim colega3 = New Colega With {.Telefono = "555-5555-555", .Nombre = "Pepe"}
El orden en el que indiques las "propiedades" no es importante.
Lo que si es importante es que esas propiedades sean de "escritura", es
decir, no se pueden inicializar propiedades de solo lectura. Al menos en
esta versión, y según dice Paul Vick, habrá que esperar hasta la próxima
versión (10 o VBx).
Esta es otra característica que Visual Basic 9.0 no tendrá... pero que C#
3.0 si que tiene.
Por ejemplo, si quieres inicializar un array de tipo Integer, en C# lo
puedes hacer así:
var numeros = new[] { 1, 2, 4, 6, 5, 7, 8, 9 };
Pero en Visual Basic, lo más que puedes hacer es esto:
Dim numeros = New Integer() {1, 2, 4, 6, 5, 7, 8, 9}
Con C# también puedes inicializar asignando objetos, por ejemplo, para declarar e inicializar
una colección:
var lista = new List<Colega> { new Colega{ Nombre="Pepe"},
new Colega{ Nombre ="Guille"} };
Aunque en Visual Basic puedes usar la función CrearLista, y el código
será muy parecido:
Dim lista = CrearLista(New Colega With {.Nombre = "Pepe"}, _
New Colega With {.Nombre = "Guille"})
Por supuesto, CrearLista no existe en el lenguaje, pero la puedes definir
de esta forma:
Function CrearLista(Of T)(ByVal ParamArray items() As T) As List(Of T)
Return New List(Of T)(items)
End Function
Y te servirá para iniciar objetos del tipo List(Of loquesea),
no es lo mismo que en C#, pero... hace el trabajo.
Nota:
El código de CrearLista está "basado/traducido"
de en un código de
Bill
McCarthy, un colega MVP de Visual Basic,
en su sitio tiene otra versión de esa función.
(Lo de "traducido" es porque la función
original se llamaba MakeList, je, je).
Ir al índice de las
novedades de Visual Basic 2008 (VB 9.0)