Clase de colección de Visual Basic
Una colección es una forma de agrupar un conjunto de elementos relacionados. Existen muchos tipos diferentes de colecciones. Las colecciones predefinidas se utilizan en las aplicaciones de Visual Basic para muchos propósitos, por ejemplo la colección Control.ControlCollection de un objeto Form, que se devuelve de la propiedad Controls del formulario. También puede crear sus propias colecciones para organizar y manipular los objetos.
Las colecciones son un buen método para hacer un seguimiento de los objetos que una aplicación puede necesitar crear o destruir dinámicamente. En el fragmento de código siguiente se muestra cómo se puede usar el método Add de un objeto Visual Basic Collection para mantener una lista de objetos widget que el usuario ha creado.
' Declare and create the Collection object.
Public widgetColl As New Microsoft.VisualBasic.Collection()
' Create a new widget and add it to the widgetColl collection.
Private Sub makeAWidget()
Dim tempWidget As New widget()
widgetColl.Add(tempWidget)
End Sub
En el ejemplo anterior, la colección widgetColl organiza y expone todos los objetos widget creados a través del procedimiento makeAWidget. Se pueden recuperar referencias a objetos para cada widget a través del índice de la colección. El tamaño de la colección se ajusta automáticamente cada vez que se agrega un nuevo objeto widget. Puede utilizar Instrucción For Each...Next (Visual Basic) para repetir la acción a lo largo de la colección. Si desea asignar al objeto widget una clave mediante la que se pueda recuperar dicho objeto, puede proporcionar una cadena de texto como el segundo parámetro del método Add.
El objeto Collection de Visual Basic almacena todos sus elementos como de tipo Object, por lo que es posible agregar un elemento de cualquier tipo de datos. No hay ningún método de protección contra los tipos de datos inadecuados que se agreguen. Para evitar esta limitación, puede utilizar las colecciones genéricas del espacio de nombres System.Collections.Generic. Para obtener más información, vea Cómo: Crear una colección de objetos (Visual Basic).
Crear y destruir un objeto de colección
La palabra clave New (Operador, Visual Basic) en la declaración de la variable widgetColl produce un objeto Collection que se va a crear cuando el control pasa a la instrucción de declaración. Como Collection es una clase y no un tipo de valor, debe crear una instancia de la misma y mantener una referencia a esa instancia en una variable. Esta instancia es un objeto Collection de Visual Basic.
Como cualquier otro objeto, un objeto Collection se marca para la recolección de elementos no utilizados (GC) cuando la última variable que contiene una referencia a él se establece en Nothing (Visual Basic) o sale del ámbito. Todas las referencias a objetos que contiene se liberan cuando la reclama una recolección de elementos no utilizados. Por este motivo, la variable widgetColl del ejemplo anterior se declara en la clase principal para que exista a lo largo de la vida del programa.
Una colección mantiene las referencias a los objetos que controla pero no contiene los objetos en sí. Al destruir un objeto Collection, por consiguiente, no se destruyen los objetos que controla. Cada objeto individual que había sido un elemento de la colección continúa existiendo hasta que se marque individualmente para la recolección de elementos no utilizados.
Trabajar con elementos
Los servicios básicos de agregar, eliminar y recuperar elementos de una colección dependen de claves e índices. Una clave es un valor String. Podría ser un nombre, un número de permiso de conducción, un número de teléfono o simplemente un entero convertido en una cadena. El método Add le permite asociar una clave a un elemento, tal como se describe en Cómo: Agregar, eliminar y recuperar los elementos de una colección (Visual Basic).
Un índice en la clase Collection es un entero entre 1 y el número de elementos de la colección. La propiedad Count devuelve el número actual de elementos. Se puede controlar el valor inicial del índice de un elemento mediante los parámetros Before y After, cuando llama a Add, pero su valor puede cambiar cuando se agregan o eliminan otros elementos. Para obtener más información, vea Add.
Puede quitar un elemento único de una colección pasando su clave o su índice al método Remove. Puede vaciar una colección y quitar todos los elementos con el método Clear.
Tener acceso a elementos
Puede pasar un valor clave al método Contains para probar si una colección contiene un elemento con esa clave. Puede recuperar un elemento pasando su clave o su índice a la propiedad Item.
Puede utilizar valores de índice y la propiedad Item para recorrer en iteración los elementos de una colección o puede utilizar Instrucción For Each...Next (Visual Basic). El ejemplo siguiente muestra dos maneras de aplicar una subida del 10 por ciento a todos los empleados de una colección de objetos employee, suponiendo que la variable employeesColl contiene una referencia a un objeto Collection.
Option Strict On
' The following alternative uses the Count and Item properties.
Dim emp As employee
For counter As Integer = 1 To employeesColl.Count
emp = CType(employeesColl.Item(counter), employee)
emp.payRate *= 1.1
Next counter
' The following alternative uses the For Each...Next statements.
For Each emp As employee In employeesColl
emp.payRate *= 1.1
Next emp
Sin embargo, si ha agregado uno o más elementos a employeesColl que no son de tipo employee, el bucle For Each produce una excepción ArgumentException en tiempo de ejecución.
Tipo de datos de elementos
Un objeto Collection de Visual Basic almacena cada elemento con el tipo de datos Object. Por consiguiente, el intervalo de tipos de datos que puede agregar a un objeto Collection es igual al intervalo de tipos de datos que puede almacenar en una variable Object. Ésta incluye tipos de datos estándar, objetos y matrices, así como estructuras definidas por el usuario e instancias de clase.
Como el objeto Collection almacena los elementos como Object, la propiedad Item devuelve un valor Object. Para utilizar el elemento en su código, debe convertir normalmente de Object al tipo de datos en tiempo de ejecución del elemento. La manera de hacerlo depende de la configuración del modificador de comprobación de tipos en Option Strict (Instrucción).
Conversión implícita desde el objeto
Si Option Strict es Off, puede convertir un elemento de Collection implícitamente a su tipo de datos adecuado, tal como se muestra en el ejemplo siguiente.
Option Strict Off
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = sampleColl.Item(1)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
Conversión explícita desde el objeto
Si Option Strict es On, debe convertir explícitamente desde Object al tipo de datos en tiempo de ejecución del elemento. Para obtener un elemento de Item de esta manera, puede utilizar CType (Función) (Visual Basic) para realizar la conversión, tal como se muestra en el ejemplo siguiente.
Option Strict On
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = CType(sampleColl.Item(1), String)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
Servicios adicionales
Los métodos y propiedades del objeto Collection proporcionan solamente los servicios más básicos para colecciones. Por ejemplo, el método Add no puede comprobar el tipo de un elemento que se agrega a una colección, comprobación que puede resultar deseable para asegurarnos de que la colección contiene únicamente una clase de elementos. Si puede garantizar esto en el método Add, tiene una colección con establecimiento inflexible de tipos y no tiene que convertir el valor devuelto de la propiedad Item a su tipo de datos en tiempo de ejecución. Esto mejora el rendimiento.
Puede proporcionar una funcionalidad más robusta (y propiedades, métodos y eventos adicionales) creando su propia clase de colección, tal como se describe en Cómo: Definir colecciones en clases propias (Visual Basic).