Las colecciones en Visual Basic se necesitan para almacenar un grupo de objetos o valores en una variable. Las colecciones estándar, como Collection, ArrayList y las colecciones genéricas List(Of T), ofrecen diferentes métodos para acceder, agregar y eliminar elementos, y difieren en seguridad de tipo, rendimiento y características.
En el clásico VB6 solo existía la colección tipada Collection. En .NET, surgieron estructuras más poderosas, entre las cuales se encuentra ArrayList (un tipo universal antiguo sin tipado estricto) y las modernas colecciones genéricas (Generic Collections) como List(Of T), que aparecieron en .NET 2.0.
La principal dificultad es elegir la colección adecuada para las necesidades del proyecto. Las colecciones sin tipado estricto (ArrayList, Collection) pueden llevar a errores en tiempo de ejecución o problemas de rendimiento. Las colecciones genéricas requieren parametrización, pero ofrecen la máxima seguridad y comodidad al trabajar con tipos.
Utiliza la antigua colección Collection solo para interactuar con código obsoleto, y para nuevos proyectos prefiere List(Of T). La colección ArrayList solo es útil cuando no se tiene información sobre el tipo de los elementos, pero para esto es mejor usar List(Of Object) u otras colecciones de Generic.
Ejemplo de código:
' Collection Dim coll As New Collection() coll.Add("Hello") coll.Add(123) ' ArrayList Dim arr As New ArrayList() arr.Add("World") arr.Add(456) ' List(Of T) Dim list As New List(Of Integer)() list.Add(789) list.Add(101112)
Características clave:
¿En qué se diferencia Collection de una matriz en Visual Basic?
Una matriz fija su tamaño al inicializarse, almacena elementos de un solo tipo y soporta acceso rápido por índice. Collection se incrementa dinámicamente, puede almacenar objetos de diferentes tipos y soporta acceso por clave (pero no es indexable en VB6).
¿Qué sucederá si intentas agregar un objeto con una clave duplicada a Collection?
Intentar agregar un elemento con una clave ya existente provocará un error en tiempo de ejecución "Key already exists in collection".
Dim c As New Collection() c.Add("one", "a") c.Add("two", "a") ' Error
¿Es posible convertir ArrayList a tipo List(Of T) de manera estándar?
No, la conversión normal no es posible: tendrás que crear manualmente un nuevo List(Of T) y copiar los elementos apropiados, de lo contrario surgirán errores de tiempo de ejecución debido a la falta de tipado estricto en ArrayList.
En un proyecto para almacenar clientes se utiliza ArrayList, donde accidentalmente se agregó una cadena en lugar de un objeto Client. Durante el procesamiento surge un error de conversión de tipo, que es difícil de rastrear.
Pros:
Contras:
Se utiliza un List(Of Client) tipado estrictamente, todo el código se compila con la opción Strict On. Los errores se detectan en tiempo de compilación, la estructura se puede ampliar fácilmente con nuevos métodos LINQ.
Pros:
Contras: