Curso de VisualBasic.NET.

Operadores.

Como bien sabrás, se dicen operadores a los símbolos aritméticos usados en matemáticas y por los cuales se pueden realizar operaciones aritméticas mediante números y letras.

Estas operaciones no solo se pueden aplicar a los números y letras, sino que también a las variables y constantes.Por ejemplo podemos sumar los valores de variables y asignarlos a otra variable:

Dim I as Integer = 20
Dim X as Double = 21.5
Dim suma as Double

Una vez declaradas, podemos realizar acciones matemáticas simples y complejas:

I + X = suma

Los operadores que utiliza Visual Basic.NET, son cualquier operador matemático simple. Pero para ecuaciones, fracciones, raíces y otras operaciones matemáticas más complejas, utilizan funciones matemáticas de la clase System.Math, que veremos más adelante.

Existen casos en que usamos el valor de una variable y luego, necesitamos asignarlo a la misma variable pero con otro valor; para esta acción se utilizan los operadores de incremento, muy famosos para los programadores de C, y que están disponibles para Visual Basic.NET. Siguiendo los ejemplos:

Suma +=10

Significa que ahora al valor suma le añadimos 1 decena a su valor original. Es decir que si suma = 41.5; después de aplicar el operador de incremento, su valor es 51.5.

Para construir un operador de incremento, solo hay que poner el signo matemático delante del igual (=). Ten en cuenta que la acción se realizará según el signo; si es negativo, restará, si multiplica, la multiplicación se realizara por el número asignado a la variable y el número que pongamos en la igualdad. Así nuestro ejemplo quedaría de la siguiente forma:

suma *=2

suma, valdría ahora 83. El nuevo valor, en todo caso, queda almacenado en la variable mencionada.

Función Val

¿Qué te hace pensar la expresión?:

error de conversión de CLR

A mi que no funcionará ya que el CRL de Visual Basic.NET, te dará un error de conversión:

Error de conversión por diferentes tipos

Puedes ver que he asignado la variable suma a una cadena alfanumérica. Pero sin embargo he declarado las variables del tipo Double e Integer, además de que la variable suma es tipo Double.

variables declaradas

Y en el Button4, las estoy intentando convertir directemente a un tipo alfanumérico totalmente distinto al de Double. Y eso no es posible sin pagar un precio.

Para poder evaluar una cadena de caracteres con números en su interior, tendremos que usar la función VAL. El problema de usar esta función es que dicha función evalúa el contenido de la cadena hasta que encuentra un carácter que no sea un dígito; entonces no podemos usar el identificador de la variable (es decir su nombre), ya que al detectar la primera letra se interrumpe la función de conversión.

Para que podamos actuar con esta función, deberemos introducir los valores numéricos de las variables de la forma siguiente:

suma = Val ("20.5 + 20")

O de esta otra forma que es la usada por los programadores:

establecer la función de conversión directamente

Que es lo mismo usar esta otra expresión:

otra forma de usar la suma

Entonces el uso de la expresión Val se deja solo para número que estén dentro de cadenas alfanuméricas del tipo String.

Pero el problema de la expresión: suma = Val ("20.5 + 20"),es que al llegar al signo + (los espacios en blanco no se tienen en consideración), la cadena deja de evaluarse, por lo que suma sería igual al valor de X. En este caso sería lo mismo hace que suma = X, o que suma = Val("20.5")

Si quisieramos que desde el button4 se evaluará todo el contenido, habría que dividir todo el sistema de la forma siguiente:

otra forma de proceder con val

Funciones de conversión

Las funciones de conversión son funciones establecidas por el lenguaje que convierten un tipo de dato en otro tipo de datos. En el punto anterior vimos la función Val que convierte un tipo de dato string numérico a su valor real para su uso.

La función por valor Val, por defecto, devuelve un tipo Double. En este ejemplo no tenemos problemas de compilación, porque, primero, tenemos Option Strict, en off, y segundo, la variable suma está declarada inicialmente como Double. ¿Qué pasaría si la variable suma fuese un Integer, por ejemplo, y tuviésemos Option Strict en On?

option strict activado

Pues que no nos dejaría el cambio del valor:

Option strict no permite usar otro tipo

Puedes ver que el corrector te da una pista para usar una función de conversión y poder usar ese tipo. CInt es una función que traduce los tipos de datos a Integer. Y si pulsas ejecutar en el Button4 cuando tienes el siguiente código MsgBox(suma), se produce la suma pero redondeada a 42, ya que el tipo Integer no soporta los decimales.

Función de conversión a integer

Existen más funciones de conversión que te detallo en la siguiente tabla:

Nombre de la Función

Tipo de dato que devuelve

Valores

CByte(expresión)

Byte

De 0 a 255.

