Cómo: Definir colecciones con seguridad de tipos

Actualización: noviembre 2007

Puede definir y crear una colección utilizando la clase Collection proporcionada por Visual Basic, como muestra el ejemplo siguiente.

Public Class widgetRepository
    Public widgetColl As New Microsoft.VisualBasic.Collection()
    ' Insert code to implement additional functionality.
End Class

Sin embargo, esta colección widgetColl no dispone de establecimiento inflexible de tipos. En ella puede agregar cualquier tipo de elemento, no sólo objetos widget. Cuando recupera un elemento, puede que deba intentar convertirlo en widget. Esto puede conducir a problemas de seguridad de tipos. Por ejemplo, suponga que agrega un objeto tipo String a la colección con el código siguiente.

Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)

En este caso, un intento posterior de recuperar dicho elemento produce una excepción ArgumentException en tiempo de ejecución ya que el elemento de la colección no es del tipo widget.

Protección contra los problemas de seguridad de tipos

Recomendamos que aumente la seguridad de tipos definiendo una clase genérica. Así se exige el establecimiento inflexible de tipos se consigue flexibilidad en el tipo de datos concreto con el que trabaja. Para obtener más información, vea Tipos genéricos en Visual Basic.

Para definir una colección con seguridad de tipos en una clase

  • Utilice una de las clases genéricas en el espacio de nombres System.Collections.Generic, por ejemplo List<T>, para la clase de colección. A continuación, puede crear una colección que se restringe a los miembros widget. El ejemplo siguiente muestra cómo se podría modificar la declaración del ejemplo anterior para crear una colección genérica.

    Public widgetColl As New System.Collections.Generic.List(Of widget)
    

    En este caso, el establecimiento inflexible de tipos sólo permite agregar elementos widget a la colección y cada elemento que se recupera por medio de la propiedad Item es un objeto widget. Debido al establecimiento inflexible de tipos, el código de recuperación también puede utilizar todas las propiedades y los métodos expuestos por widget.

    O bien

  • Cree su propia clase de colección sin utilizar ninguna clase predefinida. Restrinja el método Add para que sólo acepte objetos widget e implemente la propiedad Item con un tipo de valor devuelto de widget. Para obtener más información, vea Cómo: Definir colecciones con seguridad de tipos.

    Si Item devuelve elementos de tipo Object, sólo tendría acceso explícito a las propiedades y métodos definidos en la clase Object. Para tener acceso a los miembros de widget, debería activar Option Strict Off o utilizar CType (Función) para convertir de forma explícita el elemento devuelto a widget, como en el código siguiente.

    Dim nextWidget As widget
    Try
        nextWidget = CType(widgetColl.Item(1), widget)
    Catch ex As Exception
        ' Insert code to run if the collection item is not a widget.
    End Try
    

    En cualquiera de los casos, si utiliza los elementos Object de esta manera, Visual Basic emplea el enlace en tiempo de ejecución, lo que reduce el rendimiento.

    Tenga en cuenta que la clase Collection de Visual Basic acepta y devuelve elementos Object, por lo que también tiene las desventajas de los tipos flexibles y el enlace en tiempo de ejecución.

Vea también

Conceptos

Clase de colección de Visual Basic

Colecciones en Visual Basic

Tipos genéricos en Visual Basic

Referencia

System.Collections

System.Collections.Generic

System.Collections.Specialized

Option Strict (Instrucción)