End Module
Below is the list of conversion functions which we can use in VB .NET.
CBool - use this function to convert to Bool data type
CByte - use this function to convert to Byte data type
CChar - use this function to convert to Char data type
CDate - use this function to convert to Date type
CDbl - use this function to convert to Double data type
CDec - use this function to convert to Decimal data type
CInt - use this function to convert to Integer data type
CLng - use this function to convert to Long data type
CObj - use this function to convert to Object type
CShort - use this function to convert to Short data type
CSng - use this function to convert to Single data type
CString - use this function to convert to String data type
Attributes
Attributes are those that lets us specify information about the items we are using in
VB .NET. Attributes are enclosed in angle brackets(< >) and are used when VB .NET
needs to know more beyond the standard syntax.
File Extensions in VB .NET
The files and their extensions which are created as part of the Windows Application
Project and their meaning are summarized below:
.vbproj->A Visual Basic project
Form1.vb->A form's code
AssemblyInfo.VB->Information about an assembly, includes version information
.vbproj.user->Stores project user options
.sln->Solution file which stores solution's configuration
.suo-> Stores Solution user options
Form1.resx.NET->XML based resource template
bin directory->Directory for binary executables
obj directory->Directory for debugging binaries
Language Terminology
Briefly on some terminology when working with the language:
Module: Used to hold code
Variable: A named memory location of a specific data type used to hold some value
Procedure: A callable series of statements which may or may not return a value
Sub-Procedure: A procedure with no return value
Function: A procedure with return value
Methods: A procedure built into the class
Constructor: Special method used to initialize and customize the object. It has the
same name as the class
Class: An OOP class which contains data and code
C#
switch (<condicin>)
{
'...
//...
'...
break;
Case Else
'...
//...
break;
End Select
default:
//...
break;
}
'...
case 1:
Case 2, 3, 4
//...
'...
break;
Case Else
case 2:
'...
case 3:
End Select
case 4:
//...
break;
default:
//...
Case 1
'...
Case 2 To 4
break;
}
'...
Case Else
'...
End Select
Adems en Visual Basic se pueden usar varios valores en cada Case, separndolos
con comas, y esos valores pueden ser expresiones de cualquier tipo, adems de
poder usarse variables, etc., es decir, cualquier cosa que produzca un valor del
tipo esperado.
En Visual Basic, para indicar valores que requieran los operadores de comparacin
debemos usar Is, por ejemplo, para indicar que el valor sea mayor que 7, lo
haremos con: Case Is > 7.
Y si queremos que est dentro de un rango de valores, podemos usar To, en el
ejemplo anterior hemos usado 2 To 4 para indicar los valores entre 2 y 4, pero
tambin podemos combinar varias expresiones, por ejemplo:
Case 2 To 4, 9 To 12, Is > 99, Is < 299
En este caso se tendran en cuenta todos los valores posibles indicados en esas
expresiones. Como puedes comprobar, no podremos usar los operadores And, Or,
etc., en su caso podemos usar varios Is.
ATENCIN:
Si usas Is < 299 debes tener en cuenta que esa condicin se evala de
forma independiente de las dems, por tanto el caso anterior, (si solo
quieres valores hasta 299), lo puedes escribir solo con la ltima
condicin:
Case Is < 299
Ya que si no cumple ninguna de las anteriores, se evaluar esa, por tanto,
si, por ejemplo, el valor de la condicin indicada en Select Case fuese 8,
tambin se evaluara, ya que es menor de 299.
Pero el "problema" va a ms y en el ejemplo Case 2 To 4, 9 To 12, Is >
99, Is < 299, en realidad "capturar" cualquier valor, ya que si se
cumple el Is > 99 tambin se capturarn valores mayores de 298.
Por tanto, aunque en un Case puedas poner varias expresiones, debes
ser consciente de que es lo que "realmente" ests haciendo... y no
"pensar" que es lo que "supuestamente" ests haciendo.
Por ltimo decir que como en Visual Basic los dos puntos se utilizan como
separador de instrucciones en una misma lnea, podemos usar los dos puntos
para separar instrucciones Case, estn o no en la misma lnea.
Case 2:
Case 3:
Case 2 : Case 3
Otra cosa a tener en cuenta (adems de la advertencia anterior), es que cada
C#
<resultado> = (int)<expresin>
<resultado> = CType(<expresin>,
Integer)
<resultado> = CType(<expresin>,
<resultado> = (double)<expresin>
Double)
Aqu te muestro solo dos casos, pero para el resto sera lo mismo, las otras
instrucciones de conversin son:
CBool, CByte, CChar, CDate, CDec, CLng, CObj, CSByte, CShort, CSng,
CStr, CUInt, CULng, CUShort.
Algunas de estas, como CSByte y las tres ltimas, solo estn disponibles en
Visual Basic 2005, ya que sirven para convertir a tipos que se definen por
primera vez en esa versin de Visual Basic.
En todos los casos siempre puedes usar CType(<expresin>, <tipo>) para
realizar la misma conversin.
Y como has visto en el cdigo de C#, en ese lenguaje siempre se usa de la
misma forma: (<tipo>)<expresin>, es decir, encerrando entre parntesis el
tipo y anteponindolo a la expresin a convertir.
En Visual Basic, adems de CType, tambin podemos usar, (al menos para
convertir expresiones a tipos por referencia), las instrucciones DirectCast y
TryCast. Si sabemos que estamos trabajando con tipos por referencia estas
ltimas son preferibles a CType, ya que tienen mejor rendimiento.
DirectCast en realidad sirva para convertir cualquier tipo de datos, pero
siempre que haya alguna relacin de herencia o de implementacin de
interfaces.
TryCast, (que est disponible en Visual Basic 2005 y posterior), se usa solo
con tipos por referencia, y se usa normalmente comprobando si el valor que
devuelve no es nulo (Nothing).
En todas las conversiones, excepto con TryCast, si la conversin no se puede
hacer, se produce una excepcin del tipo InvalidCastException, con
TryCast, si no se puede hacer la conversin "simplemente" se devuelve un
valor nulo.
Lo puedes convertir a este otro, en el que se usan sobrecargas para tener las
tres posibilidades que nos da el cdigo anterior:
Public Shared Sub PruebaOptional(ByVal uno As Integer)
PruebaOptional(uno, 0, True)
End Sub
Como ves, cuando definimos un parmetro con Optional, ese parmetro debe
tener un valor predeterminado, que ser el que se use cuando no se indique, y
eso es lo que podemos hacer al definir las sobrecargas: llamamos al mtodo
que recibe todos los parmetros, pero usando los que debera tener si no se
indican esos parmetros.
Si usamos parmetros opcionales, estos deben aparecer despus de los que no
son opcionales.
Lo que NO debes hacer es mezclar parmetros opcionales con sobrecargas, ya
que en algunos casos el propio compilador te indicar que algo anda mal en
ese cdigo porque hay conflictos, ya que un parmetro Optional es opcional,
pero tambin puede que se indique al llamar al mtodo, por tanto, en algunos
casos no ser opcional, sino que se usar.
En C#, el cdigo anterior de las sobrecargas, lo definiremos de esta forma:
public static void PruebaOptional(int uno) {
PruebaOptional(uno, 0, true);
}
ParamArray, pero este ltimo debe aparecer despus de todos los Optional
que tengamos.
Tanto en Visual Basic como en C#, el array de parmetros opcionales debe
estar despus de los parmetros que no son opcionales.
Nota:
No debemos confundir los parmetros por referencia con los
tipos por referencia, ya que un parmetro por referencia puede
ser de un tipo por valor, como Integer o Double.
De hecho, cuando usamos tipos por referencia, no es necesario
usar la instruccin ByRef para poder modificar el contenido de
ese parmetro, ya que al ser un tipo por referencia, lo que se
pasa es precisamente una referencia a la direccin de memoria
en la que est dicho objeto, por tanto siempre tendremos
acceso al contenido.
Debido a la forma que Visual Basic trata las declaraciones de las variables, en
teora no se podran usar parmetros de tipo out, por tanto el equivalente ms
directo en C# es ref. Pero ambos parmetros se pueden "simular" en Visual
Basic por medio de ByRef.
A la hora de usar los mtodos con parmetros por referencia, la diferencia
entre los dos lenguajes, es que en C# siempre tenemos que usar la instruccin
out o ref que corresponda con la definicin del parmetro, mientras que en
Visual Basic no se debe usar la instruccin ByRef para usar un mtodo que
espere valores por referencia.
Veamos un mtodo que recibe parmetros por valor y por referencia y cmo lo
definiramos en los dos lenguajes:
Public Shared Sub PruebaRef(ByRef uno As Integer, ByVal dos As
Integer)
' Esta asignacin afectar al parmetro
uno += dos
' Esta no afectar al valor usado como segundo argumento
dos = 999
End Sub
Curso de iniciacin a la
programacin
con Visual Basic .NET
Entrega nmero siete, (06/Dic/2002)
Publicada el 06/Dic/2002
En esta entrega veremos otra forma con la que podemos escoger entre varias opciones.
Hasta ahora hemos usado las instrucciones IF / Then / Else, pero Visual Basic pone a
nuestra disposicin la instruccin Select Case con la que podemos elegir entre varias
opciones y en la versin .NET nos facilita un poco las cosas, al menos con respecto a como
se usaba en las versiones anteriores de Visual Basic, esto lo comprobaremos en cuanto
veamos una nueva forma de crear constantes.
Empecemos con la instruccin Select Case.
Esta instruccin se usa de la siguiente forma:
Select Case <expresin a evaluar>
Case <lista de expresiones>
' ...
Case <otra lista de expresiones>
' ...
Case Else
' si no se cumple ninguna de las listas de expresiones
End Select
Despus de Select Case se pondr una expresin a evaluar, es decir lo que queremos
comprobar si se cumple o no, esto es lo mismo que hacemos con el If <expresin a
evaluar> Then; lo que diferencia al Select Case del If... Then es que con el If... Then si
queremos hacer varias comprobaciones, tendremos que usar diferentes If... Then con varios
ElseIf..., mientras que con el Select Case, cada una de las cosas que queremos comprobar lo
ponemos en los distintos Case... cmo? que no te enteras?, vale, vemoslo con un
ejemplo.
Supongamos que queremos comprobar si el contenido de la variable i tiene distintos valores
y segn esos valores tendremos que hacer una cosa u otra.
Si lo hiciramos usando If... Then, tendramos que escribir algo como esto:
If i = 3 Then
'
ElseIf i > 5 AndAlso i < 12 Then
'
ElseIf i = 14 OrElse i = 17 Then
'
ElseIf i > 25 Then
'
Else
'
End If
Como podemos comprobar, despus de Select Case ponemos lo que queremos tener en
cuenta, en este caso es el contenido de la variable i, cuando queremos comprobar si es igual
a 3, simplemente ponemos el 3, lo mismo hacemos cuando queremos hacer algo para el
caso de que el valor sea 14 o 17, pero en este caso simplemente especificamos los valores
que queremos comprobar separados por comas, podemos poner tantos como necesitemos.
Si queremos comprobar un rango de valores, por ejemplo que el valor de i estuviera entre 5
y 12 (mayor que 5 y menor que 12), podemos hacerlo de esta forma: usamos 6 To 11, es
decir queremos que esa condicin se cumpla cuando el valor de i tenga un valor de 6 a 11.
Cuando queremos comprobar si el valor es mayor (o cualquier otra comprobacin),
usaremos Is, como en el caso de Is > 25, esto es lo mismo que comprobar si i es mayor que
25.
Por ltimo, si ninguno de esos casos se cumple, se ejecutar lo que est a continuacin de
Case Else, que funciona igual que el Else ltimo que tenemos en el bloque If... Then.
Como vemos, funciona casi igual que con If... Then, pero de una forma algo ms ordenada,
la nica pega es que slo podemos evaluar una expresin, mientras que con If podemos
usar tantas como queramos... precisamente por eso existen estas dos posibilidades... cuando
una no es vlida, podemos usar la otra.
Adems de expresiones simples, en Select Case podemos indicar cualquier expresin
vlida, siempre que el resultado de esa expresin sea comparable con un valor, el cual, a su
vez, producir un valor verdadero o falso.
Estas expresiones, pueden ser tanto numricas como de cadenas de caracteres.
No voy a dar ahora ms ejemplos, ya que a lo largo de este curso de iniciacin a la
programacin de Visual Basic .NET tendremos ocasin de ver ms de un ejemplo del uso
de Select Case (e incluso de If... Then), as que no te impacientes y si quieres ver ejemplos
de Select Case, te invito a que le eches una ojeada a la documentacin de Visual Studio
.NET, que es bastante amplia y en algunos casos, hasta fcil de comprender... (bueno, slo
en algunos casos, ya que si siempre fuese tan "clara", para que escribir nada que lo
aclare...?)
Bien, sigamos nuestro aprendizaje, ahora vamos a ver esa otra forma de crear constantes
que mencion al principio.
Me estoy refiriendo a:
Las declaraciones de las enumeraciones hay que hacerla fuera de cualquier procedimiento,
por ejemplo dentro de una clase o un mdulo, pero tambin pueden estar declarados dentro
de un espacio de nombres, todo depender de la cobertura (o amplitud de acceso) que
queramos darle. Adems podemos poder darle las propiedades pblica, privada, etc., como
siempre, esto influir en los sitios desde los que podemos usar esa enumeracin.
Los valores que pueden tener los miembros de una enumeracin, pueden ser cualquiera de
los que un tipo numrico de tipo entero pueda tener. Por defecto el tipo es Integer, pero las
enumeraciones tambin pueden ser de tipo Byte, Long o Short, para poder especificar un
tipo diferente a Integer, lo indicaremos usando As Tipo despus del nombre de la
enumeracin.
Por defecto, el primer valor que tendr un elemento de una enumeracin ser cero y los
siguientes elementos, salvo que se indique lo contrario, tendrn uno ms que el anterior.
En el ejemplo mostrado, el elemento rojo, valdr 1, azul valdr 2 y verde tendr un valor 3.
Para poder cambiar esos valores automticos, podemos indicarlo usando una asignacin
como la usada para indicar que rojo vale 1: rojo = 1
En caso de que no indiquemos ningn valor, el primero ser cero y los siguientes valdrn
uno ms que el anterior, por ejemplo, si la declaracin anterior la hacemos de esta forma:
Enum colores
rojo
azul
verde
End Enum
Por supuesto, los valores que podemos asignar a los elementos (o miembros) de una
enumeracin sern valores que estn de acuerdo con el tipo de datos, recordemos que si no
indicamos nada, sern de tipo Integer, pero si especificamos el tipo de datos, por ejemplo,
de tipo Byte, el cual si recordamos la tabla vista en la cuarta entrega, slo podr contener
valores enteros comprendidos entre 1 y 255. Sabiendo esto, no podramos declarar la
siguiente enumeracin sin recibir un mensaje de error:
Enum colores As Byte
azul = 255
rojo
verde
End Enum
Aunque el valor 1, sea un valor correcto, si tenemos Option Strict On, nos indicara que no
se permite la conversin implcita entre Integer y el tipo colores. Si no tuviramos activada
la comprobacin estricta, (cosa que yo te recomiendo y si pudiera, hasta te obligara a usar,
ms que nada porque as aprenders a hacer las cosas bien, que siempre habr tiempo de
hacerlas mal), a lo que iba, si no tuvieras esa opcin activada, no te mostrara ningn error,
pero si sabemos que para un buen uso de los tipos de datos, deberamos hacer la conversin
correspondiente, por qu no hacerla?
Si te portas como el Guille quiere, tendras que hacer lo siguiente:
unColor = CType(1, colores)
Es decir, usamos CType para hacer la conversin entre el nmero y el tipo correcto de
datos.
De todas formas, te dir que si usas el IDE de Visual Studio .NET, ste te mostrar los
valores que puedes asignarle a la variable declarada del tipo colores:
En las versiones anteriores de Visual Basic, podamos usar los miembros de las
enumeraciones sin indicar la enumeracin a la que pertenecen, por ejemplo, podamos
asignar el valor azul a una variable del tipo colores, pero en Visual Basic .NET esto ya no
es posible, si queremos usar el miembro azul, tenemos que indicar la enumeracin a la que
pertenece, por ejemplo con unColor = colores.azul, esto ms que un inconveniente es una
ventaja, ya que as no habr posibilidades de "mal interpretacin" o mal uso de los
miembros de una enumeracin.
Como he mencionado antes, deberamos hacer la comprobacin correspondiente para saber
si el valor que estamos asignando a una variable "enumerada" es el adecuado o no, por
ejemplo, si el parmetro de un procedimiento recibe un tipo enumerado, puede ser que el
valor con el que se llame a ese procedimiento no sea un valor vlido, cmo podemos
evitar estos casos?
En principio podramos hacer una comprobacin, bien usando comparaciones If o, mejor
an, usando Select Case, para el caso de la enumeracin colores no habra mucho
problema, ya que slo tiene tres valores y esa comprobacin podra quedar de esta forma:
Private Sub pruebaColores(ByVal elColor As colores)
Select Case elColor
Case colores.azul, colores.rojo, colores.verde
' OK
Case Else
' si no es ninguno de los vlidos,
' asignamos uno por defecto
elColor = colores.azul
End Select
' resto del cdigo...
End Sub
Esto est bien, ya que, a pesar de que usemos CType para convertir un valor en la
enumeracin, no evita que que se "cuele" un valor errneo:
pruebaColores(CType(12, colores))
Esta llamada sera correcta, pero el valor no estara dentro de los valores vlidos, aunque no
producira ningn tipo de error, ya que, aunque 12 no sea un valor vlido del tipo colores, si
que es un valor vlido del tipo Integer, que al fin y al cabo es el tipo de valores que admiten
las variables declaradas como colores.
En el procedimiento, se comprueba si el valor pasado en el parmetro es del tipo adecuado
y se actuara de la forma que nosotros quisiramos. El problema vendra si la cantidad de
miembros de la enumeracin fuese muy extensa y esos valores no fuesen consecutivos, ya
que nos obligara a hacer muchas "comparaciones" para poder saber si el valor indicado es
uno de los valores correctos.
Para poder solventar este "problemilla", tendremos que echar mano del propio .NET
Framework, en particular de la clase Enum, esta clase tiene una serie de mtodos
"estticos" que podemos usar para distintas circunstancias, en nuestro caso particular,
podemos usar el mtodo IsDefined que devolver un valor verdadero o falso, segn el
valor indicado est o no definido en la enumeracin.
Por ejemplo si hacemos esto:
If System.Enum.IsDefined(unColor.GetType, 12) Then
o esto otro, que para el caso es lo mismo, ya que el primer parmetro de esta funcin espera
un tipo:
If System.Enum.IsDefined(GetType(colores), 12) Then
Se devolver un valor falso, ya que 12 no es miembro de la enumeracin colores.
En el primer caso usamos la variable del tipo colores (unColor) y usamos el mtodo
GetType para saber que tipo de datos es esa variable y en el segundo ejemplo, usamos la
funcin GetType para averiguar el tipo del parmetro indicado.
Veamos el cdigo del procedimiento pruebaColores usando este nuevo sistema de
averiguar si un valor es o no correcto (o vlido) para la enumeracin indicada.
Private Sub pruebaColores(ByVal elColor As colores)
If System.Enum.IsDefined(elColor.GetType, elColor) = False Then
elColor = colores.azul
Console.WriteLine("el valor no es correcto")
Else
Console.WriteLine("valor correcto")
End If
' resto del cdigo...
End Sub
Aunque no debes preocuparte demasiado, al menos por ahora, si no llegas a entender todo
esto que estamos viendo, simplemente "acepta" que funciona y ms adelante te das una
vueltecita por esta entrega y seguro que lo comprenders mejor. De todas formas, te voy a
Por ltimo vamos a ver un mtodo que, casi con toda seguridad veremos en ms de una
ocasin:
Parse, devuelve un valor de tipo Object con el valor de la representacin de la cadena
indicada en el segundo parmetro. Esa cadena puede ser un valor numrico o una cadena
que representa a un miembro de la enumeracin.
System.Enum.Parse(unColor.GetType, "1")
System.Enum.Parse(unColor.GetType, "azul")
Hay ms mtodos, pero creo que estos que acabo de enumerar son los ms interesantes, de
todas formas, te invito a seguir investigando por tu cuenta... cosa que, aunque yo no te lo
dijera, deberas acostumbrarte a hacer.
Pero ya que estamos con esto de Parse y para ir terminando esta entrega, veamos cmo
podemos usar ese mtodo para los tipos de datos que podemos usar en .NET Framework
(los cuales vimos en la cuarta entrega).
El mtodo Parse se utiliza para convertir una cadena en un valor numrico, el tipo de
nmero devuelto depender del tipo desde el que hemos usado ese mtodo, por ejemplo si
hacemos lo siguiente:
Dim s As String = "123"
Dim i As Integer = Integer.Parse(s)
El valor asignado a la variable numrica i, sera el valor 123 que es un nmero entero
vlido.
Pero si hacemos esto otro:
Dim b As Byte = Byte.Parse(s)
Tambin se asignara el valor 123 a la variable b, que es de tipo Byte, pero el nmero 123
ya no es un nmero entero, sino del tipo byte... esto es claro, dirs, pero, si el valor
guardado en la variable s no estuviese dentro del "rango" de valores aceptados por el tipo
Byte, esto producira una excepcin (o error).
s = "129.33"
i = Integer.Parse(s)
En este caso, el error se produce porque 129.33 no es un nmero entero vlido, por tanto,
cuando usemos Parse, o cualquiera de las funciones de conversin, tendremos que tener
cuidado de que el valor sea el correcto para el tipo al que queramos asignar el valor...
Cmo solucionar este pequeo inconveniente?
No perdindote la prxima entrega de este Curso de Iniciacin a la Programacin con
Visual Basic .NET, ya que esta entrega se acaba aqu, as que... a esperar... que remedio!
Pero no te preocupes que no tendrs que esperar mucho... (al menos intentar que sea antes
de que acabe este "pedazo" de puente de la Constitucin que empez hoy da 6 y que dura
hasta el lunes da 9)
Veamos las cosillas que hemos visto en esta sptima entrega:
Hemos visto cmo elegir entre varias opciones mediante Select Case, tambin sabemos
cmo crear enumeraciones o constantes simblicas que estn relacionadas de alguna forma,
tambin hemos visto algunos mtodos de la clase Enum con los que podemos saber si un
valor pertenece a los definidos en la enumeracin o con los que podemos saber los nombres
de los miembros de dicha enumeracin, adems de saber cmo podemos convertir cadenas
de caracteres en un valor numrico, mediante el mtodo Parse.
Para la prxima entrega veremos cmo detectar o interceptar errores y algunas otras
cosillas, como el tema que tambin hemos tratado, aunque slo haya sido de pasada, sobre
los arrays o matrices.
Nos vemos.
Guillermo
Cdigo Fuente:
/*
* Created by SharpDevelop.
* User: Santos
* Date: 14/11/2005
* Time: 04:41 p.m.
*
* To change this template use Tools | Options | Coding | Edit Standard
Headers.
*/
using System;
using System.Windows.Forms;
namespace Cantidad_a_Letra
{
if (sAux.IndexOf(".") >= 0)
sResultado += ObtenerDecimales (sAux);
return sResultado;
}
if (sAux.IndexOf(".") >= 0)
sResultado += ObtenerDecimales (sAux);
return sResultado;
}
sNumero = dNumero.ToString();
iNumero = int.Parse
(sNumero[0].ToString());
sTexto
+=
+= this.sDecenas [iNumero]
+ " ";
else {
dNumero = dCociente;
sNumero = dNumero.ToString();
if (sNumero.Length > 1)
if (sNumero[1] != '.')
iNumero = int.Parse
(sNumero[0].ToString() + sNumero[1].ToString());
else
iNumero = int.Parse
(sNumero[0].ToString());
else
iNumero = int.Parse
(sNumero[0].ToString());
sTexto
return sTexto;
}
sNumPuntos = sNumero.Split('.');
dNumero = Convert.ToDouble(sNumPuntos[1]);
sTexto = "punto " + Numeros(dNumero,1);
return sTexto;
}
}
}