Tipos de datos primitivos en Visual Basic. Declaración y asignación de variables

Veamos en la siguiente tabla los tipos de datos definidos en .NET Framework y los alias utilizados en Visual Basic 2010, así como el equivalente de VB6 que es la version que la mayoría han usado e incluso usan aún.

Quizá no te interese mucho conocer estas diferencias, pero bueno, seguramente habrá algún visitante a quien le sirvan e igual a nosotros nos ayudará a conocer los tipos de variables que usaremos en esta sección y sus principales diferencias.

Tipos de datos y equivalencia entre lenguajes

En la columna de equivalencias con VB6 tenemos algunos indicados con N.A., estos tipos no tienen equivalencia, por otro lado, los marcados con un asterisco (*) no tienen equivalencia directa, pero el o los tipos indicados serían los que más se aproximarían. El caso del tipo String es un caso especial, realmente un String de .NET es casi como uno de VB6, con la diferencia de que las cadenas en .NET son inmutables, es decir, una vez que se han creado no se pueden modificar y en caso de que queramos cambiar el contenido, .NET se encarga de usar la anterior y crear una nueva cadena, por tanto si usamos las cadenas para realizar concatenaciones (unión de cadenas para crear una nueva), el rendimiento es inferior al que teníamos en VB6, si bien existe una clase en .NET que es ideal para estos casos y cuyo rendimiento es, si no superior al menos parecido al de VB6: la clase StringBuilder.

Las últimas filas mostradas en la tabla son tipos especiales que si bien son parte del sistema de tipos comunes (CTS) no forman parte de la Common Language Specification (CLS), es decir la especificación común para los lenguajes "compatibles" con .NET, por tanto, si queremos crear aplicaciones que puedan interoperar con todos los lenguajes de .NET, esos tipos no debemos usarlos como valores de devolución de funciones ni como tipo de datos usado en los argumentos de las funciones, propiedades o procedimientos.

Los tipos mostrados en la tabla son los tipos primitivos de .NET y por extensión de Visual Basic 2010, es decir son tipos "elementales" para los cuales cada lenguaje define su propia palabra clave equivalente con el tipo definido en el CTS de .NET Framework. Todos estos tipos primitivos podemos usarlos tanto por medio de los tipos propios de Visual Basic, los tipos definidos en .NET o bien como literales. Por ejemplo, podemos definir un número entero literal indicándolo con el sufijo I: 12345I o bien asignándolo a un valor de tipo Integer o a un tipo Sytem.Int32 de .NET. La única excepción de los tipos mostrados en la tabla 1 es el tipo de datos Object, este es un caso especial del que nos ocuparemos en la próxima lección.

Sufijos o caracteres y símbolos identificadores para los tipos

Cuando usamos valores literales numéricos en Visual Basic 2010, el tipo de datos que le asigna el compilador es el tipo Double, por tanto si nuestra intención es indicar un tipo de datos diferente podemos indicarlos añadiendo una letra como sufijo al tipo, esto es algo que los más veteranos de VB6 ya estarán acostumbrados, e incluso los más noveles también, en Visual Basic 2010 algunos de ellos se siguen usando, pero el tipo asociado es el equivalente al de este nuevo lenguaje (tal como se muestra en la tabla), por ejemplo para indicar un valor entero podemos usar la letra I o el signo %, de igual forma, un valor de tipo entero largo (Long) lo podemos indicar usando L o &, en la siguiente tabla podemos ver los caracteres o letra que podemos usar como sufijo en un literal numérico para que el compilador lo identifique sin ningún lugar a dudas.

Sufijos para identificar los tipos de datos

El uso de estos caracteres nos puede resultar de utilidad particularmente para los tipos de datos que no se pueden convertir en un valor doble.

Por ejemplo, si queremos asignar este valor literal a un tipo Decimal: 12345678901234567890, tal como vemos en la figura de abajo, el IDE de Visual Basic 2010 nos indicará que existe un error de desbordamiento (Overflow) ya que esa cifra es muy grande para usarlo como valor Double.

Error de desbordamiento al intentar asignar un valor Double a una variable Decimal

Pero si le agregamos el sufijo D o @ ya no habrá dudas de que estamos tratando con un valor Decimal y no tendremos errores, como se puede observar en la imagen de abajo..

Error de desbordamiento al intentar asignar un valor Double a una variable Decimal Reparado

Tipos por Valor y Tipos por Referencia

Los tipos de datos de .NET los podemos definir en dos grupos:

Los tipos por valor son tipos de datos cuyo valor se almacena en la pila o en la memoria "cercana", como los numéricos que hemos visto. Podemos decir que el acceso al valor contenido en uno de estos tipos es directo, es decir se almacena directamente en la memoria reservada para ese tipo y cualquier cambio que hagamos lo haremos directamente sobre dicho valor, de igual forma cuando copiamos valores de un tipo por valor a otro, estaremos haciendo copias independientes.

Por otro lado, los tipos por referencia se almacenan en el "monto" (heap) o memoria "lejana", a diferencia de los tipos por valor, los tipos por referencia lo único que almacenan es una referencia (o puntero) al valor asignado. Si hacemos copias de tipos por referencia, realmente lo que copiamos es la referencia propiamente dicha, pero no el contenido.

Estos dos casos los veremos en breve con más detalle.

Inferencia de tipos

Una de las características nuevas en Visual Basic 2010 es la inferencia de tipos.

Se conoce como inferencia de tipos a la característica de Visual Basic para inferir el tipo de un dato al ser inicializado.

Para que la inferencia de tipos sea efectiva, deberemos activar la opción Option Infer a True, aunque por defecto, ese es el valor que tiene el compilador de Visual Basic. Sin embargo, si se hace una migración de una aplicación de Visual Basic a Visual Basic 2010, el valor de esta opción será False.

Supongamos por lo tanto, la siguiente declaración:

	
Dim datoDeclarado = 2010
	

En este ejemplo, la variable "datoDeclarado", será una variable de tipo Integer (Int32). Si deseamos cambiar el tipo de dato a un tipo Int64 por ejemplo, el compilador nos devolverá un error. Así, el siguiente ejemplo no será válido en Visual Basic 2010 con la opción de inferencia activada:

	
Dim datoDeclarado = 2010
datoDeclarado = Int64.MaxValue
	

Ahora bien, si cambiamos el valor de Option Infer a False, el mismo ejemplo será correcto.

¿Dónde está la diferencia? En este último caso, el caso de tener desactivada la opción de inferencia, la declaración de la variable datoDeclarado nos indica que es un tipo de dato Object en su origen, y que al darle un valor Integer, ésta funciona como una variable entera. Al cambiar su valor a Long, esta variable que es de tipo Object, cambia sin problemas a valor Long.

En todo este proceso, hay un problema claro de rendimiento con acciones de boxing y unboxing que no serían necesarias si tipáramos la variable con un tipo concreto.

Eso es justamente lo que hace la opción Option Infer por nosotros. Nos permite declarar una variable con el tipo inferido, y ese tipo de datos se mantiene dentro de la aplicación, por lo que nos da la seguridad de que ese es su tipo de dato, y que ese tipo de dato no va a variar.

¡Bueno ya! Sé que esto último fue un poco aterrador, pero no creo que haya otra forma de explicarlo, descuida que estaremos bien, no prestes mucha atención a esto si quieres. No olvides dejar tus comentarios y continuemos con con la siguiente sección (variables y constantes).