CChar(expresión)

Char

Valor numérico de 0 a 65535.

CDate(expresión)

Date

Fecha u hora.

CDbl(expresión)

Double

Cualquier valor Double.

CDec(expresión)

Decimal

Cualquier valor Decimal.

CInt(expresión)

Integer

Cualquier valor Integer.

CLng(expresión)

Long

Cualquier valor Long.

CObj(expresión)

Object

Cualquier expresión valida.

CShort(expresión)

Short

Cualquier valor Short.

CSng(expresión)

Single

Cualquier valor Single.

CStr(expresión)

String

Depende del tipo de cadena.

CType(expresión)

Tipo

Segundo parámetro.

Val(expresión)

Double

Una cadena de caracteres.

Fix(expresión)

Depende del tipo de datos

Cualquier tipo de datos.

Int(expresión)

Depende del tipo de datos

Cualquier tipo de datos.

CBool (expresión)

Boolean

Cualquier valor numérico.

Tipos por valor y por referencia.

Los tipos por valor son la mayoría de los tipos de variables: es decir, Boolean, Byte, Char, DateTime, Decimal, Double, Guid, Short (Int16), Integer (Int32), Long (Int64), SByte, Single yTimeSpan.

Los tipos por valor almacenan los datos de las variables utilizadas en un área de la memoria RAM que se llama Pila.

En un tipo por valor las variables necesitarán el mismo número de Bytes máximo, sin tener en cuenta sus valores reales; esto significa que un tipo por valor de una variable Double, por ejemplo, almacenará 8 Bytes en la pila aunque su valor real en el proyecto ocupe 2 Bytes. Después el programa necesita buscar el valor de la variable, la debe buscar en la Pila, Por lo que cuanto más variables tenga declaradas el programa, más lento irá.

Los tipos por referencia, no tienen un tamaño fijo para sus variables establecidas, por ejemplo, una cadena alfanumérica podría variar de 2 bytes a cerca de toda la memoria del sistema. El tamaño de los tipos por referencia, significa que los datos que contienen están almacenados en el heap; por lo tanto, la dirección de memoria de un tipo por referencia dispone de un tamaño fijo y por tanto se puede almacenar en la Pila. Al almacenar una referencia en la pila, el programa ejecutara mucho más rápido que si se almacena un valor directamente. Veamos un ejemplo de cómo su usan los tipos por valor.

En un tipo por valor usando la estructura System.Drawing.Point:

Dim X as New System.Drawing.Point(10, 20)
Dim Y as New System.Drawing.Point Y = X Y
X.Y = 200
Textbox1.text = Y.ToString()

En un valor inicial, si ponemos entre comentario la tercera línea (X.Y=200), nos dará al ejecutar y escribir en el TextBox1, que X=10 e Y=20. Pero cuando quitamos la cuarta línea el comentario, X=200, Y=20.

Valor por referencia

En un sistema de coordenadas, necesitas 2 coordenadas para describir un punto. La variable X designa un punto del formulario (10,20); la variable Y al declararla no designa ningún punto en el formulario, sino que se lo asigna en la siguiente instrucción, al declarar Y = X está entendiendo el compilador que si la variable 10, 20 = X, si Y = X, entonces Y = 10, 20, por lo que en un System.Drawing.Point, eso equivale que X=10, y Y=20.

Cuando por la instrucción Y = X se copia el valor de X en Y, los datos contenidos en X se copiarán en una ubicación de la pila que esté asociada con Y. En la cuarta línea, al modificar X, la memoria de la pila asociada con X quedará modificada, no la otra asociada a Y, según muestra al ejecutar el programa.

Usando otra clase System.Text.StringBuilder, tenemos un ejemplo de tipo de referencia:

Dim X as New StringBuilder (“HOLA VBNET”)
Dim Y as New StringBuilder
Y = X
X. Replace(“VBNET”, “AMIGO”)
Textbox1.text = Y. ToString()

NOTA: Para que funcione este ejemplo, necesitarás importar la clase System.Text al inicio del proyecto.

importando clase

El resultado de este programa será HOLA AMIGO, pero tú has declarado HOLA VBNET. En el primer ejemplo, se ve que cuando un tipo por valor se asigna a otro, los datos almacenados en la pila se copian. De la misma manera, cuando Y se asigna a X en este último ejemplo, los datos asociados a X en la pila se copian en los datos asociados en Y, que también están en la pila. Sin embargo, lo que se copia en este caso no son los datos reales, sino la dirección del heap administrado, en donde están los datos reales almacenados. Un lio de cojones, lo sé.

Esto significa que Y e X hacen referencia a los mismos datos. Cuando se modifican los datos en el heap, se está modificando los datos en cada una de las variables que hacen referencias a la misma dirección de memoria.