Vous êtes sur la page 1sur 648

En complementos de aprendizaje

Presentaciones – Videos – Ejercicios

Felipe Ramírez es Master en Informática


Abogado, ITIL Certified Trainer, Desarrollador CAP-Dev 2005
e Instructor Aprenda Practicando Nivel 3

Descargas de la web
Aprenda a utilizar Visual Studio como los profesionales, Presentaciones profesionales
obteniendo en el menor tiempo y con la mínima codificación para exposición
las aplicaciones más robustas y eficientes.
Videos explicativos que apoyan
el aprendizaje de los temas
Código fuente de los ejercicios
Aprenda la estructura general del lenguaje Visual Basic.NET; aprenda del libro, y archivos complementarios
el uso de variables, operadores, estructuras de control, funciones,
manejo estructurado de excepciones, clases generics, y el uso de la
biblioteca de clases de .NET Framework, aprovechando al máximo las
herramientas gráficas de desarrollo de Visual Studio 2005. .NET Framework 2.0
Visual Studio 2005
SQL Server 2000 / 2005
Cursos / Certificaciones
Aprenda los elementos de la programación orientada a objetos
y diseño de forma gráfica clases con herencia y polimorfismo. Este libro apoya el estudio de los siguientes cursos
de certificación:

MICROSOFT MCAD
70-305, 70-306, 70-310, 2364B.
Aprenda el uso de los controles gráficos para el desarrollo de - PRESENTACIONES -
interfaces gráficas basadas en Windows y en Web Aprenda practicando CAP-Dev 2005: - VIDEOS -
usando las Windows Forms mejoradas y ASP.NET 2.0, y - EJERCICIOS -
2015
aprenda a diseñar y consumir Servicios Web XML - SOPORTE ON LINE -

Aprenda el modelo de objetos ADO.NET y sepa establecer Visual Basic 2005


conexiones a SQL Server desde Visual Studio, genere y depure Visual Studio
Stored Procedures desde Visual Studio y desarrolle aplicaciones 2005
para actualización de datos desde Consola, Windows y Web, de
ASP.NET 2.0
forma conectada y desconectada, con el mínimo de codificación.
ADO.NET 2.0
POO
Actualizadores

Visítenos en:
www.pearsoneducacion.net
Aprenda Practicando
Visual Basic 2005
usando Visual Studio 2005
Aprenda Practicando
Visual Basic 2005
usando Visual Studio 2005
Mtro. José Felipe Ramírez Ramírez
Master en Informática Administrativa
ITIL Certified Trainer
Instructor CAP-DEV Nivel 3
Facultad de Contaduría Pública y Administración
Facultad de Ingeniería Mecánica y Eléctrica
Universidad Autónoma de Nuevo León, México

REVISIÓN TÉCNICA
Mtro. Francisco Salazar
Universidad Autónoma de Nuevo León, México
Mtro. César Tello
Univesidad Autónoma de Nuevo León, México
Datos de catalogación bibliográfica

RAMÍREZ, JOSÉ FELIPE.

Aprenda Practicando Visual Basic 2005


usando Visual Studio 2005

PEARSON EDUCACIÓN, México, 2007


Área: Ingeniería y Computación

ISBN: 978-970-26-0912-4

Formato: 18.5 × 23.5 cm Páginas: 648

Editor: Pablo Miguel Guerrero Rosas


e-mail: pablo.guerrero@pearsoned.com
Editor de Desarrollo: Bernardino Gutiérrez Hernández
Supervisor de Producción: José D. Hernández Garduño

PRIMERA EDICIÓN, 2007

D.R. © 2007 por Pearson Educación de México, S.A. de C.V.


Atlacomulco 500-5to. piso
Col. Industrial Atoto
53519, Naucalpan de Juárez, Edo. de México
E-mail: editorial.universidades@pearsoned.com

Cámara Nacional de la Industria Editorial Mexicana. Reg. Núm. 1031.

Prentice Hall es una marca registrada de Pearson Educación de México, S.A. de C.V.

Reservados todos los derechos. Ni la totalidad ni parte de esta publicación pueden reproducirse, regis-
trarse o transmitirse, por un sistema de recuperación de información, en ninguna forma
ni por ningún medio, sea electrónico, mecánico, fotoquímico, magnético o electroóptico, por fotocopia,
grabación o cualquier otro, sin permiso previo por escrito del editor.

El préstamo, alquiler o cualquier otra forma de cesión de uso de este ejemplar requerirá
también la autorización del editor o de sus representantes.

ISBN 10: 970-26-0912-7


ISBN 13: 978-970-26-0912-4

Impreso en México. Printed in Mexico


1 2 3 4 5 6 7 8 9 0 - 10 09 08 07
CONTENIDO
Prólogo vii
Agradecimientos xv
Como utilizar este libro xvii

Parte 1 Plataforma .NET versión 2005 1


Capítulo 1 Arquitectura de la plataforma .NET 3
Definición de la plataforma .NET 5
Capas principales de la plataforma .NET 7
Capa de lenguajes de .NET 9
Lenguajes .NET 10
.NET Framework 11
Impacto de .NET Framework en los sistemas operativos 27
Ventajas que brinda la infraestructura de .NET 28
Convivencia de .NET y COM 29
Mapa mental del capítulo 31
Terminología 32
Preguntas 33
Examen rápido del capítulo 34

Capítulo 2 .NET como multiplataforma de desarrollo 35


Determinación de la plataforma .NET requerida 37
Productos de plataforma .NET 39
Desarrollo de aplicaciones en .NET usando SDK 49
Tecnologías cubiertas en este libro 53
vi Contenido

Mapa mental del capítulo 55


Terminología 56
Preguntas 56
Examen rápido del capítulo 58

Capítulo 3 Técnicas de desarrollo con Visual Studio 2005 59


Fundamentos de desarrollo con Visual Studio 61
Elementos de sintaxis en Visual Basic 67
Mapa mental del capítulo 92
Terminología 93
Preguntas 93
Examen rápido del capítulo 94

Parte 2 Fundamentos de programación en Visual Basic 95


Capítulo 4 Variables, arreglos y tipos de datos 97
Variables 99
Conversión de datos 105
Acceso a datos Value type y Reference type 107
Strong Typing 109
Manejo elemental de variables 112
Estructuras y enumeraciones 133
Mapa mental del capítulo 135
Terminología 136
Preguntas 136
Examen rápido del capítulo 138

Capítulo 5 Espacios de nombres y desarrollo de librerías 139


Espacios de nombres (namespaces) 141
Uso de espacios de nombres 148
Creación de namespaces propios 149
Alias para los espacios de nombres 150
Independencia de los ensamblados 151
Referencias 151
Mapa mental del capítulo 170
Terminología 171
Preguntas 171
Examen rápido del capítulo 173

Capítulo 6 Manejo de operadores 175


Operadores aritméticos 177
Operadores de asignación 178
Contenido vii

Operadores comparativos 180


Operadores lógicos 185
Prioridad entre operadores 189
Mapa mental del capítulo 200
Terminología 201
Preguntas 201
Examen rápido del capítulo 203

Capítulo 7 Estructuras de decisión y control 205


Estructuras de decisión 207
Estructuras de control 211
Estructuras envolventes y anidadas 215
Mapa mental del capítulo 227
Terminología 228
Preguntas 228
Examen rápido del capítulo 230

Capítulo 8 Manejo estructurado de excepciones 231


Errores y Excepciones 233
Manejo estructurado de excepciones 234
Try...Catch...Finally 235
Filtrado de excepciones 241
Lanzamiento de excepciones propias 246
Mapa mental del capítulo 249
Terminología 250
Preguntas 250
Examen rápido del capítulo 252

Parte 3 Programación orientada a objetos 253


Capítulo 9 Fundamentos de la programación orientada a objetos 255
Términos básicos de POO 257
Elementos esenciales de los objetos que permiten
su programación 265
Mapa mental del capítulo 275
Terminología 276
Preguntas 276
Examen rápido del capítulo 278

Capítulo 10 Clases, métodos y propiedades 279


Definición de una clase 281
Definición de propiedades 281
viii Contenido

Creación de bibliotecas de clases (librerías) 283


Condiciones para la utilización de las bibliotecas
de clases 284
Mapa mental del capítulo 307
Terminología 308
Preguntas 308
Examen rápido del capítulo 310

Capítulo 11 Herencia y polimorfismo 311


Herencia 313
Estatutos auxiliares para el manejo de herencia
y polimorfismo 323
Polimorfismo 325
Mapa mental del capítulo 335
Terminología 336
Preguntas 336
Examen rápido del capítulo 338

Parte 4 Interfaces Windows/Web y Servicios Web XML 339


Capítulo 12 Desarrollo de aplicaciones Windows 341
Interfaz de usuario 344
Desarrollo de interfaces basadas en objetos 345
Jerarquía de clases relacionadas con controles 349
Clasificación de los controles 355
Enfoque (Focus) 363
Mapa mental del capítulo 392
Terminología 393
Preguntas 394
Examen rápido del capítulo 396

Capítulo 13 Desarrollo de aplicaciones Web con ASP.NET 397


Motivos del auge de las aplicaciones Web 399
Requerimientos para el desarrollo de ASP.NET 400
Procesamiento de páginas Web en .NET 402
Características de ASP.NET 403
Elementos de una página Web ASP.NET 410
Controles comunes en aplicaciones Web 419
Mapa mental del capítulo 439
Terminología 440
Preguntas 441
Examen rápido del capítulo 443
Contenido ix

Capítulo 14 Servicios Web XML 445


Servicios Web XML 447
Infraestructura de operación de los Servicios Web 453
Elementos para la creación de un Servicio
Web XML 454
Mapa mental del capítulo 463
Terminología 464
Preguntas 464
Examen rápido del capítulo 466

Parte 5 Manejo de bases de datos con ADO.NET 467

Capítulo 15 Manejo de bases de datos con ADO.NET 469


ADO.NET 471
Historia del acceso a los almacenes de datos 472
Formas de trabajo con bases de datos en .NET 477
Proveedores de datos de .NET Framework 481
Modelo de objetos de ADO.NET 491
Cómo realizar la conexión 496
Command 503
DataReader 506
Mapa mental del capítulo 521
Terminología 522
Preguntas 523
Examen rápido del capítulo 525

Capítulo 16 Manejo de bases de datos desde aplicaciones


Windows 527
Modelo de objetos DataSet 529
Alternativas para poblar de datos un DataSet 534
DataAdapter 535
DataSet 538
Mapa mental del capítulo 562
Terminología 563
Preguntas 564
Examen rápido del capítulo 566

Capítulo 17 Manejo de bases de datos desde aplicaciones Web 567


Data Source Controls y Data Bound Controls 569
Mapa mental del capítulo 596
Terminología 597
x Contenido

Preguntas 597
Examen rápido del capítulo 599

Capítulo 18 Colecciones genéricas (generics) 601


Generics 603
Bloques de código usando generics 604
Colecciones genéricas 607
List 607
Queue 610
Stack 613
Dictionary 616
Mapa mental del capítulo 619
Terminología 620
Preguntas 620
Examen rápido del capítulo 622
A mi hermano Gil,
Quien verdaderamente sabe escribir.
PRÓLOGO
Este libro está compuesto por partes seleccionadas del curso de certificación Aprenda
Practicando CAP-Dev 2005, código 2015: Aprenda Practicando Visual Basic 2005 y Vi-
sual Studio 2005 (www.aprendapracticando.com).
Originalmente el curso se llamaba Aprenda Practicando Visual Basic 2005 usando Visual
Studio 2005, pero Visual Studio 2005 resultó ser un invitado con ganas de protagonizar. La
herramienta es tan poderosa que muchas de las prácticas no requerían codificación por par-
te del desarrollador, de tal forma que daba lo mismo que el programa estuviera en Visual
Basic, C# o J#; al final, el desarrollador ni se enteraba de la programación tras bambalinas.
Entonces ya no era Visual Basic usando Visual Studio, sino Visual Studio usando Visual
Basic; de ahí el cambio de nombre.
El libro está dirigido a dos tipos de profesionales: (a) para el codificador minucioso que
quiere entender los pormenores del lenguaje, las clases, sus miembros, las palabras reser-
vadas y las estructuras que permiten la creación casi artesanal de los programas; es decir,
el profesional cuya curiosidad lo ha convertido en conocedor profundo del funcionamien-
to de las cosas, y (b) para el desarrollador profesional de alto rendimiento que casi siem-
pre dispone de menos tiempo del que necesita para generar los resultados que las empre-
sas le exigen, que no puede detenerse en los pormenores del lenguaje y que prefiere el uso
de herramientas visuales y poderosas para crear soluciones efectivas en el menor tiempo
posible. El objetivo de este libro es formar codificadores minuciosos y convertirlos en de-
sarrolladores profesionales de alto rendimiento. Se buscan individuos que representen lo
mejor de los dos mundos.
Pero el propósito del libro no es tan simple como la frase “formar desarrolladores minucio-
sos pero efectivos”. Sería algo demasiado simple. Vamos más allá.
Creo firmemente que el mundo en que crecemos encuentra muchas maneras sutiles de vol-
verse más complejo conforme se globaliza. Queremos hacer de nuestra vida un cortome-
traje feliz en donde todo transcurre tan rápido que nos olvidamos de que los planes de vi-
da a largo plazo también existen.
Al oír las noticias del día me lamento al darme cuenta de que la violencia y la deshonesti-
dad forman un conjunto de aproximaciones sucesivas hacia un futuro que no quiero. Creo
que el origen de todos los problemas es la gente que anhela mucho y actúa poco; creo que
entre el anhelo personal y la acción que produce resultados hay abismos enormes, y la gen-
te quiere tender puentes rápidos y cómodos para ir de un punto a otro. A veces la materia
xiv Prólogo

prima para esos puentes son acciones delictivas y prácticas ilegales, siempre disponibles y
a la mano, que lo enrarecen todo y terminan quitando más de lo que dan.
Si no eres de las personas fáciles de seducir por el lado oscuro de la fuerza, sino que bus-
cas caminos lícitos y honestos para tender los puentes, te daráss cuenta de que resulta di-
fícil, costoso, complejo y cansado.
Este libro es mi pequeña contribución para quien desea dedicarse profesionalmente a la lí-
cita y honesta actividad del desarrollo de aplicaciones. A quien desee llenar su cabeza de
conocimientos para después comercializar sus habilidades y construir sus propios puentes,
este libro lo iniciará de manera perfecta en el camino profesional del desarrollo en Visual
Basic, utilizando la herramienta líder en la construcción de aplicaciones empresariales, así
como la más demandada por los empleadores: Visual Studio.
Dominar todos los temas de este libro garantiza la capacidad para el trabajo productivo con
tecnologías Microsoft, cosa que ya ha sido un puente para tantos.
Como dice Mario Benedetti: Para cruzarlo o para no cruzarlo, ahí está el puente.
AGRADECIMIENTOS
Los agradecimientos van, como siempre, para los indispensables en mi vida.
Para Adriana, mi compañera vital, y para Sara, por ser la lucecita que ilumina mis sende-
ros. A toda mi familia en general, por estar ahí generación tras generación, demostrando
que se puede ser lícito y honesto, y obtener los anhelos, uno a la vez.
A mis compañeros Verónica López, Delia Briones, Rolando Martínez, Gustavo Valdés y
Rey Manuel, por transformar algo simplemente soportable en algo disfrutable; a Paco Sa-
lazar, Jorge Hernández, Magda Garza, Paco Guevara, Heriberto González y todos los que
creen que Aprenda Practicando está avanzando gracias a la calidad de los productos y su
filosofía. A Víctor Manuel Ortega, que seguro llegará a mucho en su vida: gracias por la re-
visión línea a línea de los programas.
Como siempre, mi agradecimiento especial a Isela Martínez por el delicado esmero que ha-
ce de un texto opaco un texto con algo de brillo. Siempre es bueno que los libros tengan un
ángel de la guarda.

Monterrey, Nuevo León, 2006.


Cómo utilizar
este libro

Descargue nuevos capítulos


prácticas adicionales y archivos
complementarios desde nuestro
sitio AprendaPracticando.com

Este libro es una herramienta de aprendizaje dirigida a profesionales con especialidad en


computación e informática, de ahí que analice desde elementos de programación hasta el
manejo de bases de datos.
El contenido está diseñado para que el lector, en un periodo de cuatro a seis meses, apren-
da a programar en Visual Basic y utilizar Visual Studio 2005 en forma intensiva. Se espe-
ra que, al final, el lector sea capaz de implementar sistemas de información con manejo de
bases de datos utilizando SQL Server y en interfaz de consola, Windows y Web.
De forma autodidacta y con una dedicación de tiempo completo a la realización de los ejer-
cicios del libro se puede aprender todo en dos meses.
La configuración ideal de hardware para lograr las metas de aprendizaje de este libro es la
siguiente: a) Un equipo de última generación con Windows XP Professional (o superior)
con Service Pack 2 instalado, b) Internet Information Server 5.5 o superior instalado y fun-
cionando, c) .NET Framework 2.0 Redistributable Package, d) .NET Framework SDK 2.0,
e) Visual Studio 2005 Standard Edition en inglés y f) SQL Server 2000/2005 o superior.
Los números sugieren la secuencia de instalación. Se recomienda que la cuenta con la que
ingrese al sistema tenga privilegios de administrador y que forme parte del grupo de usua-
rios Debugger Users.
También puede cubrirse la totalidad de los temas tomando el curso 2015 Programación en
Microsoft Visual Basic 2005 y Visual Studio 2005, y 2016 Acceso a datos usando Micro-
soft Visual Basic 2005 y Visual Studio 2005, en algún centro autorizado Aprenda Practi-
xviii Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

cando. En el curso contará con un equipo personal especialmente configurado para el


aprendizaje de los temas y con la guía de un instructor certificado CAP-Dev, quien le ase-
sorará en temas del curso además de orientarle con respecto a la forma en que puede em-
plear los conocimientos en casos reales que se encuentre desarrollando.

¿Cómo están compuestos los capítulos?


Los capítulos del presente libro tienen los siguientes elementos que fomentan el aprendizaje:

❑ Presentación profesional en Power Point. Si utiliza el pre-


sente libro para la exposición de cátedra, la buena noticia es que
no tendrá que desarrollar material de apoyo. Desde el sitio Web
apvbvsxx.ppt AprendaPracticando.com podrá descargar de manera gratuita las
presentaciones profesionales en Power Point que hemos desarro-
llado. Estas presentaciones están sujetas a condiciones de uso.

❑ Objetivo general y objetivos particulares. Cada capítulo


tiene en su primera página un objetivo general, que representa la
nueva habilidad que el lector habrá de adquirir al concluir el estu-
dio del capítulo; además señalará los objetivos particulares, que re-
presentan en secuencia lógica los focos de atención para alcanzar
el objetivo general.

❑ Índice por capítulo. Cada capítulo contiene su propio índice,


por lo que ubicar la información dentro de un capítulo resulta más
fácil; además, el índice diferencia visualmente los temas de los
ejercicios, a fin de que se puedan localizar estos últimos de mane-
ra más fácil.

❑ Notas informativas. Cada capítulo contiene notas adicionales


que proporcionan información que, en general, no está disponible
en la documentación del producto. Además, se ofrecen referencias
históricas de los productos, así como consejos y advertencias que
pueden reducir la curva de aprendizaje.

❑ Videos explicativos. Cada capítulo puede hacer referencia a vi-


deos explicativos que abordan temas que es más fácil tratar de ma-
nera visual y dinámica. Tanto las presentaciones profesionales en
Power Point como el libro señalan el momento adecuado de su ex-
posición. Estos videos están disponibles en línea en el sitio Web
AprendaPracticando.com.
Cómo utilizar este libro xix

❑ Figuras. Cada capítulo contiene figuras que complementan gráfi-


camente los temas tratados; a veces una imagen dice más que mil
palabras.
❑ Lo nuevo en Visual Studio 2005. Visual Studio 2005 presen-
ta nuevas capacidades y herramientas de productividad. La sección
Lo nuevo explica detalladamente cada una de estas adiciones.
❑ Ejercicios detallados, con explicaciones línea por línea y
ejecución guiada. La mayoría de los capítulos presenta ejerci-
cios que permiten comprobar la teoría estudiada. Los ejercicios se
desarrollan paso a paso y se complementan con código. Se inclu-
ye también una ejecución guiada, que explica lo que cada línea de
código hace y los resultados que se obtienen.
❑ Mapa mental. Cada capítulo incluye un mapa mental que actúa
como resumen de los temas del capítulo. También es útil en el
aprendizaje en grupo, para que aquellos que se atrasen en el segui-
miento de los temas puedan ponerse al día. Generalmente basta
con analizar el mapa mental y repasar en el capítulo los términos
clave que contiene.
❑ Terminología. .NET introduce muchos conceptos nuevos que es
necesario tener en mente. Cada capítulo tiene su propio índice de
términos, lo que permite su rápida localización en el texto del
capítulo.
❑ Preguntas. Al final de cada capítulo se incluye una serie de pre-
guntas; si el lector las contesta correctamente, podrá tener la cer-
teza de haber aprendido los conocimientos presentados en el capí-
tulo. Algunas preguntas requieren análisis, más allá de la simple
consulta, lo que despierta el razonamiento de la técnica que se es-
tá aprendiendo.
❑ Examen rápido. Es la evaluación rápida que se debe resolver
después de haber estudiado los temas y resuelto los ejercicios. Si
entendió los objetivos de estudio y la terminología, llevó a cabo los
ejercicios y las prácticas individuales, y respondió a las preguntas,
es seguro que resuelva la evaluación correctamente, con conoci-
miento de causa respecto a todo.
Partimos del concepto de que las personas son diferentes: cada individuo tiene su forma
particular de aprender: algunos leyendo un resumen, otros por medio de un video, algunos
leyendo, otros contestando preguntas, otros con la práctica, algunos más siendo cuestiona-
xx Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

dos... Tratamos de brindar la mayor gama de herramientas con el fin de que cada quien
aprenda como quiera; lo importante es que lo haga.

Estrategias de uso
Para el autodidacta…
La persona autodidacta es la que toma el aprendizaje en sus manos; no depende de las ex-
plicaciones de nadie y por lo tanto tiene control total de su propio proceso de aprendizaje.
A ese tipo de lector le sugerimos esto:

1. Si desea aprender sólo algunos temas, considere las partes del libro como temas. No
caiga en la tentación de tomar en cuenta sólo algunos de los capítulos de una parte, da-
do que están estructurados en una secuencia funcional.
2. Si ya conoce .NET, puede saltarse capítulos dentro de un tema si ya los domina. Una
manera de evaluar si está en condiciones que le permitan saltar capítulos es la siguien-
te: trate de contestar las evaluaciones rápidas del capítulo. Si responde correctamente
a la mayoría de las preguntas, puede omitir la lectura del capítulo.
3. Decididos los temas que le interesan, lea de manera secuencial cada capítulo del tema:

a) Lea con detenimiento los objetivos del capítulo para que tenga presente que eso
es lo que hay que dominar al concluirlo.
b) Si interrumpe la lectura de un capítulo, cada vez que reinicie la lectura lea de nue-
vo los objetivos. Es muy importante que los tenga presentes.
c) Revise los videos en el momento en que los señale el texto.
d) Realice los ejercicios en el momento en que los encuentra en el texto.
e) Responda el examen rápidamente; si no contesta correctamente la mayoría de las
preguntas, vuelva a revisar el capítulo hasta que quede satisfecho.

4. Si aprueba satisfactoriamente el examen rápido, intente desarrollar las prácticas


individuales. Si ya entendió el contenido del capítulo, sólo es cuestión de tiempo y
dedicación.
5. Le sugerimos que pruebe los cuestionarios y juegos en línea que se encuentran en www.
aprendapracticando.com para comprobar el grado de experiencia que ha adquirido.

Para el uso con grupos…


Si utiliza el libro para la capacitación de grupos, le sugerimos que tome en cuenta las si-
guientes consideraciones para alcanzar los objetivos (suponemos que usted es el instruc-
tor/facilitador):
Cómo utilizar este libro xxi

Al iniciar un tema…
1. El instructor/facilitador deberá dominar el tema a instruir; previo a la instrucción, de-
berá responder a las preguntas, realizar los ejercicios, realizar las prácticas individua-
les y responder a la perfección el examen rápido.
2. Los equipos en los que se pretendan demostrar los ejercicios deberán estar configura-
dos con los requerimientos mínimos que aparecen en la primera parte de esta sección.
3. Las presentaciones profesionales en Power Point están disponibles en el sitio Web
de Aprenda Practicando; descargue las versiones más actualizadas antes de cada
curso.
4. Antes de revisar una parte del libro, explique la importancia del aprendizaje del tema
y genere interés por él; sin interés no hay aprendizaje.
5. Lo ideal, para demostrar que la tecnología estudiada es útil, es citar su experiencia per-
sonal en el uso de estas herramientas de desarrollo. También esto contribuye a aumen-
tar el interés en su exposición.

Para revisar cada capítulo…


1. Solicite, antes de la sesión de instrucción, que los miembros del grupo contesten las
preguntas de cada capítulo. Puede pedirlo como tarea escrita (de preferencia a mano,
para evitar las operaciones irreflexivas de copiar y pegar), para garantizar que los par-
ticipantes la lean.
2. Al iniciar cada sesión recuérdeles los objetivos del capítulo que se estudiará.
3. En cada inicio de capítulo, después de ver los objetivos, solicite a los miembros del
grupo que lean las respuestas a las preguntas (punto 6); de preferencia ceda la palabra
de tal forma que todas las personas participen.
4. Proyecte la presentación profesional que acompaña a cada capítulo. Para un mejor
aprovechamiento recomendamos que para su uso personal imprima la presentación
como página de notas, y lea las notas de cada una de las diapositivas, le ayudarán los
consejos y anotaciones relevantes.
5. En caso de que se encuentre con un icono de video en la presentación proyéctelo en
ese momento.
6. En una exposición, solicite a los miembros del grupo que realicen los ejercicios hasta
el final, cuando ya se haya expuesto toda la presentación.
7. Los miembros del grupo deberán realizar los ejercicios que el instructor/facilitador les
pida. Éste deberá especificar con claridad cuál es el tiempo máximo de realización; es
importante que los tiempos marcados se respeten.
8. El instructor/facilitador, en caso de detectar dificultades en la realización de los ejer-
cicios, deberá apoyar a los miembros del grupo, pero sin hacer los programas por
ellos.
xxii Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. En caso de detectar un problema común, es importante comentar con el grupo el pro-


blema y la solución.
10. Al concluir la realización de los ejercicios, el instructor/facilitador comentará las ex-
periencias más relevantes que haya notado; repasará por última vez los objetivos del
capítulo y comentará cómo fue que se cubrieron.
11. Al finalizar los ejercicios, el instructor/facilitador pedirá al grupo que conteste el exa-
men lo más rápido posible, de manera individual. Se darán tres minutos para contes-
tar; después, en voz alta planteará cada una de las preguntas y revisará qué contestó el
grupo. Después de escuchar las diferentes posturas, ofrecerá la respuesta correcta y
dará sus razones. Los exámenes son una herramienta de aprendizaje más, no una opor-
tunidad para el premio o el castigo.
12. El instructor/facilitador podrá encargar las prácticas individuales como trabajo de re-
fuerzo del conocimiento, ya sea para su desarrollo en sesión, o para que las personas
desarrollen las prácticas en casa.
13. De ser posible, motive a los participantes a comprobar sus conocimientos en los dife-
rentes cuestionarios y juegos en línea que se encuentran en:
www.aprendapracticando.com.

Certificación CAP-Dev
Aprenda Practicando ha desarrollado la primera certificación en castellano relacionada
con la tecnología Microsoft .NET. El objetivo es que el personal certificado sea capaz de
desarrollar aplicaciones multicapa, orientadas a objetos, con pleno acceso a bases de datos
de alto rendimiento, utilizando para ello la herramienta Visual Studio a nivel profesional.
CAP-Dev 2005 (Certificación Aprenda Practicando – .NET Developer) se compone de
los siguientes cursos:
Cómo utilizar este libro xxiii

Solicite sus cursos en los centros autorizados Aprenda Practicando o regístrese a ellos en
la página www.AprendaPracticando.com
Conforme las versiones de los productos de Microsoft van evolucionando, la certificación
y los cursos se actualizan de inmediato.
Capítulos:
1 Arquitectura de la
plataforma .NET
Parte 1
2 .NET como
multiplataforma de Plataforma .NET versión 2005
desarrollo
3 Técnicas de desarrollo En esta parte del libro se estudian los componentes
con Visual Studio 2005 y particularidades de la plataforma de desarrollo
Microsoft .NET, en su versión 2005.

Herramientas de Visual Desde la perspectiva teórica se analizan los


Studio revisadas: conceptos que permiten entender a profunidad
cómo funciona la plataforma Microsoft .NET.
1. Solution Explorer
2. Document Window Además, se describen las características de los
3. Text Editor productos .NET; este conocimiento es necesario
4. Form Designer para afrontar las responsabilidades del
5. Toolbox desarrollador, pues le ayuda a responder la
pregunta ¿Qué compro y qué instalo?
6. Properties
En el aspecto práctico, se trata de forma general lo
Otras herramientas: que Visual Studio 2005 y los lenguajes soportados
por .NET Framework versión 2.0 pueden hacer.
1. .NET Framework 2.0
Configuration Esta obra tiene como finalidad el desarrollo
2. SDK Command Prompt profesional del lector, quien a través del
3. ILDASM.EXE aprendizaje sólido de .NET podrá aplicar estos
4. VBC.EXE conocimientos y crecer gracias a las capacidades
que obtendrá.
5. IIS Services
Las posibilidades de productividad son muchas, así
como las oportunidades de desarrollo utilizando
.NET; lo único que falta es que el lector se decida
a aprovechar las posibilidades y recoger el fruto de
su trabajo profesional basado en el conocimiento
sólido.
CAPÍTULO 1
Arquitectura de la
plataforma .NET
Objetivos: Conocer los elementos y el funcionamiento de la plataforma .NET,
desde la codificación del programa fuente hasta la ejecución del programa resul-
tante.

1. Conocerá las capas más importantes de .NET Framework.


2. Distinguirá los requisitos que los lenguajes deben cumplir para ser re-
conocidos como lenguajes .NET.
3. Comprenderá la forma en que .NET interpreta, compila y ejecuta los
programas.
4. Aprenderá las particularidades de la biblioteca de clases de .NET y su
organización lógica y física.
5. Se enterará de las ventajas que la plataforma .NET brinda a los desa-
rrolladores.
6. Entenderá la forma en que .NET puede coexistir con aplicaciones ante-
riores basadas en tecnología COM.

3
4 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Definición de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Capas principales de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Capa de lenguajes de .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
CLS (Common Language Specification) . . . . . . . . . . . . . . . . . . . . . . . . . 9
Lenguajes .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
.NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Capa de servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Biblioteca de clases base de .NET Framework (BCL) . . . . . . . . . . . . . . . 12
Independencia de la biblioteca de clases y los lenguajes . . . . . . . . . . . 15
CLR (Common Language Runtime) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Compilador para generar código intermedio . . . . . . . . . . . . . . . . . . . . 17
Global Assembly Cache (GAC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Análisis de las entradas del Caché global para ensamblado
(GAC, Global Assembly Cache) . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
.NET PE (.NET Portable Executable) versus PE/COFF . . . . . . . . . . . . . . . 21
Identificación de diferencias en programas ejecutables,
usando el desensamblador de .NET (ildasm.exe) . . . . . . . . . . . . 23
Compiladores JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Impacto de .NET Framework en los sistemas operativos . . . . . . . . . . . . . . . . 27
Modificación al cargador de ejecutables . . . . . . . . . . . . . . . . . . . . . . . 27
Registro de biblioteca de clases base . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Prerrequisitos del sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Ventajas que brinda la infraestructura de .NET . . . . . . . . . . . . . . . . . . . . . . . 28
Convivencia de .NET y COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Capítulo 1. Arquitectura de la plataforma .NET 5

Bienvenidos a otro libro de la serie Aprenda practicando.


Como es costumbre, esta obra se vale del análisis teórico profundo y el uso intensivo de 1
ejercicios para enseñarle, en este caso concreto, a desarrollar aplicaciones en esquemas
Cliente/Servidor con acceso a bases de datos corporativas, mediante el lenguaje Visual Ba-
sic.NET en ambientes de Consola, Windows y Web. Este libro se concentra en las tecno-
logías .NET Framework 2.0, Visual Studio 2005 y SQL Server 2005.
El objetivo de la obra es dotar al profesional de sistemas con los conocimientos y la prác-
tica necesarios para enfrentar responsabilidades de desarrollo en las tecnologías anterior-
mente citadas.
Estamos seguros de que al concluir la lectura y los ejercicios del presente libro el objetivo
se habrá cumplido.

NOTA

Ésta es la versión profesional del libro Aprenda Practicando Visual Basic.NET; los archivos
complementarios mencionados en el mismo se encuentran en la página www.Aprenda Prac-
ticando.com. El temario de este texto es cubierto en su totalidad en el curso 2015 Aprenda
Practicando Visual Basic 2005 usando Visual Studio 2005, perteneciente a la única certificación
.NET en español, CAP-DEV (Certificación Aprenda Practicando .NET Developer).

Definición de la plataforma .NET


La plataforma .NET es un componente de los sistemas operativos Windows, que permite el
desarrollo, la liberación y la ejecución de aplicaciones. La plataforma posee un conjunto de he-
rramientas de desarrollo y lenguajes de programación (de propósito general, orientados a ob-
jetos, de tercera generación, de alto nivel y compilación a código intermedio), que nos permi-
ten utilizar todos los recursos disponibles en la computadora a través de una librería de clases
común, con la que se pueden desarrollar aplicaciones de Consola, basadas en Windows, y pa-
ra la Web, que utilizan protocolos abiertos para la interacción entre los elementos que las com-
ponen.

.NET no es sólo un conjunto de lenguajes o un producto de Microsoft metido en una caja; es


toda una plataforma de desarrollo orientada a objetos que resuelve muchos de los problemas
que se presentan hoy en día al desarrollar aplicaciones empresariales.
6 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Problemas que elimina .NET Algunos de los inconvenientes que se eliminan con .NET son:

❑ El infierno de los DLL.


❑ Falta de interoperabilidad con otras plataformas.
❑ Incapacidad para el manejo de esquema orientado a objetos.
❑ Manejo deficiente de errores.
❑ Incapacidad para utilizar Internet como medio eficiente de comunicación.
❑ Desaprovechamiento de la experiencia ganada como consecuencia del manejo de
otros lenguajes.
❑ Incapacidad para el desarrollo de aplicaciones que aprovechen arquitecturas
de 64 bits.

Beneficios que proporciona .NET En resumen, trabajar con la plataforma .NET


produce los siguientes beneficios:

❑ Integración de aplicaciones multi-lenguaje.


❑ Homologación de las capacidades de los lenguajes.
❑ Disponibilidad de una biblioteca de clases común para los lenguajes.
❑ Arquitectura abierta a nuevos lenguajes.
❑ Desarrollo simplificado.
❑ Implementación simple.
❑ Mejor soporte de componentes.
❑ Interoperación con Internet.
❑ Interoperación con dispositivos móviles.
❑ Rentabilidad.
❑ Seguridad.
❑ Fácil implementación (Copy Deployment).
❑ Permite el desarrollo de aplicaciones de 64 bits.

Uno de los mayores retos implicados en el aprendizaje de cualquier lenguaje .NET es en-
tender la forma en que esta plataforma trabaja. Por otro lado, existen muchos tecnicismos
ligados a esta tecnología que es necesario conocer.

Es recomendable entonces consultar el glosario de términos de .NET disponible en el sitio


Web de Microsoft: eso puede ayudarle a reconocer los términos; para entenderlos cabal-
mente, lea este libro.
Capítulo 1. Arquitectura de la plataforma .NET 7

Capas principales de la plataforma .NET


1
Las capas que componen la plataforma .NET son:
❑ Capa de lenguajes. La capa de lenguajes está integrada por la CLS (Especificación
Composición
de la común para lenguajes, Common Language Specification) y los lenguajes de programa-
plataforma
.NET
ción compatibles con ella. La CLS es una especificación abierta de Microsoft que los
lenguajes deben cumplir para ser considerados .NET. A la fecha Microsoft ha publica-
do cinco lenguajes y sus compiladores: Visual Basic, C#, C++, Visual J# y JScript.
Otros fabricantes pueden implementar sus propios lenguajes .NET siempre y cuando
respeten los lineamientos CLS y proporcionen los compiladores para generar el código
intermedio reconocido por .NET.
❑ . NET Framework (Infraestructura y servicios). .NET Framework es la capa
compuesta por el núcleo de servicios y recursos de .NET, que incluye los compiladores,
la biblioteca de clases común para todos los lenguajes y los servicios que convierten el
código fuente en código máquina para los diversos sistemas operativos a través del uso
de código intermedio. .NET Framework se compone de los siguientes elementos: capa de
servicios, BCL y CLR.
❑ Capa de servicios (Services). La capa de servicios se compone de aquellos ser-
vicios que permiten la intercomunicación entre los programas desarrollados en un len-
guaje .NET y el resto de los elementos de .NET Framework, con el fin de generar com-
portamientos a través del diálogo con el sistema operativo. Existen dos principales: a)
Windows Application Services, que dan soporte a las aplicaciones de interfaz gráfica es-
tilo Windows y a las de consola en su diálogo con .NET Framework y el sistema ope-
rativo; b) ASP.NET Application Services, que apoya a las aplicaciones de interfaz gráfi-
ca basadas en la Web, servicios Web XML y aplicaciones de cómputo móvil en su
diálogo con .NET Framework y el sistema operativo, a través del motor de servicios
Web. En plataforma Microsoft este motor de servicios Web se llama Internet Informa-
tion Server (IIS).
❑ Biblioteca de clases base (BCL/Base Class Library). La Biblioteca de clases ba-
se (BCL/Base Class Library) está constituida por un conjunto de bibliotecas de clase que
ponen a disposición de los programas un conjunto de funciones jerárquicamente organi-
zadas, que podrán ser utilizadas como funciones nativas de manera no dedicada por to-
dos los lenguajes de .NET.
❑ Motor común de ejecución (CLR/Common Language Runtime). El Motor común
de ejecución (CLR/ Common Language Runtime) es la plataforma común de ejecución de los
programas desarrollados en cualquier lenguaje .NET. CLR agrupa compiladores de lí-
nea de comando que permiten la creación de código intermedio, libre de ambigüedades,
al que se conoce como ensamblado (assembly); contiene además los compiladores JIT,
Just in Time Compilers, que se encargan de generar código máquina a partir de los en-
8 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

samblados. CLR se encarga de la gestión de errores, la administración de recursos y el


diálogo con el sistema operativo en tiempo de ejecución. A todo lo que requiere de la
intervención de CLR para funcionar se le da el calificativo de administrado (managed).
❑ Soporte operativo. La capa de soporte operativo es la compuesta por las herra-
mientas que se integran al sistema operativo al momento de instalar .NET Framework
en un equipo. Con esta operación, el sistema operativo se modifica para poder interpre-
tar y ejecutar aplicaciones .NET de forma nativa. Esta capa permite que el sistema opera-
tivo responda a indicaciones de acción emitidas por CLR en tiempo de ejecución.

NOTA

Microsoft ha denominado de diferentes formas a los productos y lenguajes que componen la


tecnología .NET: en la versión 1.0 de .NET Framework los lenguajes eran Visual Basic.NET, Vi-
sual C#.NET y Managed C++, mientras que el entorno integrado de desarrollo se conocía co-
mo Visual Studio.NET 2002. Por ser productos nuevos, existía la necesidad de diferenciarlos de
las propuestas anteriores; incluso internamente en la compañía se penalizaba a quien osara
referirse a Visual Basic.NET como Visual Basic 7. En la versión 1.1 de .NET Framework, los len-
guajes pasaron a ser Visual Basic.NET, Visual C# y Managed C++, y se trabajaba con Visual Stu-
dio.NET 2003. Ahora, en la versión 2.0 de .NET Framework, las versiones anteriores de los len-
guajes resultan anacrónicas, por lo que se conocen como Visual Basic, C# y C++. Se elimina
también el “.NET” en Visual Studio; el nombre de la última versión queda entones como Vi-
sual Studio 2005.

FIGURA 1.1
Estructura de la
plataforma .NET
Capítulo 1. Arquitectura de la plataforma .NET 9

Capa de lenguajes de .NET


1
CLS (Especificación común para lenguajes,
Common Language Specification)
No siempre prestamos atención a lo que una herramienta de desarrollo hace tras bambalinas,
dado que como programadores nos concentramos en que nuestra codificación produzca la res-
puesta esperada. En .NET, sin embargo, es importante conocer lo que sucede desde la codifi-
cación hasta la intervención del sistema operativo en la atención de las peticiones.
Para saber cómo funciona .NET debemos partir de un concepto denominado CLS (Especifica-
ción común para lenguajes, Common Language Specification). La CLS es el subconjunto de
capacidades mínimas soportadas por el motor de ejecución de .NET (CLR). Todas las herra-
mientas y componentes de .NET, por ejemplo, conviven y utilizan las clases de BCL, además
de ser orientadas a objetos; esto porque CLS lo determina como condición para formar par-
te de la tecnología .NET. El cumplimiento de estas reglas garantiza un comportamiento homo-
géneo de todos los componentes y herramientas de desarrollo .NET.
Todos los lenguajes .NET liberados por Microsoft cumplen con la CLS; esto convierte a
Microsoft .NET en un ambiente multi-lenguaje; es decir, un entorno donde todos los len-
guajes permiten hacer prácticamente lo mismo dado que cumplen con un mismo marco ori-
ginal de trabajo y funcionamiento (CLS).

NOTA

C# se lee “C Sharp” o “C Gato”; el signo “#” corresponde al de las partituras musicales.

Cualquier desarrollador experimentado puede aventurarse a desarrollar su propio lenguaje


de programación basado en .NET y proponerlo al mercado. Basta con desarrollar las herra-
mientas necesarias para el trabajo con el lenguaje, incluyendo el compilador y el analiza-
dor (parser) del mismo. El único requisito es que debe cumplir con todas las reglas defini-
das en la CLS.
Capacidades multi-lenguaje de .NET. Dado que todos los lenguajes de .NET cum-
plen con CLS, su programación es bastante similar.
A continuación ejemplificamos los efectos de esta especificación mediante el típico progra-
ma HolaMundo que muestra un mensaje.
El programa HolaMundo en C# sería el siguiente:
10 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

HolaMundo.cs
1 using system;
2 class HolaMundo
3 {
4 static void Main()
5 {
6 Console.WriteLine(“Hola Mundo”);
8 }
9 }

Y éste sería el código en Visual Basic:


HolaMundo.vb
1 Imports System
2 Class HolaMundo
3 Sub Main()
4 Console.WriteLine(“Hola Mundo”)
5 End Sub
6 End Class

Vea cómo el código es sorprendentemente parecido. Todos los lenguajes en .NET compar-
ten el mismo origen (CLS), y difieren solamente en la forma estructural de la codificación,
determinada por el estilo particular del lenguaje.

NOTA

La empresa japonesa Fujitsu enfrentó un problema común para muchas empresas grandes:
gran parte de sus desarrollos están en COBOL. ¿Cómo cambiar a la plataforma .NET sin sa-
crificar la inversión en desarrollo que ya se tiene? La solución que adoptaron fue generar un
COBOL que cumple con CLS; una especie de COBOL.NET.

Este antecedente muestra que las posibilidades son inmensas y la oportunidad de implemen-
tar nuevos lenguajes nunca había sido tan atractiva. Lo ideal para mucha gente sería dispo-
ner de poderosos lenguajes de programación en su lengua nativa, por ejemplo, en español.
¿Alguien se anima?

Además de proponer una arquitectura que facilita la creación de lenguajes, la CLS propor-
ciona interoperabilidad entre los mismos. En virtud de que todos los lenguajes .NET cum-
plen con una misma especificación, en una solución o aplicación pueden coexistir programas
desarrollados en diferentes lenguajes sin crear problemas de compatibilidad entre ellos.

Lenguajes .NET
La definición de lenguaje .NET es simple: todo aquel lenguaje de programación y
sus herramientas de análisis y compilación que cumplan con la CLS.
Capítulo 1. Arquitectura de la plataforma .NET 11

Los lenguajes .NET requieren someterse a un proceso de compilación, y el resultado de la


compilación debe ser un programa intermedio, que llamamos ensamblado (assembly); los 1
ensamblados pueden ejecutarse sólo en colaboración con el motor de ejecución de .NET
(CLR).
A todo programa que se ejecuta en colaboración con el Motor común de ejecución (CLR) se
le da el calificativo de administrado (managed), por lo cual, a los lenguajes de .NET también
se les conoce como lenguajes administrados (managed languages). En esencia, son adminis-
trados aquellos elementos ejecutados por el motor común de ejecución (en lugar de ser ejecu-
tados directamente por el sistema operativo).
Al ser administrados, los elementos disponen de servicios propios del motor común de eje-
cución como la recolección de basura (garbage collection), verificación de tipos en tiempo
de ejecución (runtime type checking), administración de la memoria (memory management)
y soporte de seguridad (security support), entre otros.

.NET Framework
Capa de servicios

La capa de servicios se encarga de proporcionar los medios de comunicación de datos entre


lenguajes y herramientas de desarrollo, y los elementos internos de .NET que se encargan
de transformar los desarrollos en aprovechamiento de recursos a través de lenguaje máqui-
na, es decir, el .NET Framework.
La capa de servicios está integrada por dos tipos fundamentales: ASP.NET Application Ser-
vices y Windows Application Services.
Estos servicios son en realidad modelos de programación que permiten la intercomuni-
cación entre la interfaz y el núcleo de la plataforma .NET. Cualquier lenguaje es útil para
programar y darse a entender para cualquiera de los servicios; la diferencia estriba en que
ASP.NET Application Services está dirigido a los desarrollos en ambiente Web (Internet,
Intranet y Computación móvil), mientras que Windows Application Services está dirigido
a los desarrollos en ambiente Windows (aplicaciones de escritorio y Cliente/Servidor).
12 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Biblioteca de clases base de .NET Framework (BCL)


Para entender la Biblioteca de clases de .NET Framework (BCL/Base Class Library), de-
bemos considerar primero que todo en .NET es un objeto, pues los lenguajes .NET son
completamente orientados a objetos.
Aunque después se analizará a fondo la programación orientada a objetos, es necesario
precisar muy brevemente algunas definiciones a efecto de explicar en qué consiste la BCL:

❑ Un objeto es un conjunto de datos y procedimientos que proporcionan una funcionali-


dad determinada.
❑ Otra definición clásica indica que un objeto es una instancia de una clase.
❑ Una clase es la definición formal de un objeto; es como una “plantilla “que especifica
los datos que un objeto puede manejar para identificarse, definirse y producir resulta-
dos; la clase también especifica los procesos que es capaz de realizar un objeto (com-
portamiento) y los resultados que proporciona.
❑ Al proceso de derivar un objeto a partir de una clase se conoce como instanciación.
❑ Los objetos tienen propiedades, métodos y eventos.
❑ Los métodos son las acciones predefinidas que es posible llevar a cabo a través de un ob-
jeto. Para utilizar un método es necesario instanciar un objeto —generarlo a partir de una
clase—; un método siempre es referido a través de un objeto.
❑ Existen clases, interfaces y tipos de valor que cumplen con CLS y permiten el acceso a la
funcionalidad de BCL sin necesidad de ser instanciados previamente; para diferenciarlos
de los que sí requieren instanciación, se conocen como types.

Con esto en mente, es fácil concluir que los programas desarrollados en .NET tienen co-
mo finalidad poner a trabajar, por medio de las estructuras del lenguaje, a los types y a los
objetos generados a partir de clases.
La biblioteca de clases base de .NET Framework integra una gran cantidad de clases, y cada
una de ellas ofrece una determinada funcionalidad que puede ser integrada a las aplicacio-
nes: algunas permiten crear objetos que desarrollan cálculos matemáticos o trigonométri-
cos, otras permiten definir objetos que permiten la realización de gráficos, otras más per-
miten crear objetos a través de los cuales es posible manipular bases de datos, etcétera.
Es muy difícil manejar y clasificar una cantidad tal de clases. Generalmente, las clases se
almacenan en librerías de vínculos dinámicos (DLL) que agrupan clases afines. La BCL se com-
pone de más de 150 archivos DLL, en los cuales se encuentran diseminadas las clases que
Composición
de la
componen la biblioteca de clases base.
plataforma
.NET Espacios de nombres (Namespaces). Tratar de encontrar librerías por nombre de ar-
chivo físico es bastante problemático. Las clases, como son tantas, se han categorizado y
Capítulo 1. Arquitectura de la plataforma .NET 13

agrupado de manera lógica y jerárquica de acuerdo con su funcionalidad. A dichos grupos


de clases se les conoce como Espacios de nombres (Namespaces).
1
NOTA

La forma más fácil de explorar la jerarquía de clases de .NET Framework es mediante la ayu-
da electrónica del producto. También está disponible una versión impresa, a través de Micro-
soft Press, a un precio no muy accesible para todos. Recomendamos el uso de los medios elec-
trónicos, ya que ahorran árboles, son más rápidos y van incluidos en el precio del producto.

Un programa puede contener objetos y emplear types; tanto los objetos como los types de-
rivan de clases que indistintamente están contenidas en librerías (DLL) de .NET, o bien en
clases desarrolladas por el usuario. Las clases que dan origen a los objetos y types utiliza-
das en un programa en .NET no necesariamente están contenidas en los mismos archivos
de librerías, pero al momento de programar eso es irrelevante para el desarrollador.
Disponibilidad de las clases: referencia y declaración de librerías. Para poder
hacer uso de una clase, es necesario especificar previamente en qué librería debe buscarse.
Esto implica referir el recurso físico y referir el recurso lógico. En otras palabras, hay que
definir qué librería se requiere (referencia física) y qué espacio de nombre la refiere (refe-
rencia lógica).
Para la referencia física es necesario que, al compilar, se establezca la referencia a la libre-
ría (DLL) requerida. Para la referencia lógica, dependiendo del lenguaje en el que se esté
codificando, se emplean instrucciones declarativas de espacios de nombre, tales como im-
port, using, include, etcétera, para que el programa pueda navegar sin problemas en la je-
rarquía de clases contenidas en la librería. La instrucción a utilizar varía en función al len-
guaje que se esté utilizando.
Instanciación de objetos. Una vez declaradas las librerías se dispone de las clases
contenidas en ellas. A partir de las clases, es posible generar objetos (instanciar), y una vez
que se cuenta con los objetos, es posible hacer uso de sus métodos para realizar alguna ta-
rea determinada.
Código type safe. Cuando los métodos de los objetos y los types utilizados por el pro-
grama son reconocidos por la plataforma .NET (como consecuencia de que todas las libre-
rías están correctamente referidas) se dice que el programa es type safe.
Un programa no es type safe cuando en él se utilizan clases contenidas en la biblioteca de
clases de .NET Framework, pero no se ha referido la librería específica en la cual se debe
buscar la clase, o bien, cuando no se han declarado los espacios de nombres que faciliten
la ubicación de la clase buscada dentro de la jerarquía.
14 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Jerarquías de clases superiores. Existen dos grandes espacios de nombres, System


y Microsoft, que a su vez tienen subdivisiones tales que las clases se organizan de manera
jerárquica con base en su funcionalidad. En virtud de que casi todas las clases de .NET Fra-
mework pertenecen de una u otra forma a cualquiera de estas dos jerarquías, se les llama
jerarquías de clases superiores.
La organización de clases a través de espacios de nombres es lógica; .NET Framework se
encarga de saber en todo momento qué librería o componente físico está asociado con un
determinado espacio de nombres. Realmente, especificar el espacio de nombres System im-
plica tener acceso a una librería que físicamente se llama Mscorlib.dll, y que se encuen-
tra en algún lugar de su equipo. Como puede ver, es más sencillo hacer referencia a la li-
brería a través del espacio de nombres que mediante una ruta de archivo físico.
Con los anteriores elementos es posible definir a la biblioteca de clases de .NET Frame-
work como una colección de clases incluidas en el ambiente de desarrollo .NET, disponi-
bles para todos los lenguajes .NET y organizadas en espacios de nombres que permiten
realizar tareas diversas a través del uso de objetos y types.
.NET Framework proporciona un sinfín de recursos para desarrollar aplicaciones; basta con
encontrar dónde están esos recursos. Al desarrollar en .NET es indispensable saber qué mé-
todos y types utilizar, en qué clase se encuentran y qué espacios de nombres permiten dis-
poner de dichas clases. Si la funcionalidad requerida no está en ninguna de las clases de
BCL, entonces será necesario desarrollar las propias.

FIGURA 1.2
Organización de
clases en BCL
Capítulo 1. Arquitectura de la plataforma .NET 15

Independencia de la biblioteca de clases y los lenguajes


1
Ninguno de los lenguajes tiene uso exclusivo de la librería de objetos de .NET; por el con-
trario, está disponible para todos. Este hecho es bastante significativo ya que todos los len-
guajes pueden hacer uso de las mismas clases, y, por tanto, podrán servir para lo mismo.
Anteriormente, los programadores de C++ presumían de conocer un lenguaje que les per-
mitía manejar los recursos de la computadora de una manera más profunda, y subestima-
ban a los programadores de Visual Basic por utilizar una herramienta “tan limitada”. Si un
programador de Visual Basic 6.0 deseaba desarrollar programas con la misma funcionali-
dad que C++, era necesario que aprendiera el manejo de API (Interfaz para la programación
de aplicaciones, Application Programming Interface) de Windows, y dicha opción podía ser
bastante compleja. Ahora eso ha cambiado, ya que con todos los lenguajes en .NET es posi-
ble hacer las mismas cosas.
Uno de los mayores beneficios que se obtienen al disponer de una biblioteca de clases pa-
ra su uso en varios lenguajes, es que el programador aprende un solo lenguaje y al mismo
tiempo aprende todos, en términos generales. Compare los códigos HolaMundo.cs (C#) y
HolaMundo.vb (Visual Basic), que se encuentran en este mismo capítulo; aun codificados
en distintos lenguajes, ambos utilizan un mismo espacio de nombres System, una misma
clase Console y un mismo type WriteLine( ). La forma de invocar a las clases y los types
en todos los lenguajes .NET es uniforme, y obedece a una sintaxis de separación punteada
(dotted) que diferencia espacios de nombres, clases y types (estos últimos, opcionales en
algunos casos):

Namespace.Class[.Type]

Además, todos los lenguajes tienen el soporte de un mismo entorno integrado de desarro-
llo, llamado Visual Studio, con el cual es posible codificar al mismo tiempo múltiples pro-
yectos en varios lenguajes.
Realizar esto antes de .NET era impensable. El desarrollador debía aprender las palabras
reservadas de cada uno de los lenguajes que aprendiera. Cada lenguaje poseía su propia bi-
blioteca de clases (Class Foundation), sus propias jerarquías y su propia sintaxis de invo-
cación. La experiencia que se ganaba con un lenguaje no servía de mucho al intentar desa-
rrollar en otro; además, cada lenguaje tenía su propia herramienta de desarrollo: el
programador consumía todo su tiempo en aprender a usar las herramientas de desarrollo y
las diferencias en los lenguajes, y le quedaba muy poco tiempo para ocuparse de los pro-
blemas reales de programación, como entender la lógica de negocios.
La plataforma .NET reduce la curva de aprendizaje y favorece el desempeño de los equi-
pos de desarrollo, ya que la especialización puede darse ahora en la solución de los proble-
16 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mas específicos mismos, y no en las herramientas de desarrollo para resolverlos; con ello
se aumenta la rentabilidad de los programadores y el retorno de la inversión en programas
y capacitación.

CLR (Motor común de ejecución,


Common Language Runtime)
Motor común de ejecución. Una de las características más interesantes que aporta
.NET es la modificación en la forma de compilar y ejecutar los programas.
Compilación en dos fases en .NET. La plataforma .NET compila los programas en
dos tiempos, separando la fase de análisis de la compilación, de la de síntesis. Para ello,
Clases y objetos juega un papel muy importante el CLR.
El CLR (Motor común de ejecución, Common Language Runtime) es el motor de ejecu-
ción de código administrado, que se encarga de proporcionar al programa en ejecución
servicios de alto nivel, tales como la integración de módulos multi-lenguaje, seguridad y
acceso a módulos de código, administración del ciclo de vida de los objetos, administra-
ción de memoria, recuperación de recursos, pistas de depuración, etcétera.
El CLR trabaja en dos tiempos:
1. Tiempo de compilación. Se inicia cuando el programador utiliza cualquier compila-
dor de lenguaje .NET para compilar un código fuente, y termina cuando se obtiene un
código intermedio a partir del código fuente compilado.
2. Tiempo de ejecución. Se inicia cuando se llama a ejecución un código intermedio y el
CLR se encarga de someterlo a la acción de compiladores Justo a tiempo que producen
código nativo, para luego producir los efectos esperados del programa.

NOTA

Los tiempos en los que se compilan y ejecutan los programas en .NET constituyen el rasgo más
característico de la nueva plataforma, pues representan una enorme diferencia con respecto a
las versiones anteriores del producto, por lo cual se analizan con mayor detalle más adelante.

A partir de los anterior, podemos definir al CLR como el motor de ejecución de código
administrado que provee una infraestructura de compilación y ejecución que abstrae y co-
loca en un plano subyacente las diferencias de plataformas de hardware en donde un
programa es ejecutado.
La definición anterior es compleja; el concepto mismo del CLR lo es. De manera simplifi-
cada podemos decir que el CLR se encarga de administrar la compilación y ejecución de
Capítulo 1. Arquitectura de la plataforma .NET 17

los programas en .NET, con el fin de que puedan aprovechar la biblioteca de clases y los
servicios de .NET Framework.
1
NOTA

No se sienta mal si tarda un poco en entender cómo trabaja el CLR: Piense que es el núcleo
de la nueva plataforma de desarrollo de Microsoft y que dicha compañía tardó años en dise-
ñarlo.

Compilador para generar código intermedio

CLR en tiempo de compilación. El trabajo de CLR comienza con un código redacta-


do en algún lenguaje .NET; dicho programa es un archivo de texto simple, que bien pudo
haber sido editado en el Bloc de Notas (Notepad.exe). Este programa se conoce como có-
digo fuente (source code).
El código fuente no es ejecutable. Para poder ejecutar un programa es necesario hacerlo
pasar por un proceso de compilación que consiste en revisar su sintaxis y estructura para
generar, si no tiene errores, un archivo que permita ser llamado a ejecución (ejecutable). El
software que se encarga de convertir un programa fuente en ejecutable recibe el nombre de
compilador; por ejemplo, el compilador específico de Visual Basic se llama vb.exe.
Ensamblado | assembly. Al compilar un programa en .NET se genera un ejecutable
reconocido solamente por la plataforma .NET, al cual se le da el nombre de ensamblado
(assembly). Un ensamblado es un conjunto de uno o más archivos implementados como
una sola unidad de ejecución sobre la cual se determina la accesibilidad y los permisos. Los
ensamblados son la unidad básica, mínima, de ejecución en .NET.
La compilación en .NET puede generar archivos de diversos tipos: exe, win exe, library o
module, con diferentes extensiones de archivo, como EXE o DLL. Independientemente de lo
que se genere, siempre será un ensamblado. Usted puede determinar qué tipo de ejecutable
desea obtener del proceso de compilación; si al compilar no se especifica el tipo de ejecu-
table que se desea generar, por omisión se creará un archivo EXE.
Metadatos. No obstante que tienen la misma extensión de archivo, no son iguales un eje-
cutable común y corriente, y uno generado por un compilador de .NET. El ejecutable crea-
do por alguno de los compiladores de .NET está compuesto por dos elementos: código y
metadatos (este último componente no existe en los ejecutables comunes).
El código es el conjunto de instrucciones que forman el programa; los metadatos describen
cada elemento que ha de ser administrado en tiempo de ejecución por el CLR; es informa-
18 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ción relativa al programa y su entorno como tipos de datos, versión del programa, referen-
cias externas a librerías, etcétera.
La diferencia entre un ejecutable .NET y uno que no lo es radica en la existencia del metada-
tos. Cuando un ejecutable se compila para plataforma .NET, y por tanto posee metadatos, se
considera un programa con código administrado (managed code).
Código administrado/managed code. Es importante mencionar que si su computado-
ra no tiene instalado el .NET Framework no podrá llamar a ejecución a los ejecutables de
.NET, pues en tal caso no tienen instalado el CLR, y éste es indispensable para acceder a
metadatos. Puede decirse que existe un contrato de cooperación entre el ejecutable y el
CLR. El calificativo “administrado” (managed) puede aplicarse a todo lo que se ejecuta ba-
jo un contrato de cooperación con el CLR, y que sin éste, no funciona.
Diversos nombres de los ensamblados. Los ejecutables que se obtienen después de
compilar el código fuente son conocidos de varias formas: el código administrado también
se conoce como ensamblado (assembly), MSIL (Microsoft Intermediate Language), IL (In-
termediate Language) o código ntermedio. El código intermedio es aquel que no es código
nativo aún, ya que sólo ha sido sometido a la fase de análisis del proceso de compilación.
El código intermedio es independiente de la plataforma en la que se ejecute y del lenguaje
en el cual fue escrito el código fuente que le dio origen; eso garantiza la portabilidad de las
aplicaciones, haciéndolas universales y multiplataforma.
El término que más se está utilizando es el de ensamblado. Por definición, un ensamblado
es una colección de funcionalidad, control de versiones e implementación que actúa como
la unidad básica de ejecución para el .NET Framework.

FIGURA 1.3
Tiempos de
compilación
en .NET
Capítulo 1. Arquitectura de la plataforma .NET 19

Manifiesto. Por poseer metadatos, los ensamblados siempre son autodescriptivos. Ca-
da ensamblado posee un manifiesto (assembly manifest), que es donde se almacenan los 1
metadatos.
El manifiesto es parte integral del ensamblado mismo, y en él se almacena la siguiente in-
formación:

❑ Identidad del ensamblado (Public Key Token).


❑ Referencia de los archivos que el ensamblado requiere para ser implementado.
❑ Types y otros recursos utilizados por el ensamblado.
❑ Dependencias con otros ensamblados.
❑ Permisos requeridos para ejecutar el ensamblado.

Gracias a la existencia de los manifiestos se hace innecesario guardar información en el re-


gistro de Windows, pues todo lo que se necesita saber se encuentra en el manifiesto del en-
samblado.
Copy deployment. Todo lo que necesita un ejecutable para trabajar se encuentra de-
clarado en el ensamblado; es por ello que un programa ejecutable en .NET trabajará con
solo ser copiado a otro equipo .NET. No hay que hacer instalaciones complejas o instalar
componentes; sólo se copia el ensamblado. A esto se le ha dado el nombre de implementa-
ción por copia (Copy Deployment). Esto, por supuesto, si el equipo donde se copia posee la
plataforma .NET, y en consecuencia, el CLR.

Caché global para ensamblado


(GAC, Global Assembly Cache)

Entre otras cosas, los ensamblados pueden ser librerías; en caso de que lo sean, existe la
posibilidad de utilizarlas en diferentes escenarios y aplicaciones, dado su carácter compar-
tido (shared). También es posible que existan otros desarrolladores en la misma organiza-
ción que desarrollen sus propias librerías.
Aunque remota, existe la probabilidad de que dos desarrolladores distintos generen, para
utilizar en una misma aplicación, una librería compartida con el mismo nombre. De permi-
tirlo .NET, se caería en la misma situación caótica de los DLL que tanto quisimos evitar en
Windows DNA.
Afortunadamente, en el caso de las librerías .NET compartidas, éstas deben registrarse en
un recurso llamado Caché global para ensamblados (GAC, Global Assembly Cache). Este
recurso almacena las entradas de los componentes y librerías .NET, registrando para cada
uno diferentes especificaciones, de entre las cuales destaca PublicKeyToken, que constitu-
ye un identificador único del componente.
20 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En el GAC se encuentran las referencias lógicas de los componentes que, junto con la re-
ferencia física que especificamos al momento de compilar, evita la utilización accidental
de un recurso. Puede haber dos componentes compartidos del mismo nombre físico, pero
un programa sabrá siempre cuál es el que debe utilizar.
Administrador de GAC. Existe una herramienta de .NET Framework, llamada gacutil.
exe, que permite administrar el registro de componentes compartidos en el GAC.

Dependiendo de lo que se quiera hacer, gacutil.exe permite listar los componentes registrados
en GAC, registrar un nuevo componente compartido o eliminar uno previamente registrado.

Ejercicio 1.1
Análisis de las entradas del Caché global para ensamblado (GAC,
Global Assembly Cache)

Se utilizará el administrador de GAC para conocer cuáles son los componentes .NET disponi-
bles. Esta práctica asume que se tiene instalado .NET Framework 2.0 SDK, English version.
1. Abra el Panel de control y seleccione Herramientas administrativas – .NET Frame-
work 2.0 Configuration. Se despliega la herramienta de configuración de .NET Frame-
work 2.0.
2. En el panel de la izquierda haga clic en el nodo My Computer; en el panel de la derecha
aparecerá el vínculo Manage the Assembly Cache (Global Assembly Cache).
Capítulo 1. Arquitectura de la plataforma .NET 21

3. Haga clic en el vínculo View List of Assemblies in the Assembly Cache.


4. Existe una columna llamada Locale, y no todos los ensamblados tienen el mismo valor
en dicha columna, ¿qué cree que signifique eso?
1

5. Existe una columna llamada Public Key Token, que contiene una clave GUID (Identifi-
cador global único, Global Unique Identifier), ¿para qué cree que sirva dicha clave?

6. Cierre el programa de configuración de .NET Framework 2.0.

.NET PE (.NET Portable Executable) versus PE/COFF

Si tanto usted como la empresa en que trabaja se están iniciando en la experiencia llamada
.NET, es probable que desee conocer cuáles son las diferencias entre los ejecutables gene-
rados en versiones anteriores de Visual Basic 6.0 y los generados en .NET. Es muy proba-
ble que al tratar de implementar proyectos en .NET surjan cuestiones del porqué hay que
instalar .NET Framework en las máquinas para poder ejecutar los programas .NET. Esto
genera suspicacias y dudas: ¿seguirán trabajando mis aplicaciones existentes?¿comenzará
a fallar mi equipo?, ¿tengo que pagar algo para poder ejecutar aplicaciones .NET?
Para ejecutar aplicaciones .NET es necesario instalar .NET Framework en los equipos, pe-
ro no la versión de desarrollo, sino el núcleo del producto, que es gratuito e independiente
de la instalación que un equipo tenga, por lo que no modifica las aplicaciones existentes.
22 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Lo que sí se modifica es el cargador de programas (program loader); es decir, la par-


te del sistema operativo que se encarga de reconocer a un programa ejecutable y de ejecu-
tar las acciones.
Archivo PE. Un ejecutable de Windows (Windows executable), sea EXE o DLL,
debe poseer un formato llamado PE Format (Portable Executable Format), que es un
derivado del Microsoft Common Object File Format (COFF). A los programas ejecu-
tables, por cumplir con la especificación PE, se les ha dado a llamar también Archivos PE.
Tanto PE como COFF están claramente especificados y disponibles públicamente, de tal
forma que todos los desarrolladores cuyas aplicaciones generen ejecutables puedan utili-
zarlos para incluir en ellas los elementos que permitirán a los programas generados ser re-
conocidos como tales. Cualquier compilador o aplicación que desee generar ejecutables de
Windows debe cumplir con la especificación PE/COFF.
Un programa ejecutable contiene dos secciones: la sección de encabezados PE/COFF
(PE/COFF Headers) y la sección de imagen nativa del programa (Native Image Section).
La sección de encabezados PE/COFF indica al sistema operativo cómo está compuesto el pro-
grama y cómo debe ser ejecutado; la sección de imagen nativa se encarga de contener al progra-
ma en sí, así como los recursos que lo componen, usando para ello subsecciones bastante co-
nocidas para los que han desarrollado compiladores, como lo son .data, .rdata, .rsrc, y .text.
Archivo .NET PE. Un archivo PE de .NET es más complejo pues contiene dos secciones
más: la sección de encabezados CLR (CLR Header Section) y la sección de datos
Tiempos de
compilación
CLR (CLR Data Section).
de CLR
El encabezado CLR almacena información que identifica al programa como ejecutable de
.NET para que como tal sea tratado por el cargador de programas. Por otro lado, la sección
de datos CLR contiene metadatos y el código intermedio, lo que determina la forma en que
el programa será ejecutado.
Como puede ver, las secciones del archivo PE permanecen. Si usted no tiene instalado
.NET Framework, el cargador de programas de Windows encontrará secciones no recono-
cidas (encabezado CLR y datos CLR), y no sabrá qué hacer con ellas. Como no fueron re-
conocidas dichas secciones y el código ejecutable de .NET no es código nativo, el progra-
ma generará un error. Sólo teniendo .NET Framework instalado será posible reconocer las
nuevas secciones del ejecutable, que ordenarán la compilación JIT de la información con-
tenida en datos CLR.
Capítulo 1. Arquitectura de la plataforma .NET 23

FIGURA 1.4
Diferencia de
ejecutables .NET
1

Desensamblador de ensamblados. .NET Framework posee una herramienta de línea


de comando para desensamblar los archivos ejecutables, llamada ildasm.exe. Con ella es po-
sible comprobar si un programa es o no .NET, mediante la ejecución del siguiente comando:

ildasm/TEXT NombreEjecutable/HEADER

Donde NombreEjecutable es el nombre del ejecutable a analizar. La especificación /TEXT


provoca que la salida sea a consola, y /HEADER provoca que aparezcan en el resultado to-
dos los encabezados del ejecutable.
Sólo si las definiciones muestran que el programa posee encabezados CLR, el programa es
.NET.

Ejercicio 1.2
Identificación de diferencias en programas ejecutables, usando el desen-
samblador de .NET (ildasm.exe)

Desensamblará dos ejecutables para determinar cuál de los dos es un ejecutable .NET.

1. Abra el directorio APVBNETVS\Cap01; ése será su directorio de trabajo.


2. En ese directorio hay dos programas: HolaMundoA.exe y HolaMundoB.exe. Los dos ha-
cen lo mismo, pero sólo uno de ellos es un .NET PE.
3. Ejecute el desensamblador de .NET Framework (ILDASM.EXE), que se encuentra en el
directorio base de .NET (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727).
4. Seleccione Inicio – Todos los programas – Microsoft .NET Framework SDK v2.0 – SDK
Command Prompt.
24 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5. Vaya al directorio de trabajo. En la línea de comandos escriba lo siguiente:


cd c:\APVBNETVS\Cap01
ildasm /TEXT HolaMundoA.exe /HEADER >a.txt
ildasm /TEXT HolaMundoB.exe /HEADER >b.txt

6. Es muy evidente cuál de los dos archivos no contiene un ejecutable .NET, dado que no
puede ser desensamblado.
7. Edite el archivo b.txt y busque la sección Metadata Version. ¿Qué ensambles externos
se mandan llamar desde este programa?

8. Cierre la sesión de línea de comandos.

FIN DEL EJERCICIO*

Compiladores JIT
CLR en tiempo de ejecución. El ejecutable generado por los compiladores de .NET
no está en código nativo, y, por tanto, su ejecución no implica que el equipo en el que es
ejecutado realice alguna acción.
Al correr un ejecutable en un equipo con .NET Framework, el cargador de programas del
sistema operativo busca en el programa el encabezado CLR y los datos CLR; si estas sec-
ciones existen quiere decir que se trata de un ensamblado (.NET PE), y procede a darle un
tratamiento considerado consecuente. De no ser así, procede a ejecutar el programa consi-
derándolo como archivo PE de Windows.
Si se trata de un .NET PE, el CLR identifica si ya ha sido ejecutado previamente en dicho
equipo. En caso de que sea la primera vez que se ejecuta en el equipo, el CLR detecta que
el ensamblado no es código nativo, y procede a generar código nativo a través de compi-
ladores que actúan en tiempo de ejecución, a los cuales se les llama compiladores Justo
a tiempo (compilador JIT / Just In Time Compiler).
Sólo para aclarar el punto: los compiladores JIT trabajan sobre ensamblados, no sobre có-
digo fuente.
Capítulo 1. Arquitectura de la plataforma .NET 25

El compilador JIT evalúa el ensamblado, la disponibilidad de los types utilizados por el en-
samblado y los recursos disponibles del sistema en que se está ejecutando el ensamblado. A 1
partir de ese análisis, genera el código nativo aplicable al equipo y procede a ejecutarlo.
Los compiladores JIT son los que realizan la fase de síntesis de la compilación, transfor-
mando el código intermedio que se encuentra en la sección de datos CLR en su equivalen-
te a código nativo de la máquina, considerando la plataforma de la misma y la disponibili-
dad de recursos.

NOTA
El hecho de que se realice la compilación JIT la primera vez que se ejecuta un programa eje-
cutable en .NET, hace que el proceso sea más lento.

Algunos programadores se decepcionan con .NET, pues argumentan que es más lento que las
plataformas de desarrollo anteriores; quizá sea más lento la primera vez, pero la segunda vez
que lo ejecute, el CLR detecta que ya existe código nativo creado, por lo que no procede a la
compilación JIT, y por tanto se puede ver la velocidad real a la que el programa se ejecutará.

Gracias al CLR los programas ejecutables de .NET son altamente portables. Quien deter-
mina la diferencia del código nativo que ha de ejecutarse en una determinada plataforma
es el CLR y no el ejecutable. Si un mismo ensamblado es ejecutado en dos equipos distin-
tos, uno con mucha memoria y varios procesadores, y otro con poca memoria y un solo
procesador, el CLR a través del compilador JIT generará el código nativo apropiado para
tomar ventaja de todos los recursos disponibles.
Vea las posibilidades: se puede tener una versión de .NET Framework en un equipo basa-
do en UNIX, otro en Linux y una versión compacta de .NET Framework en un teléfono
celular o en un PDA como la Palm Pilot. El mismo ensamblado puede ser ejecutado en to-
das las plataformas, y es el CLR a través del compilador JIT el que genera el código nati-
vo y la funcionalidad disponible para cada una de las plataformas mencionadas.
Poco importa también en qué lenguaje estaba desarrollado el código fuente que dio origen
al ejecutable: después de compilarlo, todo es IL.

NOTA
Resulta adecuado el nombre que se le da al ejecutable que generan los compiladores de .NET,
“código intermedio” (IL), ya que lo generado es un código entre el código fuente y el código
nativo. Los programadores de Java encontrarán la semejanza rápidamente: el IL sería como
el Bytecode, mientras que el CLR sería como el Java Virtual Machine.

Sólo un lenguaje de .NET permite (por el momento) la compilación directa a “casi” código na-
tivo: C++.
26 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

No tener instalado el .NET Framework en una máquina también afecta al momento de eje-
cución, ya que el equipo no sabrá cómo interpretar el ejecutable, además de no ser posible
transformar el IL en código nativo, por la ausencia de CLR. En ese contexto y dicho de
otra forma, su programa nunca podría producir a partir del ensamblado la secuencia de nú-
meros binarios que provoquen una respuesta en su computadora.

NOTA
En octubre de 2000, Microsoft propuso a la ECMA (Asociación Europea de Fabricantes de
Computadoras, European Computer Manufacturers Association), encargada de la estandari-
zación de sistemas de información y comunicación, un subconjunto funcional del CLR, deno-
minado CLI (Infraestructura de lenguaje común, Common Language Infraestructure) para que
fuera aprobado como estándar de desarrollo junto con el lenguaje C#.

En diciembre de 2001 se ratificó por ECMA (ECMA-335), por lo cual cualquier plataforma de
sistema operativo que así lo desee podrá disponer de su propio subconjunto de CLR, hacien-
do posible que las aplicaciones desarrolladas en .NET puedan ser ejecutadas en dichas plata-
formas sin modificar el código.

Microsoft ha puesto a disposición de todos un producto base denominado .NET Frame-


work Redistributable Package en su sitio Web corporativo. Al instalarlo en su equipo ya es
posible ejecutar aplicaciones desarrolladas en plataforma .NET. También lo está incluyen-
do en los Service Pack de sus sistemas operativos, y seguramente todos los sistemas ope-
rativos con versiones OEM lo incluirán.

FIGURA 1.5 Inicio

Proceso de Se solicita
ejecución .NET ejecución de
ensamblado

Se busca en
Assembly Cache
una imagen nativa
del Assembly

¿Se encontró
No imagen? Si

Compilador JIT
realiza la fase de ¿Es imagen
síntesis de No
vigente?
compilación

Si

Se envía imagen Se carga imagen


nativa a Assembly nativa en RAM
Cache

Se ejecuta la
imagen nativa

Fin
Capítulo 1. Arquitectura de la plataforma .NET 27

Ensamblador de .NET. Existen también herramientas de .NET Framework que permi-


ten realizar la fase de síntesis de la compilación, además del compilador JIT. El programa 1
ilasm.exe es el ensamblador de .NET Framework; su función consiste en transformar un
programa en código intermedio (MSIL) en archivo .NET PE.
Para aquellos que deseen desarrollar un lenguaje .NET, esta herramienta es muy importan-
te. Sólo tendrán que preocuparse por generar un compilador que traduzca el código fuente
a MSIL; es decir, que se encargue de realizar la fase de análisis. La fase de síntesis podrá
ser desarrollada por el ensamblador de .NET.
También es posible desensamblar un archivo .NET PE, a través de la herramienta de .NET
Framework llamada ildasm.exe.
Tanto ilasm.exe como ildasm.exe están disponibles desde la línea de comandos del sis-
tema operativo.

Impacto de .NET Framework


en los sistemas operativos
Los sistemas operativos son, a fin de cuentas, los que reciben las instrucciones de bajo ni-
vel para producir los efectos buscados en los programas, por lo cual no pueden sustraerse
a los cambios que .NET requiere para funcionar.

Modificación al cargador de ejecutables

Ya se indicó que los ejecutables de .NET no son iguales a los ejecutables PE/COFF; el sis-
tema operativo se ve modificado en este aspecto, ya que debe ser capaz de reconocer los
nuevos encabezados de las secciones que poseen los .NET PE.
Después de instalar .NET Framework en su equipo, el cargador de ejecutables será capaz
de reconocer tanto a los ejecutables de .NET como a los ejecutables PE/COFF.

Registro de biblioteca de clases base

Se instalan en su equipo todas las librerías de .NET Framework, y se registran a fin de que
pueda disponer de todas las clases de .NET.
No se confunda: el hecho de que usted no requiera registrar sus componentes en .NET en
el Registro de Windows, no quiere decir que las librerías de .NET no se registran de algu-
na forma.
28 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

.NET sigue teniendo entradas en el Registro de Windows, ya que es el mecanismo optimi-


zado que los sistemas operativos Windows entienden mejor; sin embargo, los desarrollos
en .NET que usted realice no estarán basados en componentes, sino en ensamblados. De
esa forma, el núcleo de .NET puede mantener manejo binario y registrado en los equipos
locales a través de componentes, mientras que las aplicaciones que usted desarrolle en
.NET ya no serán basadas en componentes, y se comunicarán a través de protocolos abier-
tos; en cierta forma, se aprovecha lo mejor de la tecnología disponible.
A medida que los sistemas operativos comiencen a reconocer elementos .NET, la tecnolo-
gía basada en componentes desaparecerá, aunque eso puede llevar tiempo.

Prerrequisitos del sistema operativo

El sistema operativo debe disponer de un mínimo de actualización; por ejemplo, se asume


que cuenta con una versión mínima de Internet Explorer, que tiene una amplia integración
con los sistemas operativos Windows.
También se requiere una versión actualizada de MDAC (Microsoft Data Access Compo-
nents), que permita desarrollar algunas asignaciones de base de datos internas del modelo
.NET.

Ventajas que brinda la


infraestructura de .NET
Algunos de los cambios que se vislumbran con la infraestructura que propone .NET son
los siguientes:

❑ Será posible implementar soluciones Windows DNA sin las complicaciones de COM,
ya que los ensamblados, en coordinación con el CLR, se encargan del manejo inteligen-
te de los componentes de una aplicación. La capa de presentación y la de reglas de ne-
gocio que propone DNA pueden modificarse drásticamente, ya que el procesamiento y
la interfaz de usuario pueden dividirse la carga de trabajo entre servidor y cliente de ma-
nera flexible.
❑ Se podrán generar programas portables (IL) que facilitarán el desarrollo de aplicaciones
empresariales distribuidas en diversas plataformas de sistema operativo con sólo insta-
lar el CLI en ellas.
❑ El desarrollo de aplicaciones nunca había sido tan diverso: se pueden desarrollar aplica-
ciones de escritorio y Cliente/Servidor a través de formularios de Windows (Windows
Forms). También es posible desarrollar aplicaciones de consola (Console Applications), y
Capítulo 1. Arquitectura de la plataforma .NET 29

aplicaciones Web (Web Forms) que tendrán una interfaz más rica y funcional, además de
ser más fáciles de elaborar para el desarrollador porque tendrán una lógica más depurada.
❑ Podrán desarrollarse servicios para los nuevos sistemas operativos de Windows, inclu-
1
yendo las versiones de 64 bits, con lo que se puede fortalecer la plataforma BackEnd.
❑ Con la introducción de los Servicios Web XML (XML Web Services), ya no se venderá
software, sino que se venderá el servicio que el software preste, mediante un esquema
de suscripciones. Disponer de la funcionalidad de un programa será tan fácil como en-
lazarnos a una liga en Internet; no se requerirán inversiones fuertes por compra de soft-
ware, sino el pago bajo y periódico por el acceso a un servicio. La piratería se reducirá,
como efecto secundario.
❑ Los equipos de desarrolladores que estaban divididos por su especialidad en determina-
das herramientas de desarrollo podrán colaborar de manera coordinada. Los programa-
dores de C++, C#, Visual Basic y Java podrán contribuir con partes de una misma solu-
ción, con la certeza de que el trabajo que realicen coexistirá con el trabajo del otro sin
incompatibilidades. Cada programador aprovecha la experiencia que ya tiene, y escoge
de .NET el lenguaje que más le favorezca.
❑ .NET coexiste con aplicaciones pasadas. Toda la inversión realizada en desarrollo de
aplicaciones basadas en COM sigue siendo útil; se puede convertir un componente
COM en uno .NET, y viceversa.
❑ Se desarrollará computación móvil como nunca antes, como consecuencia de las facili-
dades proporcionadas por el CLR, que gestionará por nosotros las características de ca-
da dispositivo.
En el capítulo siguiente podrá instalar todo lo que necesita para desarrollar en plataforma
.NET, y comprobar a través de aplicaciones de consola gran parte de lo que se explica en
este capítulo.

NOTA
Si conoce la estructura de un lenguaje .NET y el uso de las clases de .NET Framework, ya pue-
de desarrollar aplicaciones.

Visual Studio no es necesario para desarrollar. Por supuesto, ayuda enormemente, pero en ca-
so de que no disponga de dicho software, puede editar el código en cualquier editor de tex-
tos, como el Bloc de Notas (NotePad.exe), compilar su programa y ejecutarlo.

Convivencia de .NET y COM


Seguramente las organizaciones tienen desarrollos basados en componentes COM; cam-
biar de inmediato a .NET puede no ser posible, e incluso, puede no ser deseable.
En ese sentido, .NET puede convivir con componentes COM, y para ello utiliza dos herra-
mientas de .NET Framework: el exportador de librerías y el importador de librerías.
30 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El exportador de librerías (Type Library Exporter) está representado por el programa


tlbexp.exe, que se encarga de generar, a partir de un ensamblado, una librería con la cual
los componentes COM puedan interactuar.
El importador de librerías (Type Library Importer) es la contraparte, ya que a partir de un
componente COM, se genera un componente con el cual .NET pueda interactuar. Está re-
presentado por el programa tlbimp.exe.
Capítulo 1. Arquitectura de la plataforma .NET 31

MAPA MENTAL DEL CAPÍTULO


1
32 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Administración de COFF, 22 Importador de (COFF), 22


la memoria, 11 Common Language librerías, 30 Intermediate
Administrado, 8, 11, Runtime, 7, 16 Instanciación (de Language (MSIL),
18 Specification objetos), 12, 13 18
Administrador de (CLS), 7, 9 Instrucciones Motor común de
GAC, 20 Compilación, 17 declarativas de ejecución (CLR),
Application en dos fases, 16 espacios de 7, 16
Programming Compilador(es), 17 nombre, 13 MSIL, 18
Interface, 15 JIT, 7, 24 Interfaces, 12 Multilenguaje,
Archivo(s) Copy Development, Intermediate ambiente, 9
.NET PE, 22 6, 19 Language, 18 Namespaces, 12-3
PE, 22 Desensamblador de Intermedio, 18 Native Image
ASP.NET Application ensamblados, 23 Internet Section, 22
Services, 7, 11 DLL, 12 Information .NET
Assembly, 7, 11, 17 DNA, Windows, 28 Server (IIS), 7 lenguaje, 10
manifest, 19
Ejecutable, 17 Jerarquías de clases proceso de
Base Class Library
de Windows, 22 superiores, 14 ejecución, 26
(BCL), 7, 12
Ensamblado, 7, 11, JIT, compiladores, 7, .NET Framework, 7
BCL, 7, 12
17 24 Redistributable
Biblioteca de clases
Espacios de Just in Time Package, 26
base (BCL), 7, 12
nombres, 12-3 Compilers, 7, 24 .NET PE (Portable
C#, 9
Especificación Lenguaje(s) Executable), 21
Caché global para
común para administrados, archivo, 22
ensamblado, 19
lenguajes, 7, 9 11 Objeto, 12
Capa
Eventos, 12 .NET, 10 PE
de lenguajes, 7
Exportador de Librerías de vínculos /COFF Headers,
de servicios, 7, 11
de soporte librerías, 30 dinámicos (DLL), 22
operativo, 8 GAC, 19 12 archivos, 22
Cargador de gacutil.exe, 20 Managed, 8, 11, 18 format, 22
programas, 22 Garbage collection, code, 18 Plataforma .NET, 5
Clase, 12 11 languages, 11 Portable Executable
CLR, 7, 16 Global Assembly Manifiesto, 19 Format, 22
Data Section, 22 Cache, 19 Memory Proceso de
Header Section, IIS, 7 management, 11 ejecución .NET, 26
22 IL, 18 Metadatos, 17 Program loader, 22
CLS, 7, 9 ilasm.exe, 27 Métodos, 12 Propiedades, 12
Código, 17 ildasm.exe, 23, 27 Microsoft Public Key Token, 19
administrado, 18 Implementación por Common Object Recolección de
fuente, 17 copia, 19 File Format basura, 11
Capítulo 1. Arquitectura de la plataforma .NET 33

Referencia PE/COFF, 22 de compilación, vbc.exe, 17


física, 13 de imagen 16 Verificación de
lógica, 13 nativa del de ejecución, 16 tipos en tiempo
1
y declaración de programa, 22 Tipos de valor, 12 de ejecución, 11
librerías, 13 Security support, 11 tlbexp.exe, 30 Windows
Runtime type Servicios Web XML, tlbimp.exe, 30 Application
checking, 11 29 Type Library Services, 7, 11
Sección Soporte de Exporter, 30 DNA, 28
de datos CLR, 22 seguridad, 11 Importer, 30 executable, 22
de encabezados Source code, 17 Types, 12, 19 XML Web Service,
CLR, 22 Tiempo safe code, 13 29

PREGUNTAS
1.1 ¿Cuáles son las capas principales de la plataforma .NET y qué función cumple cada una?
1.2 ¿Cómo es el proceso de compilación de las aplicaciones desarrolladas en .NET y cuá-
les son los momentos en los que se desarrolla?
1.3 ¿Cuáles son las diferencias entre los ejecutables de .NET y los ejecutables Windows
comunes?
1.4 ¿Cuáles son las ventajas que aporta .NET a los ambientes de desarrollo?
1.5 ¿De qué forma se da la convivencia de .NET con los antiguos esquemas basados en COM?
34 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.

1. Es el conjunto de reglas mínimas que debe cumplir un lenguaje para ser considerado lenguaje .NET:
a) .NET Framework
b) CLR
c) CLS

2. Proporcionan los medios de comunicación de datos entre los lenguajes y las herramientas de desarro-
llo, y los elementos de .NET:
a) ASP.NET Application Services y Windows Application Services
b) XML Web Services
c) CLR

3. Es el conjunto de clases disponibles en .NET:


a) CLS
b) CLR
c) BCL

4. Es la información relativa al programa y su entorno, incluida dentro del mismo programa:


a) Metadatos
b) Ensamblado
c) Código administrado

5. Es el compilador que se encarga de la fase de síntesis de compilación, en el caso de programas .NET:


a) .NET PE
b) Compiladores JIT
c) csc

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Si .NET Framework no está instalado en un equipo, no se pueden ejecutar los pro-


gramas .NET PE.

7. Las clases de .NET Framework están disponibles para todos los lenguajes de .NET.

8. Es imposible que los componentes compartidos en .NET entren en conflicto, gracias


al GAC.

9. Los ensamblados de extensión EXE son código máquina ejecutable.

10. .NET Framework no está basado en COM, y no convive con dicha tecnología.
CAPÍTULO 2
.NET como multiplataforma
de desarrollo
Objetivos: Conocer las generalidades de los diversos productos que componen
la plataforma de desarrollo .NET y comprobar la posibilidad de desarrollar apli-
caciones de consola, Windows y Web con el mismo lenguaje de programación.

1. Aprenderá a decidir qué producto instalar —.NET Framework 2.0 Re-


distributable Package, .NET Framework 2.0 SDK o Visual Studio
2005— considerando sus necesidades de uso y desarrollo.
2. Conocerá los requerimientos de instalación de los productos de .NET.
3. Aprenderá qué tipos de aplicaciones es posible desarrollar en .NET y los
requisitos para hacerlo.

35
36 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Determinación de la plataforma .NET requerida . . . . . . . . . . . . . . . . . . . . . . 37
Propósito de usar .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Tipos de aplicaciones posibles en .NET . . . . . . . . . . . . . . . . . . . . . . . . . 37
Interacción con bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Alcance operativo de la plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Tecnología de bus y procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Productos de plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
.NET Framework 2.0 Redistributable Package . . . . . . . . . . . . . . . . . . . . 40
.NET Framework 2.0 SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
.NET Compact Framework 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Visual Studio 2005 Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Selección del producto adecuado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Consideraciones respecto del idioma de los productos . . . . . . . . . . . . . 46
Comprobación del funcionamiento de la plataforma .NET . . . . . . . . . 46
Determinación de los productos .NET a instalar en un
escenario de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Desarrollo de aplicaciones en .NET usando SDK . . . . . . . . . . . . . . . . . . . . . . 49
Compilación de programas desde línea de comandos . . . . . . . . . . . . . 49
Aplicaciones de consola (Console Applications) . . . . . . . . . . . . . . . . . . 49
Aplicaciones Windows (Windows Applications) . . . . . . . . . . . . . . . . . . 50
Aplicaciones Web (Web Applications) . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Desarrollo y compilación de un programa desde la
línea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Tecnologías cubiertas en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Capítulo 2. .NET como multiplataforma de desarrollo 37

El capítulo anterior incluyó una gran cantidad de términos nuevos relacionados con el nue-
vo entorno de desarrollo .NET; éste trata de comprobar si todo aquello es cierto.
Para pasar de las palabras a los hechos, usted comprobará la forma en que funciona la pla-
taforma de desarrollo .NET a través de programas sencillos escritos en Visual Basic.NET.
Este capítulo es particularmente importante para quienes tienen bajo su responsabilidad de-
cidir la migración a .NET de entornos de desarrollo anteriores, pues se aclaran cuáles son
los nuevos productos que .NET coloca en el mercado, sus requerimientos de hardware y 2
software, así como lo que es necesario hacer para ejecutar aplicaciones desarrolladas en es-
ta plataforma.
Veremos que .NET es una multiplataforma de desarrollo, ya que proporciona herramientas
de desarrollo para crear varios tipos de aplicaciones en distintos lenguajes y para diferen-
tes tipos de dispositivos.

Determinación de la plataforma
.NET requerida
La primera pregunta a plantear es: ¿Para qué queremos tener la plataforma .NET en nues-
tros equipos?
.NET cubre una gama sorprendente de aplicaciones. El producto .NET a instalar, los re-
querimientos de hardware y software correspondientes, y el precio a pagar dependen de lo
que se desee hacer.

Propósito de usar .NET

Hay dos propósitos principales que determinan las primeras decisiones:


1. Propósito de ejecución. Se refiere a sólo ejecutar aplicaciones .NET.
2. Propósito de desarrollo. Se aplica cuando se desea ejecutar y desarrollar aplica-
ciones .NET.

Tipos de aplicaciones posibles en .NET

Si el objetivo es el desarrollo, será necesario determinar el tipo específico. Puede tratarse


de alguna de las siguientes aplicaciones:
38 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

1. Aplicaciones de consola (Console Applications). Son aquellas aplicaciones tex-


tuales que reciben y muestran datos en el intérprete de comandos.
2. Aplicaciones Windows (Windows Applications/Windows Forms). Son las aplica-
ciones que tienen interfaz gráfica basada en Windows.
3. Aplicaciones Web (Web Applications/Web Forms / XML Web Services). Son aque-
llas que utilizan para su ejecución un navegador Web como Internet Explorer. La inter-
faz Web puede tener interacción con el usuario en un modelo petición-respuesta, basa-
do en Cliente/Servidor.
4. Servicios Web XML (XML Web Services). Son módulos de funcionalidad distribui-
da de aplicación a aplicación que utilizan como transporte protocolos estándares de In-
ternet, como HTTP y SOAP.
5. Aplicaciones de cómputo móvil (Mobile Applications). Son aplicaciones que se
ejecutarán en dispositivos de cómputo móvil, como los PDA (Personal Data Assistant)
y otros dispositivos inteligentes (smart devices). Funcionan en coordinación con .NET
Compact Framework, y son codificados mediante lenguajes de marcación.

Interacción con bases de datos

Considerando el uso de bases de datos que tendrán nuestras aplicaciones, la clasificación


es la siguiente:
1. Aplicaciones sin bases de datos. Son aquellas que no utilizarán bases de datos.
No realizan conexión con ningún motor de base de datos.
2. Aplicaciones con acceso a bases de datos soportadas de manera nativa. Son
aplicaciones que tienen acceso a bases de datos que cuentan con proveedores de datos
.NET nativos (Managed Providers) optimizados para el manejo de una base de datos es-
pecífica.
3. Aplicaciones con acceso a base de datos soportadas de manera no nativa. Son
aquellas aplicaciones que tienen acceso a bases de datos a través de proveedores de da-
tos genéricos ODBC u OLEDB, que no están optimizados para el manejo de bases de
datos específicas.

Alcance operativo de la plataforma

De acuerdo con el alcance operativo de la plataforma, la clasificación es la siguiente:


1. Cliente. Es cuando la plataforma .NET se utilizará para aplicaciones de escritorio,
generalmente de Windows, con manejadores de bases de datos de escritorio, como Ac-
cess, y de orientación monousuario.
Capítulo 2. .NET como multiplataforma de desarrollo 39

2. Servidor. Es cuando la plataforma .NET se utilizará para aplicaciones compartidas o


distribuidas, generalmente aplicaciones Windows y Web, con manejo de base de datos
basadas en servidor, como SQL Server y Oracle, de orientación multiusuario.

Tecnología de bus y procesador

Considerando la tecnología de CPU (procesador y bus) que se va a emplear: 2


1. 32 bits (x86). Cuando el equipo de desarrollo a utilizar será un equipo basado en
plataformas x86 a 32 bits.
2. 64 bits (x64). Es cuando el equipo de producción a utilizar será un equipo basado
en plataformas x64 a 64 bits.
Considerando estas características, es posible determinar la plataforma .NET adecuada.

Productos de plataforma .NET


Para cada combinación de necesidades existe un producto de plataforma .NET adecuado.
Actualmente los siguientes son los principales productos:
1. .NET Framework 2.0 Redistributable Package
a. x86
b. x64
2. .NET Framework 2.0 SDK
a. x86
b. x64
3. Visual Studio 2005
a. Visual Studio 2005 Standard Edition
b. Visual Studio 2005 Tools for the Microsoft Office System
c. Visual Studio 2005 Professional Edition
d. Visual Studio 2005 Team System
4. .NET Compact Framework (.NET Framework compacto)
5. Visual Studio 2005 Express Edition
a. Desarrollo Web:
i. Visual Web Developer 2005 Express Edition
b. Bases de datos
i. SQL Server 2005 Express Edition
c. Desarrollo de aplicaciones Windows
i. Visual Basic 2005 Express Edition
40 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ii. Visual C# 2005 Express Edition


iii. Visual C++ Express Edition
iv. Visual J# 2005 Express Edition
Cada uno de ellos tiene distintos requerimientos, capacidades y, desde luego, costos.

.NET Framework 2.0 Redistributable Package

Paquete de distribución .NET. .NET Framework 2.0 Redistributable Package. Es el


producto de plataforma .NET Framework que se debe instalar en caso de que únicamente
se desee ejecutar aplicaciones .NET. En términos generales, SDK habilita en los equipos
el motor de ejecución de la plataforma (CLR) y la biblioteca de clases base (BCL).
.NET Framework 2.0 Redistributable Package se recomienda para ambientes de producción,
tanto de aplicaciones de escritorio como Web. Un ambiente de producción se compone de
un equipo, generalmente un servidor, en donde se ejecutan las aplicaciones liberadas de for-
ma definitiva en operación real. Un ambiente de producción no debe ser ambiente de desa-
rrollo, para garantizar el máximo de disponibilidad de las aplicaciones para los usuarios.
.NET Framework 2.0 Redistributable Package provee a los equipos el motor de ejecución
(CLR) y la biblioteca de clases base (BCL), necesarios para ejecutar aplicaciones. Este
producto es indispensable para la ejecución de aplicaciones desarrolladas en .NET, pero
con él no se podrán desarrollar dichas aplicaciones.
En aplicaciones de escritorio (Windows y Consola), deberá instalarse .NET Framework 2.0
Redistributable Package tanto en los servidores como en los clientes. En el caso de los de-
sarrollos Web (Web Applications y Web Services), se deberá instalar sólo .NET Framework
2.0 Redistributable Package en el servidor, dado que es ahí donde se requiere el motor de
ejecución y la biblioteca de clases.
Requerimientos. Para conocer los requerimientos de hardware y software de este pro-
ducto, lo ideal es consultar la página Web de Microsoft, que se mantiene actualizada con-
forme se liberan productos.
Para disponer de la versión 2.0 de .NET Framework Redistributable Package en su ver-
sión para 32 bits, deberá descargar de la Web el archivo dotnetfx.exe. Lo podrá instalar
en Windows 2000 con Service Pack 3 o superior; Windows 98; Windows 98 Second Edi-
tion; Windows ME; Windows Server 2003 y Windows XP con Service Pack 2 o superior.
Ésta es la versión que se recomienda para los equipos de producción (operación real). En
producción generalmente se tienen servidores; se recomienda en esos casos contar con Mi-
crosoft Data Access Components 2.8 o superior. También se recomienda Internet Informa-
Capítulo 2. .NET como multiplataforma de desarrollo 41

tion Services (IIS) version 5.0 o posterior. Para proporcionar las capacidades de ASP.NET
se sugiere IIS con los últimos parches de seguridad, antes de instalar .NET Framework.
ASP.NET sólo es aceptado por las siguientes plataformas: Microsoft Windows 2000 Pro-
fessional (Service Pack 3 o superior recomendado), Microsoft Windows 2000 Server (Ser-
vice Pack 3 o superior recomendado), Microsoft Windows XP Professional y Microsoft
Windows Server 2003.
En su versión para 64 bits, se deberá descargar el archivo NetFx64.exe e instalar en Win- 2
dows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition;
Windows Server 2003, Standard x64 Edition; o Windows XP 64-bit.
A medida que las versiones se actualicen, seguramente los requerimientos serán mayores.

.NET Framework 2.0 SDK

Kit de Desarrollo de Software de .NET Framework. .NET Framework Software


Development Kit. Es el producto de plataforma .NET que se debe instalar si además de eje-
cutar aplicaciones se desea desarrollarlas. .NET Framework 2.0 SDK provee la funcionali-
dad de .NET Framework 2.0 Redistributable Package, pero además cuenta con todas las he-
rramientas para escribir, construir, probar e implementar aplicaciones.
.NET Framework contiene documentación, ejemplos y herramientas de línea de comando
para compilar y analizar los programas desarrollados.
Es importante mantener la congruencia de versiones; si desarrolla en .NET Framework
SDK, el .NET Framework Redistributable Package debe ser de una versión igual o poste-
rior, a fin de garantizar que todo funcionará. Por lo general, las versiones más nuevas de
.NET Framework Redistributable Package ejecutarán sin problemas los programas desarro-
llados con .NET Framework SDK de versiones anteriores. Sólo verifique que las nuevas
versiones no dejen obsoletas clases que usted haya utilizado, para evitar problemas.
.NET Framework 2.0 SDK se recomienda para ambientes de desarrollo, tanto de aplicacio-
nes de escritorio como Web. Un ambiente de desarrollo se compone de un equipo que gene-
ralmente emula a las capacidades de los equipos utilizados en producción, en donde se co-
difican, diseñan y prueban las aplicaciones en desarrollo. Recuerde: Un ambiente de desarrollo
no debe ser utilizado como ambiente de producción, para garantizar el máximo de disponi-
bilidad de las aplicaciones para los usuarios.
.NET Framework 2.0 SDK debe utilizarse cuando se pretende desarrollar y ejecutar progra-
mas en .NET, sin generar costos por la adquisición en herramientas de desarrollo, o bien
cuando se tiene un equipo de desarrollo de capacidades modestas; la desventaja es que las
herramientas de soporte al desarrollador son muy rudimentarias por lo que el tiempo de de-
42 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

sarrollo con SDK es mucho mayor que utilizando herramientas gráficas de desarrollo. Op-
te por SDK sólo si no quiere gastar y dispone de mucho tiempo.
Requerimientos. Para disponer de la versión 2.0 de .NET Framework SDK, en su ver-
sión para 32 bits, deberá descargar de la Web el archivo setup.exe (354 MB). Lo podrá
instalar en Windows 2000 con Service Pack 3 o posterior, Windows Server 2003 y Win-
dows XP con Service Pack 2 o posterior.
En su versión para 64 bits, se deberá descargar el archivo setup.exe (337.8 MB) e instalar
en Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64
Edition; Windows Server 2003, Standard x64 Edition y Windows XP 64-bit. Aunque el ar-
chivo a descargar tiene el mismo nombre, debe descargarse la versión adecuada a la plata-
forma operativa.
Es necesaria la instalación de .NET Framework 2.0 Redistributable Package, para poder
instalar .NET Framework 2.0 SDK.

NOTA
Por el momento .NET Framework SDK es gratuito y probablemente siga así. La razón es muy
sencilla: por sus características particulares, la competencia directa de la plataforma .NET es
Java. Para desarrollar en Java, desde hace mucho tiempo usted puede descargar el JDK (Java
Development Kit) de forma gratuita; por tanto, ponerle precio a .NET Framework SDK sería
darle ventaja a la competencia, por el momento Microsoft no puede darse ese lujo.

Visual Studio 2005


FIGURA 2.1
Visual Studio
2005 IDE
Capítulo 2. .NET como multiplataforma de desarrollo 43

Entorno Integrado de Desarrollo .NET. IDE / Integrated Development Environment.


Es el producto de plataforma .NET que permite desarrollar en un ambiente gráfico e inte-
grado totalmente a .NET Framework; Visual Studio 2005 es la herramienta de desarrollo
asistido más sofisticada de la historia: incluye editores con ayuda contextual, diseñadores
gráficos de aplicaciones, asistentes de desarrollo, generadores de código, etcétera.
Visual Studio 2005 instala automáticamente .NET Framework 2.0 Redistributable Package
y .NET Fremework 2.0 SDK, por lo que no es necesario instalarlas previamente. 2
En Visual Studio 2005 puede desarrollarse de manera visual cualquier tipo de aplicación
admitida por .NET, incluyendo las aplicaciones de computación móvil. Se puede elegir,
desde la misma plataforma, múltiples lenguajes .NET para desarrollar módulos que coexis-
tan dentro de una misma aplicación. Además, Visual Studio 2005 se integra con SQL Ser-
ver 2005 para facilitar el acceso de datos desde las aplicaciones .NET que se desarrollan.
La utilización de Visual Studio 2005 se recomienda cuando se dispone de un equipo robus-
to para el desarrollo, cuando se tiene la necesidad de desarrollar de forma rápida y efectiva
varios tipos de aplicaciones, cuando existe la posibilidad de interacción multi-lenguaje para
el desarrollo de aplicaciones profesionales con acceso a recursos de bases de datos. La des-
ventaja es el costo de la herramienta (el caso de desarrolladores profesionales, se justifica).
Existen varias versiones de Visual Studio 2005. La más elemental es la Standard Edition,
que está orientada a los desarrolladores individuales profesionales; el kit Tools for the Mi-
crosoft Office System es la versión de Visual Studio 2005 para la integración de aplicacio-
nes con la suite Microsoft Office; la Professional Edition permite los desarrollos individua-
les profesionales de alto desempeño, con funcionamiento multicapa; el más especializado
de los productos es Team System, que incluye herramientas para el desarrollo de aplicacio-
nes de alto desempeño. Ésta es ideal para equipos de desarrollo profesionales. Obviamen-
te, entre más especializada la edición, mayor es su costo.
Requerimientos de Visual Studio 2005. Si tiene la versión 2005 de Visual Studio
Standard Edition, que fue la que utilizamos para este libro, deberá disponer de 2 GB de es-
pacio en el disco duro, lo cual es un requerimiento importante. Se requiere tener instalado el
MDAC 9 o posterior, básicamente porque es el que permite los accesos a SQL Server 2005.
Los sistemas operativos en los que podrá instalar Visual Studio 2005 son Windows 2000 con
Service Pack 4 o posterior, Windows XP con Service Pack 2 o posterior y Windows 2003
Server o posterior.
En caso de querer desarrollar en plataforma Web, se debe tener la versión profesional de
Windows 2000 y XP, ya que son los que proveen IIS.
Se debe contar, además, con Internet Explorer 6.0 o posterior.
44 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Para otras versiones de Visual Studio 2005, consulte las especificaciones técnicas en el si-
tio de Microsoft.

> Lo nuevo
En Visual Studio 2005 se tienen varias configuraciones predefinidas. Al iniciar por primera vez
el uso de la herramienta se solicita el tipo de configuración que el desarrollador prefiere uti-
lizar. En caso de este libro seleccionamos las preferencias para un desarrollador en Visual Stu-
dio (General Development Settings). Esto determina las herramientas activas y visibles por
omisión, las teclas de atajo y la distribución de los menús. Todas las modificaciones que haga-
mos pueden ser guardadas a través de la opción Tools Import and Export Settings. En otras
palabras, si tenemos que desarrollar en un equipo distinto al que utilizamos regularmente,
podemos llevarnos la configuración de nuestras preferencias.

.NET Compact Framework 2.0

.NET Framework compacto. .NET Compact Framework. Es el producto de plataforma


.NET que permite integrar a los dispositivos inteligentes con un conjunto compacto de fun-
ciones disponibles en .NET Framework, a fin de que se puedan ejecutar aplicaciones .NET,
principalmente en Pocket PC (ahora Windows Mobile) y equipos con Windows CE.
Lo que pretende Microsoft es extender su plataforma de desarrollo para atender cualquier
tipo de dispositivo de cómputo, desde PDA hasta teléfonos celulares. Por su parte, los con-
troles de computación móvil atienden a todo tipo de dispositivos que tienen capacidad de
enlazarse a una página en Internet, mientras que .NET Compact Framework se encarga
de aquellos dispositivos que poseen sus características de operación independientes de una
conexión a Internet.
.NET Compact Framework 2.0 debe instalarse en aquellos dispositivos inteligentes en don-
de se pretendan ejecutar aplicaciones .NET; es muy similar en concepto a .NET Redistribu-
table Package, con las limitaciones obvias que se aplican a los dispositivos móviles, pues ins-
tala versiones reducidas de CLR y de BCL aplicables a los ambientes de cómputo móvil.
En sí, .NET Compact Framework es un subconjunto de .NET Framework; consiste en una
librería de clases base, además de librerías específicas para dispositivos móviles. .NET
Compact Framework ejecuta una versión avanzada del compilador JIT que forma parte de
un depurado CLR capaz de manejar eficientemente la escasez de recursos de los dispositi-
vos móviles, cuidando el espacio de memoria y el consumo de batería. Visual Studio 2005
y .NET Framework 2.0 SDK contienen los elementos de .NET Compact Framework, para
que el desarrollador pueda producir aplicaciones de cómputo móvil.
Capítulo 2. .NET como multiplataforma de desarrollo 45

Los dispositivos que han de ejecutar aplicaciones basadas en el .NET Compact Framework
deben aceptar el .NET Compact Framework runtime (Motor de ejecución de .NET Compact
Framework). El motor de ejecución requiere como mínimo Windows CE .NET o Windows
Mobile 2003 software for Pocket PCs. Los dispositivos deberán contar con Windows Mo-
bile Software for Pocket PC 2003, Windows Mobile 5.0 for Pocket PC and Smartphone,
Windows CE .NET 5.0 o superiores.

Visual Studio 2005 Express 2


Visual Studio 2005 Express Edition. Para favorecer el aprendizaje de las tecnologías
.NET en un ambiente gráfico, Microsoft ha liberado lo que denomina versiones express.
Las versiones express son subconjuntos de las herramientas de desarrollo gráfico para pla-
taforma .NET, específicamente Visual Studio 2005. Las versiones express se orientan a ti-
pos de desarrollo y lenguajes utilizados; es decir, se puede disponer de productos para de-
sarrollo Web o para desarrollo Windows, pero no ambas. También se puede optar por un
lenguaje: Visual Basic.NET, Visual C#, Managed C++ o Visual J#, pero no de todos de ma-
nera conjunta.
Las versiones express permiten el desarrollo de aplicaciones, robustas, pero no poseen
toda la funcionalidad y herramientas de Visual Studio 2005, especialmente el soporte de
trabajo colaborativo.
Para disponer de toda la funcionalidad multi-lenguaje de .NET, será necesario adquirir Vi-
sual Studio 2005.
Dentro de las ventajas de las versiones express es que son gratuitas el primer año, exigen
menos recursos que Visual Studio 2005 y permiten experimentar el ambiente gráfico de Vi-
sual Studio 2005 sin hacer una inversión inicial.
Ciertamente, las versiones express no se recomiendan para ambientes profesionales de de-
sarrollo dadas sus limitaciones.

Selección del producto adecuado

La versión 2.0/2005 de los productos que componen la tecnología Microsoft .NET pueden
seleccionarse atendiendo los siguientes parámetros:
46 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 2.2
Selección de
producto

Consideraciones respecto al idioma de los productos


Algunos recomiendan que instale los productos en su idioma nativo, es decir, el inglés, ya
que contará con el soporte más actual, corrección de errores, ayuda y documentos técnicos
actualizados todo el tiempo. El resto de los lenguajes siempre estarán rezagados.
Aunque Microsoft no es ajeno a la globalización y progresivamente se desarrollan los pro-
ductos en diversos idiomas, nuestra recomendación es instalar los productos en inglés, a
fin de que cuente con lo más reciente todo el tiempo.
Como desarrollador, seguramente tendrá que consultar foros en Internet, así como MSDN,
en inglés. Entre más se haga a la idea que debe dominar dicho lenguaje, es mejor.
Al instalar Visual Studio 2005, sobre todo en equipos cuyo sistema operativo no es muy
actual, se requiere la instalación de prerrequisitos, que incluyen modificaciones al sistema
operativo y al navegador.
Para ambientes de desarrollo se recomienda instalar Visual Studio 2005 en el idioma del
sistema operativo del equipo, ya que de otra forma es posible que la instalación de los pre-
rrequisitos reemplace elementos del sistema operativo. Si se mezclan idiomas es probable
que comience a ver las opciones de los menús de Windows en dos idiomas, así como los
mensajes del sistema.
Se recomienda, por tanto, instalar en los equipos de desarrollo un sistema operativo en in-
glés. De esa forma tanto el sistema operativo como Visual Studio 2005 estarán en inglés,
lo que garantiza la máxima actualización de herramientas, service packs, parches de segu-
ridad, entre otros.

Comprobación del funcionamiento de la plataforma .NET


Es sencillo comprobar la instalación, tanto de Visual Studio 2005 como de .NET Frame-
work 2.0 SDK, ya que ambos agregan entradas al menú principal de Windows.
Capítulo 2. .NET como multiplataforma de desarrollo 47

Lo verdaderamente importante que debemos comprobar es si ya disponemos de un nuevo


entorno de desarrollo de aplicaciones basadas en .NET, con toda la funcionalidad del .NET
Framework y CLR.
Para hacerlo es necesario que haya instalado cualquiera de los productos de desarrollo; es
decir, que haya instalado el .NET Framework 2.0 SDK o Visual Studio 2005.

NOTA
2
En su equipo ya debe estar instalado el software que requiere para trabajar. Se trabajará des-
de línea de comandos para mejorar el entendimiento de la plataforma; posteriormente se tra-
bajará con Visual Studio 2005 para mayor rapidez. Se debe tener instalado en su equipo Mi-
crosoft .NET Framework 2.0 SDK y además Visual Studio 2005. El uso de una u otra plataforma
se determinará por la didáctica del tema que se esté tratando.

Ejercicio 2.1
Determinación de los productos .NET a instalar
en un escenario de trabajo

En el presente ejercicio aprenderá a determinar la cantidad y los tipos de productos que es


necesario instalar en un escenario real.
Se tiene un escenario compuesto como sigue:

Las aplicaciones de una empresa se encuentran en una distribución multicapa, de la si-


guiente manera. Se tienen tres servidores; uno de ellos es el servidor de bases de datos que
da servicio de almacenamiento de datos a las aplicaciones y objetos de negocios y trabaja
48 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

sobre Windows Server 2003, Datacenter x64 Edition. Otro de los servidores es de aplica-
ciones y hospeda todos los objetos de lógica de negocio, así como las aplicaciones de es-
critorio basadas en interfaz Windows; trabaja sobre Windows Server 2003, Enterprise x64
Edition. El último es el servidor Web, que consume datos y funcionalidad de los otros dos
servidores; trabaja en un equipo Windows 2003 Server.
Se tienen dos aplicaciones principales, construidas en casa, SIO (Sistema Integral de Ope-
raciones), que proporciona todo el control de los procesos de producción. Por lo complejo
de las interfases, se decidió que fuera una aplicación Windows Forms.
La otra aplicación importante es SICOM (Sistema de Comercialización), que proporciona
información y pronósticos de ventas, así como información relevante para la administra-
ción financiera del negocio. Como la información puede ser consultada tanto dentro como
fuera de la empresa, se decidió que fuera un desarrollo Web. Esta aplicación está desarro-
llándose como prueba de concepto, por lo que fue instalada en el servidor menos fuerte;
por el momento, se ha dado un plazo de cuatro meses de prueba y, si es útil, se desarrolla-
rá con mayor calidad y potencia.
Por el momento sólo tres usuarios utilizan SIO. Por otro lado, dos personas utilizan SI-
COM; uno de ellos es el director general, que puede enlazarse desde su equipo, cuando es-
tá en la empresa, o desde su PDA, cuando anda fuera de ella.
Se tienen dos desarrolladores en la empresa: uno que se encarga del desarrollo y manteni-
miento de SIO, y otro que se ocupa del desarrollo y mantenimiento de SICOM. Los tiem-
pos de desarrollo asignados son muy estrechos, pues SIO es crítica y compleja, mientras
que SICOM es un poco más sencilla, y como se dijo, es prueba de concepto.
¿Qué cantidad de cada producto es necesaria para dar soporte a la operación de la empre-
sa? Cuide el mayor aprovechamiento de los recursos de cómputo y el menor costo.

Producto Cantidad
.NET Framework 2.0 Redistributable Package (x86)
.NET Framework 2.0 Redistributable Package (x64)
.NET Framework 2.0 SDK (x86)
.NET Framework 2.0 SDK (x64)
Visual Studio 2005
Visual Web Developer 2005 Express Edition
Visual Basic 2005 Express Edition
.NET Compact Framework 2.0

FIN DEL EJERCICIO*


Capítulo 2. .NET como multiplataforma de desarrollo 49

Desarrollo de aplicaciones en .NET


usando SDK
Compilación de programas desde línea de comandos

En esta sección se compilarán programas desde línea de comandos, por lo que es importan-
te saber cómo hacerlo. 2
La forma más sencilla de compilar un programa de Visual Basic.NET es la siguiente:
vbc NombreCódigoFuente.vb

El programa vbc.exe es el compilador de Visual Basic.NET. Al someter a compilación al


programa NombreCódigoFuente.vb, se generará de inmediato un ensamblado de nombre
NombreCódigoFuente.exe. Observe cómo es necesario especificar la extensión del archivo
que contiene el código fuente.
Hay ocasiones en que los programas hacen uso de clases que pertenecen a la biblioteca de
clases de .NET Framework, por lo que es necesario establecer referencias que permitan a
los programas saber en qué archivos se encuentran las clases que utilizamos. Para ello re-
currimos a la especificación “/r:”. Suponga que un programa requiere clases que se en-
cuentran en una librería de nombre System.dll. La sintaxis sería la siguiente:
vbc NombreCódigoFuente.vb /r:System.dll

Si se requieren varias librerías, podemos separarlas por comas (sin dejar espacio entre una
y otra) o repetir la especificación “/r:”. Si además de System.dll, requerimos System.
Drawing.dll, ésta sería la sintaxis:

vbc NombreCódigoFuente.vb
/r:System.dll,System.Drawing.dll

vbc NombreCódigoFuente.vb /r:System.dll


/r:System.Drawing.dll

Las diferentes especificaciones que se utilizan para compilar archivos en Visual Basic.NET
se irán revisando conforme los ejemplos lo vayan requiriendo.

Aplicaciones de consola (Console Applications)

Las aplicaciones de consola son aquellas aplicaciones textuales que reciben y muestran da-
tos en el intérprete de comandos.
50 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La secuencia de desarrollo de este tipo de aplicaciones es la siguiente:


1. Se abre una sesión de comando (MS-DOS).
2. Con un editor de texto se edita el programa (con extensión vb).
3. Se compila el programa sin olvidar establecer las referencias con las librerías de .NET
que se requieren para la funcionalidad propuesta por el mismo.
4. Se ejecuta el programa.

Aplicaciones Windows (Windows Applications)

Son aquellas que tienen interfaz gráfica basada en Windows.


La secuencia de desarrollo de este tipo de aplicaciones es la siguiente:
1. Se abre una sesión de comando (MS-DOS).
2. Con un editor de texto se edita el programa (con extensión vb).
3. Se compila el programa, sin olvidar establecer las referencias con las librerías de .NET
requerida para la funcionalidad propuesta por el mismo. Son indispensables, al menos,
las librerías System.dll, System.Drawing.dll y System.Windows.Forms.dll.
4. Se ejecuta el programa.

Aplicaciones Web (Web Applications)

Son aquellas aplicaciones que utilizan para su ejecución un navegador Web como Internet
Explorer.
Éstas son especiales en el sentido de que no se compilan como las aplicaciones de consola
o Windows. Trabajan en combinación con el motor de Servicios Web XML de Microsoft;
es decir, el Internet Information Services (IIS), que debe estar instalado en la máquina don-
de se alojará el programa.
Para comprobar que se tiene instalado IIS, se ingresa al Panel de control, y en Agregar y
quitar programas, Agregar o quitar componentes de Windows; deberá aparecer Internet
Information Server marcado en la lista.
Otra forma es ingresar al Internet Explorer e ir al URL http://localhost si se trata de
nuestro equipo; si no es nuestro equipo el que posee IIS, deberá sustituirse localhost por
el nombre del equipo que lo posea. Si aparece contenido en el navegador, es que está fun-
cionando IIS.
Capítulo 2. .NET como multiplataforma de desarrollo 51

Otra forma, aunque no definitiva, es comprobar la existencia del directorio \inetpub, en


la unidad donde se aloja el sistema operativo. Dicho directorio es el directorio de Servicios
Web. No es definitiva porque puede existir el directorio pero no disponerse de los Servi-
cios Web XML.
Dentro del directorio de Servicios Web XML se encuentra el directorio raíz de aplicaciones
Web, llamado \inetpub\wwwroot; todo lo que se encuentre en dicho directorio o en algún di-
rectorio contenido en él será tratado como sitio Web, y, por tanto, .NET Framework aplicará
los procesos de compilación y ejecución de aplicaciones Web de manera automática.
2
Estos temas se tratan a mayor detalle cuando se estudia ASP.NET.
La secuencia de desarrollo de aplicaciones Web es la siguiente:
1. Se abre una sesión de comando (MS-DOS).
2. Con un editor de texto, se edita el programa (extensión aspx).
3. Se copia el archivo a un directorio que de manera física o virtual se encuentre dentro del
directorio de Servicios Web.
4. Se ejecuta el programa abriéndolo desde el navegador (Internet Explorer, por ejemplo),
utilizando el protocolo http.
Como pudo comprobar, Visual Basic.NET es el mismo lenguaje para todos los programas;
lo que difiere es la interfaz, la forma de compilar y la plataforma de ejecución. Aprenda Vi-
sual Basic.NET para todos los tipos de aplicaciones.

Ejercicio 2.2
Desarrollo y compilación de un programa desde la línea de comandos

En el presente ejercicio aprenderá a desarrollar un programa de consola utilizando SDK y


comprobará el funcionamiento de .NET Framework en su equipo.
1. Con cualquier editor de texto simple, edite el programa HolaMundo.vb (que reside en el
directorio C:\APVBNETVS\Cap02, que será nuestro directorio de trabajo).
52 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de HolaMundo.vb
1 Imports System
2 Imports System.Drawing
3 Imports System.Windows.Forms
4 Imports Microsoft.VisualBasic
5
6 Module HolaMundoB
7 Dim frmHola As New Form()
8 Dim lblMensaje As New Label()
9 Dim WithEvents btnAceptar As New Button()
10
11 Sub Estado()
12 frmHola.ClientSize = New Size(200, 100)
13 frmHola.Name = "frmHola"
14 frmHola.StartPosition = FormStartPosition.CenterScreen
15 frmHola.Text = "Hola Mundo"
16
17 lblMensaje.Location = New Point(16, 16)
18 lblMensaje.BorderStyle = BorderStyle.Fixed3D
19 lblMensaje.Name = "lblMensaje"
20 lblMensaje.Size = New Size(150, 20)
21 lblMensaje.Text = ""
22
23 btnAceptar.Location = New Point(16, 50)
24 btnAceptar.Name = "btnAceptar"
25 btnAceptar.Size = New Size(150, 32)
26 btnAceptar.Text = "Haz clic"
27
28 frmHola.Controls.Add(lblMensaje)
29 frmHola.Controls.Add(btnAceptar)
30 End Sub
31
32
33 Private Sub btnAceptar_Click(ByVal sender As System.Object,
34 ByVal e As System.EventArgs) Handles btnAceptar.Click
35 lblMensaje.Text = "Hola Mundo"
36 End Sub
37
38 Sub Main()
39 Estado()
40 frmHola.ShowDialog()
41 End sub
42
43 End Module
Capítulo 2. .NET como multiplataforma de desarrollo 53

2. Seleccione Inicio – Todos los programas - Microsoft .NET Framework SDK v2.0 –
SDK Command Prompt.
3. En la ventana de comandos, traslade el control al directorio de trabajo.
cd \APVBNETVS\Cap02

4. Compile el programa desde línea de comandos.


vbc HolaMundo.vb 2
5. Ejecute el programa.
HolaMundo

6. Si el programa funciona, habrá comprobado que puede desarrollar aplicaciones Win-


dows sin contar con una herramienta de desarrollo gráfico.
FIN DEL EJERCICIO *

Tecnologías cubiertas en este libro


Como ya aprendió, existen múltiples opciones de productos en tecnología .NET, y este li-
bro tiene que decidirse por una configuración que permita demostrar todos los tópicos que
lo componen. Además, esta opción debe ser razonable en cuanto a la cantidad de requeri-
mientos de hardware y software.
Se considera un escenario de trabajo en español y se asume que usted cuenta con un equi-
po en plataforma de 32 bits con el siguiente software básico instalado:
❑ Sistema operativo Windows XP Professional en español, con Service Pack 2, instalado.

❑ Internet Information Server 5.0 (IIS), instalado y operando.

❑ Internet Explorer 6.0, en español.

❑ MDAC (Microsoft Data Access Components) 2.8.

❑ SQL Server 2005, en inglés.

❑ .NET Framework 2.0 Redistributable Package, en inglés.

❑ .NET Framework 2.0 SDK, en inglés.

❑ Visual Studio 2005, Standard Edition, en inglés.

Son útiles otras versiones, superiores o más robustas, del sistema operativo, de Internet Ex-
plorer, Internet Information Server y MDAC.
54 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se puede comprobar si IIS está instalado y funcionando, si desde el Internet Explorer se ob-
tiene respuesta al abrir la página http://localhost.
Para simplificar el texto, se tienen las siguientes equivalencias:

Si se hace referencia a: Estamos hablando de:


Windows / Windows XP Professional, con Service Pack 2
Sistema Operativo en español.
Internet Explorer Internet Explorer 6.0 o posterior, en español.
MDAC MDAC 2.8 o posterior.
.NET Framework Plataforma .NET Framework, compuesta por .NET
Framework 2.0 Redistributable Package y .NET
Framework 2.0 SDK, en sus versiones en español.
SQL Server SQL Server 2005, en inglés.
Visual Studio Visual Studio 2005, en inglés.
Visual Basic Visual Basic.NET 2005
C# Visual C# 2005
C++ Managed C++ 2005
ASP.NET ASP.NET 2.0
ADO.NET ADO.NET 2.0
Capítulo 2. .NET como multiplataforma de desarrollo 55

MAPA MENTAL DEL CAPÍTULO

2
56 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Ambiente de Integrated Development setup.exe (64 bits),


producción, 40 Development Kit, 41 42
Aplicaciones Environment NetFx64.exe, 41 Smart devices,
de cómputo (IDE), 43 ODBC, 38 38
móvil, 38 Kit de desarrollo de OLEDB, 38 vbc.exe, 49
de consola, 38, software de .NET PDA, 38 Visual Studio 2005,
49 Framework, 41 Personal Data 43
Web, 38, 50 Managed Providers, Assistant (PDA), Express Edition,
Windows, 38, 50 38 38 45
Cliente, 38 Mobile Proveedores de Web Applications,
Console Applications, 38 datos 38, 50
Applications, 38 .NET Compact genéricos ODBC Web Forms,
Controles de Framework, 38, u OLEDB, 38 38
computación 44 .NET nativos, 38 Windows
móvil, 44 .NET Framework Servicios Web XML, Applications, 38,
Dispositivos 2.0 38 50
inteligentes, 38 Redistributable Servidor, 39 Forms, 38
dotnetfx.exe, 40 Package, 40 setup.exe (32 bits), XML Web Services,
IDE, 43 Software 42 38

PREGUNTAS
2.1 ¿Cuáles son los factores a determinar antes de seleccionar un producto de desarrollo
.NET?
2.2 ¿En qué casos se recomienda utilizar Visual Studio 2005?
2.3 Suponiendo que su trabajo consista en desarrollar, ¿cuál es el producto .NET que me-
jor satisface sus necesidades?
Capítulo 2. .NET como multiplataforma de desarrollo 57

Notas:

2
58 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.

1. Es el producto de plataforma .NET ideal cuando se desea sólo ejecutar aplicaciones:


a) .NET Framework 2.0 Redistributable Package
b) Visual Studio 2005
c) .NET Framework 2.0 SDK

2. Es el producto de plataforma .NET ideal para desarrollar aplicaciones sin usar herramientas gráficas:
a) .NET Framework 2.0 Redistributable Package
b) .NET Compact Framework
c) .NET Framework 2.0 SDK

3. Permite la ejecución de aplicaciones .NET en dispositivos inteligentes:


a) Visual Studio 2005
b) .NET Framework 2.0 SDK
c) .NET Compact Framework

4. No es un tipo de aplicación .NET:


a) Aplicación de consola
b) Aplicación Web
c) Aplicación batch

5. Es el compilador de Visual Basic:


a) VB
b) VBC
c) JITVB

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Visual Studio Standard puede instalarse en Windows 98.


7. Los programas desarrollados en .NET no se pueden ejecutar en Windows 95.
8. Es necesario instalar .NET Framework Redistributable Package para poder instalar Vi-
sual Studio 2005.
9. Ejecutar ASP requiere que los programas se encuentren en la raíz de aplicaciones
Web, o alguno de sus directorios.

10. Es posible desarrollar aplicaciones robustas utilizando las versiones Express de Visual
Studio 2005.
CAPÍTULO 3
Técnicas de desarrollo
con Visual Studio 2005
Objetivos: Familiarizarse con las generalidades del trabajo con Visual Studio
para el desarrollo de aplicaciones de Consola, Windows y Web.

1. Entenderá el concepto de organización de trabajo de Visual Studio, ba-


sado en soluciones y proyectos.
2. Conocerá la mecánica de creación de aplicaciones mediante Visual
Studio.
3. Se familiarizará con el uso de las herramientas Solution Explorer, Tool-
box y Text Editor.
4. Aprenderá a distribuir el espacio de trabajo en Visual Studio.
5. Conocerá la forma de construir y depurar aplicaciones en Visual Studio.
6. Aprenderá a realizar configuraciones generales básicas de Visual Studio.

59
60 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Fundamentos de desarrollo con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . 61
Soluciones y proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Recomendaciones para la creación de proyectos y soluciones en
desarrollos colaborativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Creación de aplicaciones en Visual Studio . . . . . . . . . . . . . . . . . . . . . . 65
Elementos de sintaxis en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Creación de una aplicación de Consola en Visual Basic
usando Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
➤ Creación de una solución en blanco . . . . . . . . . . . . . . . . 68
➤ Adición de un proyecto a una solución . . . . . . . . . . . . . 69
➤ Herramientas de Text Editor . . . . . . . . . . . . . . . . . . . . . . 72
➤ Colocación de números de línea en Text Editor . . . . . . . 73
➤ Intellisense y detección dinámica de errores . . . . . . . . . 74
➤ Modificación de código usando Text Editor . . . . . . . . . . 77
➤ Generación de una solución en Visual Studio . . . . . . . . 78
➤ Depuración de una solución . . . . . . . . . . . . . . . . . . . . . . 78
Creación de una aplicación Windows en Visual Basic con
Visual Studio, trabajando varios proyectos en una solución . . . 78
➤ Generación de una aplicación Windows . . . . . . . . . . . . . 79
➤ Fijación de una herramienta en el espacio de trabajo . . 80
➤ Adición de objetos de interfaz en tiempo de diseño . . . 81
➤ Navegación entre documentos de una solución . . . . . . . 83
➤ Cómo guardar documentos en una solución . . . . . . . . . 84
➤ Establecimiento del proyecto de inicio para una
solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Creación de una aplicación Web en Visual Basic con Visual
Studio, trabajando varios proyectos en una solución . . . . . . . . . 86
➤ Creación de un directorio virtual para un sitio Web . . . 86
➤ Creación de una aplicación Web ASP.NET . . . . . . . . . . . . 88
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 61

Fundamentos de desarrollo
con Visual Studio

Soluciones y proyectos

En .NET, desarrollar en SDK es igual que hacerlo en Visual Studio; sin embargo, la orga-
nización del trabajo de desarrollo tiene importantes diferencias.
Si se utiliza Visual Studio, todo el trabajo se organiza en soluciones y proyectos.
Una solución es el nivel más alto o global de organización en Visual Studio, y consiste en
una colección de proyectos administrados en una sola estructura.
3
Las soluciones almacenan información respecto de los proyectos que agrupan las depen-
dencias entre éstos y el orden de construcción (compilación y generación de ensamblados)
que deben guardar entre sí.
Las soluciones tienen la extensión sln y presentan algunas limitaciones: la primera es que
sólo se puede tener una solución abierta en una instancia de Visual Studio; la segunda es
que una solución no puede contener a otra.
Los proyectos son colecciones de archivos fuente, compilados conjuntamente como un ar-
chivo de salida .NET (ensamblado).
Cada proyecto puede componerse por interfaces de usuario (Windows Forms, Web Forms,
Mobile), archivos de código (vb), referencias a clases de .NET Framework o a bibliotecas
creadas por el usuario, archivos XML, HTML, y en fin, todo lo necesario para generar un
ensamblado.
Visual Studio posee más de 90 tipos de proyectos. La ventaja de utilizarlos es que selec-
cionando el tipo de proyecto adecuado, Visual Studio se encarga de crear los archivos mí-
nimos para el tipo de aplicación correspondiente, y además establece de forma automática
las referencias a clases de .NET Framework usualmente requeridas.
62 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 3.1
Organización
de soluciones y
proyectos

Es importante mencionar que algunos proyectos muy especiales no generan ensamblados,


como los de setup, pero constituyen una minoría.
Un proyecto puede formar parte de varias soluciones, por lo que es posible organizar por
módulos una aplicación y, al mismo tiempo, se puede tener una solución maestra que en-
globe a todos los proyectos. Subdividir es una práctica recomendable, ya que al momento
de estar desarrollando y solicitar la compilación de los programas, se compilarán todos los
proyectos de la solución.
Esto puede convertirse en un problema en el caso de aplicaciones grandes: en primera ins-
tancia, porque pueden ser muchos los proyectos a compilar, lo que tomará mucho tiempo;
en segunda, porque en los proyectos grandes intervienen varios programadores, y es posi-
ble tener que lidiar con proyectos que ya funcionaban pero que ahora están presentando
errores, que se tendrán que corregir antes de que el programa pueda ser compilado correc-
tamente.
Las soluciones deben planearse cuidadosamente con todo el equipo de desarrolladores.
Que una solución integre a todos los proyectos de otra solución no implica que una solu-
ción está dentro de otra. Eso permite que cada persona cree las soluciones que requiera sin
afectar el trabajo de otros ni perjudicar la integración de software que se da por la unión
de proyectos.
Es importante notar que en una misma solución pueden coexistir proyectos escritos en di-
ferentes lenguajes .NET; sin embargo, un proyecto puede tener código fuente en un solo
lenguaje.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 63

> Lo nuevo
En Visual Studio 2005 se tienen las siguientes prestaciones relativas a los proyectos y las solu-
ciones. Es posible crear proyectos temporales (temporary projects) que no requieren guardar-
se con el fin de hacer pruebas sin necesidad de crear proyectos y soluciones. También es posi-
ble crear proyectos autónomos (stand-alone projects): cuando una solución sólo se compone
de un proyecto, no es necesario hacer la gestión de la solución, aunque de todas formas se
genere. Para la organización del trabajo ya es posible crear directorios o carpetas de solución,
en los cuales es posible clasificar los archivos involucrados en la solución. También podemos
administrar todos los recursos de un proyecto a través de Project Designer, y es posible refe-
rir archivos EXE como orígenes de clases, y no sólo archivos DLL.

Recomendaciones para la creación de proyectos 3


y soluciones en desarrollos colaborativos

Se conoce como desarrollos colaborativos a las iniciativas de desarrollo que son tan gran-
des que el trabajo debe distribuirse en varios equipos de desarrollo.
Piense en proyectos de desarrollo de la magnitud de Microsoft Excel. Es impensable que
un solo equipo de desarrolladores haya estado a cargo de todas y cada una de las funcio-
nes del paquete. Seguramente un equipo de desarrolladores se ocupó de la interfaz gráfica,
otro del Solver, otro más de las capacidades de graficación, etcétera.
Imagine, por otro lado, que alguien deseara compilar su parte y que ello implicará compi-
lar todos los programas de todos los equipos de trabajo. En términos de tiempo y procesa-
miento, eso sería inadmisible.
Se parte del supuesto que mantener las cosas simples es lo mejor. Trabajar con el mínimo
de elementos, los suficientes y necesarios para obtener los resultados calculados, permite
una mejor concentración en el trabajo.
Cuando se trabaja en ambientes colaborativos se recomiendan las siguientes prácticas re-
lacionadas con los proyectos y las soluciones:
1. Se debe dividir la aplicación en módulos, e incluso en submódulos. Cada módulo y sub-
módulo es una unidad de labores de desarrollo que contará con un responsable. De esa
forma se trabaja sólo con los archivos del módulo; la compilación y depuración se rea-
lizará sólo sobre ellos sin necesidad de manipular el trabajo de otros.
2. Se recomienda que el trabajo de desarrollo de módulos y submódulos se haga en un
equipo local, y nunca en un ambiente de producción.
64 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

3. Se debe tener una solución por cada módulo y una solución por cada submódulo, si fue-
ra pertinente.
4. Cada solución debe tener un responsable.
5. Los desarrollos de los submódulos se agregan al módulo sólo después de ser probados.
6. Todas las librerías de uso común deben ser administradas por un responsable, aun cuan-
do no sea quien las desarrolle. Debe haber una solución para el manejo de las librerías
de uso común.
7. Sólo el responsable de la solución que contiene las librerías de uso común puede auto-
rizar las modificaciones a las librerías; al autorizar una modificación deberá comunicar
la actualización a todos los equipos de trabajo.
8. Se debe tener una solución que integre todos los recursos y programas que componen
la aplicación, pero no se trabaja sobre ella. En esta solución sólo se integran los recur-
sos que ya han sido probados a nivel módulo.
9. La solución que integra toda la aplicación es la que se compilará finalmente para gene-
rar una versión para entregar.

FIGURA 3.2
Trabajo
colaborativo
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 65

Creación de aplicaciones en Visual Studio

El procedimiento más sencillo para la creación de una solución es ejecutar Visual Studio.
Aparecerá la página principal de la herramienta, denominada Start Page (Página de inicio),
desde la cual se pueden abrir proyectos nuevos o existentes, así como consultar informa-
ción de Visual Studio y la plataforma .NET.

> Lo nuevo
En Visual Studio 2005 la página de inicio fue rediseñada totalmente. Ahora las cuatro seccio-
nes (Open an existing project, Getting Started, Headlines y News) aparecen en una sola
página.

3
FIGURA 3.3
Start Page

En Start Page se selecciona File – New – Project (o se oprime la combinación de teclas


Control-Mayús-N). Aparecerá la ventana New Project, que permite seleccionar el lenguaje
a utilizar, así como el tipo de proyecto que se desea construir.
66 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 3.4
New Proyect

Al proporcionar los datos del proyecto a agregar, automáticamente se crea una solución con
el mismo nombre. La desventaja de esta modalidad es que en aplicaciones grandes nunca
un proyecto y una solución se denominan de la misma forma, ya que la solución es un con-
cepto global mientras que un proyecto es específico. Cuando la creación de un proyecto
motiva la creación automática de una solución homónima, Visual Studio entiende que la so-
lución se compone de un solo proyecto, a lo que se llama proyecto autónomo (stand-alone
project); en este tipo de proyecto no se da mucha relevancia al concepto de solución den-
tro del entorno integrado de desarrollo.
Es indispensable saber qué lenguaje .NET se utilizará para el desarrollo (Project Type); de-
cidido esto, es necesario conocer el tipo de aplicación deseada (Templates). Las plantillas
o templates permiten predeterminar los recursos iniciales de la aplicación.
Visual Studio preguntará dónde se desea guardar la aplicación (Location) y con qué nom-
bre (Name). Los archivos fuente que usted genere se encontrarán en el directorio que espe-
cifique. Se generará un archivo que mantendrá la referencia de todos los archivos involu-
crados en la solución y tendrá la extensión sln. Es posible que la solución tenga un nombre
distinto al del proyecto, por lo que se podrá denominar específicamente (Solution Name).

> Lo nuevo
En Visual Studio 2005 la organización es más eficiente, dado que todos los recursos de una so-
lución están en la misma ubicación. La versión 2003 almacenaba los archivos del proyecto en el
directorio que nosotros especificábamos, pero colocaba el archivo de solución (SLN) en Mis do-
cumentos/Proyectos de Visual Studio, lo que creaba problemas en equipos en donde traba-
jaban diversos usuarios. Ahora la solución y los proyectos se almacenan en el mismo directorio.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 67

Elementos de sintaxis en Visual Basic


Visual Basic es el heredero de la tradicional sintaxis del lenguaje Visual Basic 6.0. Para no
comenzar a desarrollar programas sin un conocimiento básico de la sintaxis del lenguaje,
enumeramos algunas características esenciales:
1. Visual Basic no es sensible al uso de mayúsculas y minúsculas (non case sensitive).
2. Las líneas de código terminan al encontrarse un salto de línea (CR/LF).
3. El continuador de línea es un guión bajo (_) y no debe interrumpir expresiones; antes
de él debe haber un espacio en blanco y después de él no debe escribirse nada.
4. Un bloque de código es el conjunto de líneas que deben ser tratadas como unidad de
ejecución. Los bloques de código generalmente se delimitan por estructuras con inicio 3
y fin (Module – End Module, Sub – End Sub, etcétera).
5. Todo bloque de código que se inicie debe cerrarse.
6. El último bloque de código en abrirse debe ser el primero en cerrarse.
7. Las bibliotecas a utilizarse en un programa se declaran al inicio del mismo, utilizando
la palabra reservada Imports.
8. Se utilizan paréntesis para delimitar expresiones que deban resolverse, o para delimitar
argumentos.
9. Las variables que se utilicen en un programa deben estar definidas de manera explícita.
10. Aunque no es relevante para el compilador, evite la codificación de todo mayúsculas o
todo minúsculas. Procure iniciar las palabras reservadas con mayúsculas.
Éste es un ejemplo típico de un programa en Visual Basic:

1 Imports System
2 Imports System.Console
3
4 Module MiPrograma
5 Sub Main()
6 Write(“Pulse INTRO”)
7 ReadLine()
8 WriteLine(“Hola mundo”)
9 End Sub
10 End Module
68 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 3.1
Creación de una aplicación de Consola en Visual Basic usando Visual
Studio

Desarrollará una aplicación de consola, que al presionar INTRO muestre un mensaje “Ho-
la Mundo”.

➤ Creación de una solución en blanco

1. Ejecute Visual Studio.


2. En la barra de menús seleccione File – New (CTRL-MAYÚS-N) para desplegar el cua-
dro de diálogo New Project.

3. En la sección Project Type seleccione Other Project Types – Visual Studio Solutions,
porque trabajará con soluciones de Visual Studio.
4. En la sección Templates seleccione Blank Solution. Al seleccionar el tipo de proyecto,
Visual Studio se encargará de generar un contenedor de proyectos que podrá ser com-
pilado para producir una aplicación.
5. En el cuadro de texto Name coloque el nombre de la solución, Ejercicios; en el cuadro
de lista Location especifique la ruta en la que se han de almacenar los archivos físicos
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 69

que componen la solución. Escriba la ruta del directorio de trabajo del libro, que es
C:\APVBNETVS.

6. Vea cómo la casilla de verificación Create directory for solution está marcada de forma
predeterminada. Esto es recomendable para que la solución se organice mejor dentro del
medio de almacenamiento. Haga clic en Ok para que se genere la solución llamada
Ejercicios.

7. Al aceptar los cambios, se generará un directorio llamado Ejercicios en el directorio de


trabajo. En dicho directorio existirá un archivo denominado Ejercicios.sln, que alma-
cenará las referencias a los proyectos que componen la aplicación.

➤ Adición de un proyecto a una solución


8. La herramienta Solution Explorer permite ver todos los elementos que componen una 3
solución; mediante una interfaz de árbol de nodos, es posible ver todos los proyectos y
componentes almacenados en archivos físicos que se tienen en una solución. Para dis-
poner de forma visual de Solution Explorer, en la barra de menús seleccione View –
Solution Explorer (Ctrl-Alt-L).
9. Aparecerá sólo un nodo, correspondiente a la solución Ejercicios. En el nodo se ha-
ce referencia a que actualmente la solución tiene cero proyectos asociados.

10. Seleccione en Solution Explorer el nodo Solution “Ejercicios” y despliegue el menú


contextual (haga clic en el botón derecho del ratón). Seleccione la opción Add – New
Project.
11. Aparecerá la ventana New Project.
70 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. En la sección Project Type seleccione Visual Basic - Windows, porque desarrollará una
aplicación de consola utilizando Visual Basic; recuerde que los proyectos de consola se
ejecutan utilizando el servicio Windows Application Services, aunque no sean interfa-
ces gráficas; de ahí que se traten como aplicaciones Windows.
13. En la sección Templates seleccione Console Application. Al seleccionar el tipo de pro-
yecto, Visual Studio se encargará de proporcionar de forma automática todos los ele-
mentos típicos de una aplicación de consola, incluyendo archivos de código fuente, da-
tos y configuraciones pertinentes.
14. En el cuadro de texto Name coloque el nombre del proyecto, que debe ser HolaMundoCon;
en el cuadro de lista Location especifique la ruta en la que se han de almacenar los ar-
chivos físicos a desarrollar. Escriba la ruta del directorio de trabajo de la solución, que
es C:\APVBNETVS\Ejercicios.

15. Haga clic en Ok, con lo cual se generará dentro del directorio de trabajo de la solución
un directorio llamado HolaMundoCon. En dicho directorio se encontrará el archivo de có-
digo fuente del programa de Consola (.VB) y el archivo del proyecto (.VBPROJ) que con-
centrará las referencias de los archivos físicos involucrados en este último. Se generan
también directorios de trabajo: en \Bin se colocarán los ensamblados que se gene-
ren cuando se realice la compilación del proyecto; en \My Project se almacenarán
archivos de configuración y especificaciones útiles para la compilación del proyecto, y
en \obj se colocarán archivos temporales involucrados en el proceso de compilación
y depuración.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 71

16. Al haber especificado como Template una Console Application, Visual Studio genera
de forma automática los archivos y referencias comunes para una aplicación de conso-
la. El componente principal será un programa de código fuente llamado Module1.vb,
que es un módulo en Visual Basic.
17. Document Window es el espacio principal de trabajo en Visual Studio, en donde la ma-
yoría de las herramientas se ubicarán en tiempo de diseño. En Document Window apa-
recerá Text Editor, que es el editor de texto simple donde se podrá modificar el códi-
go de Module1.vb.
18. En este momento Solution Explorer debe mostrar todos los elementos físicos que com-
ponen la solución, y en Document Window se tendrá a Text Editor modificando el có-
digo de Module1.vb.

3
72 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Herramientas de Text Editor

19. Text Editor tiene los siguientes elementos:

FIGURA 3.5
Elementos de
Text Editor

20. Text Editor es una fascinante herramienta de edición de código, dadas todas las pres-
taciones que ofrece, como las siguientes:
a) Barra de selección de documentos. En la parte superior de Text Editor apa-
recerá una barra que mostrará las pestañas (Tabs) para seleccionar el documento con
el que deseemos trabajar.
b) Tabs. Llamadas también pestañas de selección, identifican y permiten seleccionar
los documentos abiertos con los que se puede trabajar. A los documentos que se en-
cuentran abiertos y en la barra de selección de documentos, se les llama documen-
tos activos.
c) Selector de documentos activos. Dado que se pueden tener tantos documen-
tos activos que se llene la barra de selección de documentos, hacer clic en el Selec-
tor de documentos activos (flecha ▼) permite ver los documentos activos en forma
de menú para seleccionarlos.
d) Cerrado de documentos. Si se desea quitar un documento de los documentos
activos, simplemente se debe seleccionar el documento a cerrar y hacer clic en el
icono de cerrado de documentos.
e) Delimitadores de branching. Es la capacidad de Text Editor de mostrar de
forma visible los alcances de los bloques principales de código (branching). Como
se puede observar, al inicio de un procedimiento, módulo o clase, en las líneas de-
limitadoras de branching aparecen símbolos (–) y (+); éstos permiten visualizar y
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 73

ocultar el código delimitado, con lo que podemos hacer más clara la codificación
mostrando sólo aquellas partes del código que realmente nos interesa observar.
f) Complementación automática de código. Es la capacidad de Text Editor de
agregar de forma automática líneas de código que por regla de lenguaje deben escri-
birse. Esto simplifica el proceso de codificación, además de que evita errores por
omisión de código.
g) Coloring. Es la capacidad de Text Editor de diferenciar por colores los elemen-
tos del código. Generalmente las palabras reservadas estarán en azul, los identifica-
dores y operadores en negro, y los comentarios en verde. Esto es útil sobre todo
cuando no estamos seguros de estar escribiendo correctamente las palabras reserva-
das. Si no aparecen en azul, es porque no están bien escritas.
h) Divisores de procedimientos. Son las delimitaciones horizontales que separan 3
los procedimientos en el código.
i) Divisor de paneles de edición. Si se arrastra el icono Divisor de paneles de
edición, podrá dividirse el espacio de edición de Text Editor en mitades. En cada una
de ellas podrá desplazarse, ver y editar diferentes partes del código. Esto es especial-
mente útil en programas muy extensos, donde a veces es necesario comparar porcio-
nes de código ubicadas en distintas partes del archivo.
j) Selector de elementos. Se trata de un combo que muestra los diferentes módu-
los y elementos globales de una aplicación. En caso de que el programa posea mu-
chos elementos globales, este combo permite ir directamente a la parte de código
que interesa, sin tener que navegar entre las líneas de código para buscar.
k) Selector de miembros. Trabaja de la misma forma que Selector de elementos,
sólo que a un nivel más bajo. Permite seleccionar un miembro de un elemento global.
l) Intellisense. Capacidad a través de la cual Text Editor propone los objetos y
miembros más comunes conforme se escribe el código.

➤ Colocación de números de línea en Text Editor

21. Los números de línea son muy útiles para identificar partes del código. Muy probable-
mente, si se presentan problemas al momento de la compilación o ejecución, Visual
Studio referirá el número de línea que presenta problemas. Lo ideal es conocer el nú-
mero de línea que corresponde a cada parte del código.
22. Si los números de línea no aparecen en su editor de textos, puede desplegarlos de la si-
guiente manera: en la barra de menús seleccione Tool – Options para desplegar la ven-
74 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

tana Options. Seleccione el nodo Text Editor – Basic – General, en la sección Display
marque la casilla de verificación Line Numbers y haga clic en Ok.

➤ Intellisense y detección dinámica de errores

23. Dentro del procedimiento Main() introduzca la siguiente línea:


Console.WriteLine(“Presione INTRO”)

Esto se deberá escribir en varios tiempos. Primero escriba “Console.”. Al llegar al pun-
to, aparecerá un menú dinámico que propone los elementos del lenguaje que concuer-
dan con el código que se comenzó a escribir para que el desarrollador complete el enun-
ciado con la ayuda de Visual Studio. Esto simplifica el proceso de codificación y evita
errores de sintaxis. A esta funcionalidad se le llama Intellisense.
En la parte baja del menú dinámico Intellisense hay dos pestañas: Common y All. Da-
do que los elementos de un objeto pueden ser muchos, Visual Studio permite ver los más
comunes, o bien todos. De manera predeterminada muestra los más comunes, lo cual es
muy práctico. De la lista de elementos que aparece, es posible seleccionar con el ratón,
con las flechas de dirección o por concordancia con lo escrito. Sólo en caso de que lo
que busque no se encuentre en Common, recurra a All.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 75

3
Siga escribiendo hasta “Console.WriteL”. La información que hemos escrito permite una
concordancia exacta con un elemento del menú, mismo que se selecciona.

Para ahorrarnos esfuerzo y dado que ya está seleccionado el código que pretendemos es-
cribir, basta con poner el carácter que seguiría, en caso de escribir nosotros el código. En
este caso sería un paréntesis “(“ . Escriba un paréntesis derecho y vea cómo Intellisense
complementa el código de forma automática, desapareciendo el menú correspondiente.
76 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se recomienda ampliamente el uso de Intellisense, dado que se ha demostrado que reduce


en gran medida los errores de sintaxis.
Siga escribiendo la línea de código, y vea cómo aparece una ayuda interactiva de llenado
de los elementos. En este caso, la ayuda indica que si se escribe “WriteLine()”, lo que ob-
tendríamos sería un terminador de línea. La ayuda interactiva indica 18 formas de utilizar
WriteLine, dado el polimorfismo con que el objeto fue programado. Utilizando los iconos
▲▼ de la ayuda interactiva, busque la alternativa 14 de 18, para que vea la forma en que se
utiliza WriteLine con un String.

En este punto ya debió haber escrito la línea de ejemplo por completo.


24. Modifique la línea, de tal forma que escriba “Console” con doble “s”, a fin de causar un
error. Vea cómo al introducir una línea que presenta errores de sintaxis, Visual Studio le
señala la falta al estilo de Microsoft Word, subrayando el error en color azul. Si se colo-
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 77

ca sobre la parte del código que presenta el error, podrá darse cuenta que Visual Studio
le informa el mensaje del error que se está provocando. Esto ayuda a reducir el tiempo
de desarrollo, dado que no hace falta compilar y probar para saber que algo fallará.

25. Corrija la línea para que ya no genere errores.

➤ Modificación de código por medio de Text Editor

26. Como todo programa Hola Mundo, se espera que el usuario interactúe con el programa
y que éste despliegue el mensaje “Hola Mundo”. Para hacer esto, nuestro programa en-
viará un mensaje, esperará el uso del teclado y finalmente desplegará el mensaje “Hola
Mundo”. Modifique el procedimiento Main(). El código deberá quedar de la siguiente
forma:

Codificación de HolaMundoCon
1 Module Module1
2
3 Sub Main()
4 Console.Write(“Presione INTRO”)
5 Console.ReadLine()
6 Console.WriteLine(“Hola mundo.”)
7 End Sub
8
9 End Module

27. Realmente usted sólo tuvo que agregar las líneas 4, 5 y 6, que muestran un mensaje, es-
peran que se oprima una tecla y muestran otro mensaje, respectivamente.
78 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Generación de una solución en Visual Studio

28. Generar una solución consiste en tratar de compilar todos los programas y elementos
de todos los proyectos asociados a una solución. Al realizarse la compilación se gene-
ran los ensamblados correspondientes a cada uno de los proyectos, quedando listos pa-
ra su ejecución.
29. Vaya al menú Build – Build Solution (Ctrl-Mayús-B) para generar la solución.
30. En la parte inferior de Visual Studio se abrirá la ventana Output, que es la encargada de
mostrar el resultado de los procesos que Visual Studio realiza en el plano subyacente,
al ponerse en contacto con las herramientas de línea de comandos de .NET Framework,
así como con otros elementos de la plataforma. Si al final de la generación aparece el
siguiente mensaje, su programa es correcto, dado que se tuvo éxito en la construcción
de un proyecto.

➤ Depuración de una solución

31. En la barra de menús seleccione Debug – Start Debugging (u oprima la tecla F5) para
depurar la aplicación. En esta operación se comprueba que el programa esté correcto
sintácticamente y al mismo tiempo se ejecuta la aplicación para verificar que no cause
problemas en tiempo de ejecución. Para efectos prácticos, depurar es ejecutar en am-
biente de desarrollo.
32. Con ello aparecerá la aplicación de consola ejecutando. Al hacer clic se mostrará muy
rápidamente el mensaje «Hola Mundo».
FIN DEL EJERCICIO *
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 79

Ejercicio 3.2
Creación de una aplicación Windows en Visual Basic con Visual Studio,
trabajando varios proyectos en una solución

Desarrollará una aplicación Windows tal que al hacer clic en un botón muestre un mensa-
je «Hola Mundo».
1. En este ejercicio trabajará con la solución creada en el ejercicio anterior.

➤ Generación de una aplicación Windows


2. En el Solution Explorer seleccione el nodo Ejercicios (Solution “Ejercicios”). 3
3. Despliegue el menú contextual y seleccione Add – New Project.

4. En Project Types seleccione el nodo Visual Basic - Windows. En Templates seleccio-


ne Windows Applications. En Name especifique el nombre del proyecto, que será
HolaMundoWin, y se almacenará en el directorio de trabajo de la solución. Haga clic en Ok.

5. En Document Window aparecerá una herramienta llamada Form Designer, que permi-
te el diseño de interfaces de forma gráfica y dinámica.
6. En la barra de menús seleccione View – Toolbox (Ctrl-Alt-X). Aparecerá la herramien-
ta Toolbox, que muestra de forma clasificada los controles gráficos disponibles para
una aplicación Windows.
80 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7. Los controles son enlaces gráficos que permiten acceder a las clases de .NET Frame-
work para la elaboración de interfaces gráficas; a través de los controles es posible
agregar objetos de interacción en una interfaz. Visual Studio se encarga de agregar el
código necesario para la integración en los programas.
8. Observe cómo Toolbox no permanece en su lugar por mucho tiempo.

➤ Fijación de una herramienta en el espacio de trabajo

9. Cuando una herramienta de Visual Studio se encuentra en modo de ocultación automá-


tica, al no hacer uso de dicha herramienta, ésta se contrae, liberando espacio de traba-
jo en Document Window. Se dice que una herramienta está en modo fijo cuando per-
manece en el espacio de trabajo de Document Window independientemente de si se
está haciendo uso de ella o no. Hay ocasiones en que preferimos que la ocultación au-
tomática no esté disponible, por lo que procedemos a colocar la herramienta en modo
fijo.
10. Teniendo visible el Toolbox, haga clic en el Icono de ocultación automática que se en-
cuentra en la esquina superior derecha de la herramienta (barra de título del Toolbox).
Después de haber hecho clic en el icono, debe lucir de la siguiente forma.

Modo fijo Modo ocultación automática

Si el Icono de ocultación automática aparece en modo fijo, hacer clic sobre él pondrá a la
herramienta en modo de ocultación automática; si aparece en modo ocultación automáti-
ca, hacer clic sobre él pondrá a la herramienta en modo fijo.
11. En caso de que Toolbox esté en modo de ocultación automática, cambie su estado a
modo fijo. La interfaz deberá quedar de la siguiente manera:
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 81

➤ Adición de objetos de interfaz en tiempo de diseño

12. En Form Designer se pueden agregar objetos de interfaz de tres maneras: Modo inser-
ción, haciendo doble clic sobre alguno de los controles; Modo arrastre, arrastrando un
control desde el Toolbox hacia el Form Designer, y Modo trazo, haciendo un solo clic
sobre un control y trazando en Form Designer el espacio donde el control debe aparecer.
13. En Toolbox aparecen categorías de controles que pueden ser incluidos en una interfaz.
Expanda en Toolbox la categoría Common Control, haciendo clic en (+).
14. Haga doble clic sobre el control Button, que se encuentra en Toolbox – Common Control.

15. Arrastre el control Label, que se encuentra en el Toolbox, y colóquelo debajo del bo-
tón que acaba de agregar en el punto anterior.
82 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. En los puntos anteriores se agregó un objeto en modo inserción y uno en modo arrastre.
17. Acomódelos de tal forma que queden distribuidos de la siguiente manera (sólo arrás-
trelos; no haga doble clic sobre ellos):

18. Seleccione el objeto Label1 que se agregó a la interfaz. Para ello, haga un clic sobre él
una vez.
19. Cada elemento en la interfaz es un objeto y, en tal carácter, posee propiedades que de-
terminan su apariencia y sus capacidades de comportamiento. La herramienta Proper-
ties permite modificar los valores de las propiedades de los objetos. En la barra de me-
nús seleccione View - Properties Windows (u oprima la tecla F4) para ver las
propiedades del objeto seleccionado.

20. Como tenía seleccionado el objeto Label1, Visual Studio permite la modificación de
sus propiedades.
21. En la ventana Propiedades, en el combo superior aparecerá el nombre del objeto que se
modificará, así como la clase en la que está basada. Busque la propiedad (Name) y cam-
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 83

bie el nombre Label1 por lblResultado. Presione Intro. El nombre habrá cambiado en
el combo superior de la ventana Properties, lo que indica que el cambio ha sido aceptado.
22. Para agregar funcionalidad al programa es necesario especificarle el comportamiento
que deseamos tenga como respuesta a la interacción con el usuario. Para ello debemos
codificar procedimientos de evento, que son bloques de código que se ejecutarán cuan-
do el usuario o el programa interactúen de cierta manera con la aplicación.
23. Deseamos que al hacer clic en el botón se coloque el texto Hola Mundo en el objeto
lblResultado. Para ello debemos codificar el procedimiento que responda al evento
Click del botón.

24. Haga doble clic en el botón que agregó a la interfaz. Automáticamente aparece el pro-
cedimiento precodificado que se ha de ejecutar al momento de hacer clic (Click) en el
botón (Button1) (de ahí que el procedimiento se llame Button1_Click). Vea cómo
el editor queda listo para codificar lo que debe suceder cuando se haga clic en el botón 3
en tiempo de ejecución.
25. Dentro del procedimiento deberá agregar una línea que especifique que al hacer clic en
el botón, se cambiará la propiedad Text del objeto lblRespuesta a Hola Mundo. El
código debe lucir como sigue:

Codificación de HolaMundoWin

➤ Navegación entre documentos de una solución


26. En la parte superior de Document Window aparece la Barra de selección de documen-
tos, en la cual se muestran todos los elementos de la solución abiertos al momento. Ca-
da elemento posee su propia pestaña de selección (o Tab).

27. En este ejemplo aparecen cuatro documentos o herramientas que pueden ser seleccio-
nadas en la Barra de selección de documentos. Cada documento se activa, al hacer clic
sobre la pestaña correspondiente, en Document Window, la herramienta utilizada por el
documento para su edición. Form1.vb y Module1.vb, por ser código fuente, aparecerán
utilizando Text Editor, mientras que Form1.vb [Design] se mostrará usando Form De-
signer. Por otro lado, Start Page aparecerá como un navegador de páginas Web intrín-
seco de Visual Studio, dado que es una página Web.
84 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

28. Seleccione alternativamente las distintas pestañas y vea el comportamiento de Visual


Studio. Si desea cerrar alguno de los documentos abiertos, basta hacer clic en el Tab y
posteriormente en la cruz que aparece en el extremo izquierdo de la Barra de selección
de documentos.

➤ Cómo guardar documentos en una solución


29. Si el Tab de un documento muestra un asterisco (*), eso indica que el documento po-
see modificaciones que no han sido guardadas.
30. Guarde todos los cambios. Para ello, en la barra de menús seleccione File – Save All u
oprima Ctrl-Mayús-S.

➤ Establecimiento del proyecto de inicio para una solución


31. Cada proyecto tiene un objeto de inicio (startup object) que puede ser una página Web
o un programa que permita su ejecución. Al ejecutar el ensamblado generado a partir
de un proyecto, el objeto inicial será el objeto a mostrar primero.
32. De la misma forma, cada solución en Visual Studio puede tener uno o más proyectos,
pero todas deben tener un proyecto de inicio (startup project). Cuando ejecutemos una
solución desde Visual Studio, lo que veremos como resultado será la ejecución del ob-
jeto inicial del proyecto seleccionado como proyecto de inicio.
33. Vea la ventana del Solution Explorer. En la solución Ejercicios hay dos proyectos
registrados: el programa de consola del ejercicio anterior (HolaMundoCon) y el proyec-
to Windows que estamos trabajando (HolaMundoWin). Si observa bien, el proyecto
HolaMundoCon aparece en negritas, lo que indica que es el proyecto de inicio de la so-
lución. Si depura (oprimiendo la tecla F5) se ejecutará la aplicación de consola, y no
la de Windows que estamos trabajando.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 85

34. Para hacer que nuestro nuevo proyecto de aplicación Windows sea el proyecto de ini-
cio, seleccione el nodo HolaMundoWin en el Solution Explorer. Invoque el menú de
contexto y seleccione Set as StartUp Project. De esa forma el proyecto de Windows
será nuestro proyecto de inicio.
35. En nuestro caso, como la aplicación Windows contiene sólo un formulario Windows,
establecer nuestro proyecto como proyecto de inicio provoca que el único formulario
sea el objeto de inicio. Si nuestra aplicación tuviera más de un formulario Windows se-
ría necesario especificar cuál de ellos es el objeto de inicio.
36. Un objeto de inicio es el elemento de un proyecto que será el primero en mostrarse en
la interfaz.

37. Generar una solución permite que los elementos de todos los proyectos de una solución
sean compilados, generando los ensamblados correspondientes. En este caso, generar
la solución implicaría la compilación de los dos proyectos que hemos desarrollado.
38. Guarde la solución y genérela, para comprobar que no haya problemas con el trabajo
realizado. Si aparece el siguiente resultado es que todo fue bien (vea cómo se han cons-
truido dos ensamblados (EXE) uno por cada proyecto de la solución):
86 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

39. Si no hubo problemas, depure la aplicación (tecla F5). Se depurará el proyecto de ini-
cio; es decir, la aplicación Windows.
40. Al aparecer la interfaz en tiempo de ejecución, haga clic en el botón, y vea cómo el tex-
to de la etiqueta cambia. En ese caso, la aplicación funcionó adecuadamente.
41. Guarde su aplicación y ciérrela.
FIN DEL EJERCICIO*

Ejercicio 3.3
Creación de una aplicación Web en Visual Basic con Visual Studio, tra-
bajando varios proyectos en una solución

Desarrollará una aplicación Web tal que, al hacer clic en un botón, muestre el mensaje
“Hola Mundo”.

➤ Creación de un directorio virtual para un sitio Web


1. Una aplicación ASP.NET funciona con base en la colaboración de .NET Framework e
Internet Information Server. Si creamos una aplicación ASP.NET, Visual Studio inten-
tará almacenarla como un sitio dependiente del sitio Web predeterminado; es decir,
http://localhost/, que equivale a crear un directorio en la ruta C:\inetpub\wwwroot y
darle permisos de ejecución Web.
2. No siempre deseamos que nuestro sitio se almacene físicamente en C:\inetpub\
wwwroot, por lo que es necesario especificar que un directorio cualquiera actúe como
sitio Web (a lo que se llama directorio virtual). Aunque el directorio no se encuentre
en C:\inetpub\wwwroot, virtualmente si lo estará.
3. Genere en el directorio de trabajo (C:\APVBNETVS) un directorio que se llame HolaMun-
doWeb. Ese será el directorio de trabajo de la aplicación Web que creará.

4. Seleccione Inicio – Panel de control – Herramientas administrativas – Servicios de


Internet Information Server.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 87

5. Expanda el árbol Servicios de Internet Information Server hasta que localice el nodo
Sitio Web Predeterminado.
6. Estando en ese nodo, despliegue el menú contextual y seleccione la opción de menú
Nuevo – Directorio virtual….

7. Aparecerá el Asistente para crear un directorio virtual. Haga clic en Siguiente en la


pantalla inicial. Cuando el asistente pregunte por el alias de su sitio, escriba APVBNETVS
y haga clic en Siguiente.
8. Como directorio de contenido del sitio Web, seleccione o escriba la ruta del directorio
que acaba de crear (C:\APVBNETVS\HolaMundoWeb) y haga clic en Siguiente.
9. Deje los permisos tal como están. Haga clic en Siguiente y luego en Finalizar.
10. Se habrá creado un sitio llamado APVBNETVS.
11. Ubique el nodo APVBNETVS en el árbol de servicios de Servicios de Internet Infor-
mation Server y selecciónelo. En el panel de la derecha podrá observar que no hay ele-
mentos disponibles en dicho sitio. Cierre el programa Servicios de Internet Informa-
tion Server.
88 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Creación de una aplicación Web ASP.NET

12. En el Solution Explorer seleccione el nodo de la solución Ejercicios y en el menú


contextual seleccione Add – New Web Site. Aparecerá la ventana Add New Web Site.

13. En Templates seleccione ASP.NET Web Site. En Location haga clic en el botón
Browse; se desplegará la ventana Choose Location, que permite seleccionar una ru-
ta física del sistema operativo (si está codificando en \InetPub\wwwroot) o un direc-
torio virtual.
14. Seleccione en el panel derecho el origen Local IIS para indicar que el desarrollo se tra-
bajará en un directorio virtual dentro de la máquina. Al seleccionar Local IIS, aparece-
rán en organización de árbol de nodos todos los sitios registrados. Seleccione su sitio
APVBNETVS. Haga clic en Open para aceptar.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 89

15. Se generará el sitio Web ASP.NET. La página principal sobre la que se estará trabajan-
do es Default.aspx; las páginas pueden trabajarse en modo de diseño (Design) y en
modo codificación (Source). La forma de alternar entre uno y otro modo es seleccio-
nando las pestañas que aparecen en la parte inferior de Document Window. Al estar en
Design, se puede utilizar Toolbox para integrar objetos en la interfaz. En modo Sour-
ce es necesario agregar las etiquetas en el lugar indicado.
90 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. Cambie a modo de diseño (Design) y utilizando Toolbox (CTRL-ALT-X), agregue un


Button y un Label.

17. Seleccione el objeto Label1 y asigne en la propiedad Name, el mismo nombre que asig-
nó en Windows: lblResultado.
18. Haga doble clic en el botón que agregó a la interfaz. Aparecerá el procedimiento de
evento que se ejecutará al momento de hacer clic en el botón. Codifique lo siguiente en
el procedimiento Button1_Click:

Codificación de HolaMundoWeb

19. Seleccione el nodo http://localhost/APVBNETVS en el Solution Explorer y establéz-


calo como proyecto de inicio.
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 91

20. Vuelva a generar la solución (Ctrl-Mayús-B) y, si no hay problemas en la generación,


depure la aplicación (tecla F5). Debe funcionar igual que la aplicación Windows: al ha-
cer clic en el botón, el mensaje de la etiqueta debe cambiar.
21. En este ejercicio comprobamos que el desarrollo Windows y Web realizado desde Vi-
sual Studio es prácticamente idéntico.
22. Finalmente nuestro proyecto quedaría como sigue.

23. En cualquier momento puede llamar a edición cualquier elemento de la solución. De-
pendiendo del tipo de archivo que se trate, Visual Studio invocará Text Editor, Form
Designer, Web Form Designer o lo que sea pertinente.
24. En Solution Explorer haga doble clic en el nodo HolaMundoCon – Module1.vb,
luego haga doble clic en HolaMundoWin – Form1.vb; haga clic en http://localhost/
APVBNETVS/ - Default.aspx, y finalmente haga clic en http://localhost/APVBNETVS/
- Default.aspx – Default.aspx.vb. Vea cómo se comporta Visual Studio.
25. Guarde su aplicación y ciérrela.
FIN DEL EJERCICIO*
92 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 93

TERMINOLOGÍA

Barra de selección Document Window, Pestaña de Solución(es), 61


de documentos, 71 selección, 83 Solution Explorer,
72, 83 Guión bajo (_), 67 Project Type, 66, 68, 69
Bloque de código, Intellisense, 74 70 Start Page, 65
67 Internet Properties, 82 Startup object,
Categorías de Information Proyectos, 61 84
controles, 81 Server, 86 Selector Tab, 83
Desarrollos Modo fijo, 80 de documentos Tabs, 72
colaborativos, Módulo de activos, 72 Templates, 66, 68,
63 ocultación de elementos, 73 70
Directorio virtual, automática, 80 de miembros, 73 Text Editor, 71-2
3
86 Objeto de inicio, 84 sln, 66 Toolbox, 79

PREGUNTAS
3.1 ¿Cuáles son las recomendaciones generales de organización de soluciones y proyec-
tos en Visual Studio?
3.2 ¿Cuáles son los elementos básicos de sintaxis del lenguaje Visual Basic?
3.3 ¿Cuáles son las principales diferencias entre los proyectos de Consola, Windows y
Web?
3.4 ¿Para qué sirve Solution Explorer?
3.5 ¿Para qué sirve Toolbox?
3.6 ¿Cuáles son las principales características de Text Editor?
94 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.

1. Es el nivel más alto de organización de trabajo en Visual Studio:


a) Proyecto
b) Solución
c) Ensamblado

2. Son colecciones de archivos fuente que producen un ensamblado al momento de ser compilados:
a) Proyecto
b) Solución
c) Paquete

3. Herramienta que nos permite ver los elementos que componen una solución, en forma de árbol de nodos:
a) Solution Explorer
b) Solution Viewer
c) Start Page

4. Es la capacidad de Text Editor para proponer objetos y miembros, al momento de editar el código:
a) Intellisense
b) Coloring
c) Tooltip interactive

5. Consiste en tratar de compilar todos los programas y elementos asociados a un proyecto o solución
para la generación de ensamblados.
a) Build
b) Compile
c) Debug

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso, y «V» si es verdadero.

6. Visual Basic es sensible al uso de mayúsculas y minúsculas.

7. Text Editor y Document Window son, en esencia, lo mismo.

8. La ocultación automática está disponible sólo en Text Editor y Toolbox.

9. Para probar la aplicación Web es necesario tener instalado y funcionando IIS.

10. Las plantillas (templates) permiten predefinir recursos disponibles durante la crea-
ción de una aplicación.
Capítulos:
4 Variables, arreglos y tipos
de datos
Parte 2
5 Espacios de nombres y
desarrollo de librerías Fundamentos de programación
6 Manejo de operadores en Visual Basic
7 Estructuras de decisión y
control En esta parte del libro se analizan los fundamentos
8 Manejo estructurado de de la programación en lenguaje Visual Basic.
excepciones
Utilizando al máximo las herramientas de Visual
Studio 2005, se estudia el manejo de las variables
Herramientas de Visual de memoria, así como las estructuras de decisión y
Studio revisadas: control desde las cuales se realizará el consumo de
las clases de la biblioteca de .NET Framework (BCL).
1. Debug / Breakpoints
2. Command Window
Finalmente, aprenderá a implementar esquemas de
3. Autos / Locals / Watch manejo estructurado de excepciones con el fin de
4. Immediate Window controlar, mediante programación, las acciones
procedentes en caso de que se tengan problemas
5.
6.
Comment / Uncomment
Clipboard Ring en tiempo de ejecución. 4
7. Task List
Nuestra reflexión es la siguiente: la discusión si
8. Error List Java es mejor que .NET es irrelevante. Lo impor-
tante no es el lenguaje de programación que esco-
gemos para trabajar, sino lo que podemos hacer
con el lenguaje.
Un excelente lenguaje en manos de alguien que no
tiene nada que decir es una herramienta mal
aprovechada. Preocúpese por tener un objetivo
valioso a alcanzar, y luego emplee representaciones
abstractas de datos e instrucciones precisas para
desarrollar programas que cumplan de forma
óptima con el objetivo planteado.
CAPÍTULO 4
Variables, arreglos y tipos
de datos
Objetivos: Conocer las generalidades del manejo de variables y arreglos, así co-
mo la definición de sus características especiales.

1. Conocerá las variables de memoria y su funcionamiento en .NET.


2. Aprenderá a declarar las variables de memoria.
3. Se familiarizará con el comportamiento y las características de las varia-
bles de memoria.
4. Conocerá los tipos de datos admitidos por .NET y la forma en que se rea-
lizan conversiones.
5. Entenderá el alcance de las variables de memoria dentro de un programa.
6. Comprenderá qué son los arreglos, cuáles son sus tipos y la forma de de-
finirlos.
7. Aprenderá a implementar esquemas Strong Typing.

97
98 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Tipos de datos en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Conversión de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Conversión implícita (Casting) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Conversión explícita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Conversión por método . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Acceso a datos Value type y Reference type . . . . . . . . . . . . . . . . . . . . . . . . . 107
Capacidades de los tipos valor y referencia . . . . . . . . . . . . . . . . . . . . . 107
Naturaleza de tipo de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
ByVal y ByRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Strong Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Option Explicit [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Option Strict [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Demostración del alcance de las variables y la forma
en que preservan valores (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Manejo elemental de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Declaración de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Valores por omisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Demostración de la declaración de variables y constantes,
y la realización de conversiones . . . . . . . . . . . . . . . . . . . . . . . . . 114
➤ Construcción de un solo proyecto . . . . . . . . . . . . . . . . . . 115
Origen de las variables: clases y estructuras . . . . . . . . . . . . . . . . . . . . . 117
Alcance de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Accesibilidad de las variables (accesibility) . . . . . . . . . . . . . . . . . . . . . . 120
Demostración del alcance de las variables y la forma
en que preservan valores (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Arreglos unidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Arreglos multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Arreglos escalonados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Comprobación del uso de arreglos unidimensionales,
multidimensionales y escalonados . . . . . . . . . . . . . . . . . . . . . . . 129
Estructuras y enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Capítulo 4. Variables, arreglos y tipos de datos 99

El mundo de la computación es, en última instancia, un mundo de datos.

Los principales objetivos de toda aplicación son procesar datos para transformarlos en in-
formación, hacerlos llegar en la cantidad y la forma precisas a las personas indicadas (y au-
torizadas), y almacenarlos de manera eficiente.
No es asunto menor entender los datos y la forma en que se comportan. Una ineficiente se-
lección de la forma en que se manejan los datos puede acarrear errores y mal desempeño
de la aplicación.
Es importante recordar también que los lenguajes de programación son estructuras simbó-
licas que permiten hacer uso de los dispositivos y recursos de una computadora.
Uno de los componentes más importantes de una computadora es la memoria de acceso
aleatorio (RAM/Random Access Memory). La RAM es indispensable para una compu-
tadora debido a que los programas y datos deben residir en ella para que puedan ser toma-
dos de ahí por el procesador; nada puede ser procesado por una computadora si no está an-
tes en la memoria. Dicho de otra manera, el procesador no habla con nadie más que con la
RAM.
Ahora bien, la memoria se encuentra seccionada en posiciones de memoria, cada una de 4
las cuales tiene un identificador interno (que a veces nos es revelado en forma de número
hexadecimal cuando Windows causa un volcado de memoria).
La memoria puede ser utilizada por el sistema operativo para que todos los programas fun-
cionen; ¿puede un programador disponer de posiciones de memoria? Por supuesto que sí:
a través de las variables de memoria.
El presente capítulo analiza la forma en que es necesario codificar el almacenamiento de
valores en memoria en Visual Basic, de forma que los procesos puedan utilizarla eficien-
temente.

Variables
Una variable de memoria es la referencia lógica a una posición física de memoria RAM.
Por medio de las variables es posible almacenar valores en la memoria, asignarles un nom-
bre determinado y disponer del valor almacenado cuando se requiera.
Estos valores almacenados estarán disponibles en tanto que no liberemos la memoria, ya
sea por medio de programación o como resultado de haber cerrado la sesión de programa
donde fueron definidos. Por supuesto, apagar la máquina produce el cierre de todos los
programas y, por tanto, la pérdida de los valores almacenados en las variables.
100 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las variables tienen siempre las siguientes características:


❑ Identificador (identifier). Es el atributo que permite distinguir a una variable de otra.

❑ Tipo de dato (datatype). Es el tipo de valor que podrá almacenar la variable; determi-
na el tratamiento interno que tendrá el valor y la cantidad en bytes que consumirá en
memoria, entre otras cosas.
❑ Alcance (scope). Es el atributo que define el código dentro de un programa en que una
variable puede ser utilizada sin utilizar calificador; es el estado de existencia y la per-
sistencia del valor de la variable en tiempo de ejecución.
❑ Accesibilidad (accessibility). Es el permiso que se proporciona al código para leer la
variable o escribir en ella.
❑ Tiempo de vida (lifetime). Es el periodo de ejecución en el cual la variable está dis-
ponible.

FIGURA 4.1
Disposición
de memoria
en .NET

Identificadores

Se le llama identificador (identifier) al nombre lógico de un elemento de programación por


medio del cual puede ser referido.
Las variables, al igual que los procedimientos, las clases, las estructuras y otros elementos
poseen un identificador; a través de él, dichos elementos son utilizables de manera progra-
mática.
Reglas de composición de los identificadores. Los identificadores deben cumplir
con las siguientes reglas:
Capítulo 4. Variables, arreglos y tipos de datos 101

❑ Deben iniciar con un carácter alfabético o guión bajo ( _ ).

❑ Pueden contener sólo caracteres alfabéticos, dígitos decimales o guiones bajos.

❑ Si se inician con un guión bajo, deben contener al menos un dígito decimal o un carác-
ter alfabético.
❑ No pueden contener espacios intermedios.

Reglas no escritas de composición de los identificadores. Existen otras reglas


no forzosas, pero que le pueden ser de mucha ayuda:
❑ Se sugiere que un identificador sea ilustrativo; es decir, debe indicar claramente su con-
tenido. Por ejemplo, si una de sus variables sirve para almacenar en memoria la edad de
una persona, su variable puede llamarse Edad o X; sin embargo, Edad es un nombre más
útil, pues proporciona una mejor idea del valor que contiene, mientras que X puede ser
cualquier cosa.
❑ Dado que una variable puede ser utilizada repetidamente dentro de un programa, es
más práctico emplear nombres cortos. Entre Nombre y NombreDelClienteQueAdquiere
Producto lo más recomendable es emplear la primera opción.
4
❑ Use el guión bajo sólo si es necesario hacerlo. Recuerde que el guión bajo es el conti-
nuador de línea del lenguaje y puede crearse confusión innecesaria. Prefiera Ventas
Mensuales a Ventas_Mensuales.

❑ Se recomienda el manejo de mayúscula al principio del nombre y al inicio de cada una


las palabras que compongan el identificador (Pascal casing), con el fin de aumentar la
legibilidad. VentasMensuales es recomendable; ventasmensuales no.
❑ Evite en lo posible el uso de conjunciones. Use VentasMensuales, no VentasDelMes.

❑ Evite el uso de abreviaturas. Use VentasMensuales, no VtsM.

En lo que respecta al uso de mayúsculas, minúsculas y prefijos para la denominación de


variables en Visual Basic, se consideran algunos estilos que constituyen convencionalis-
mos internacionalmente reconocidos. Aunque Visual Basic permite formar los identifica-
dores como le plazca, es mejor seguir las reglas que todos los desarrolladores del mundo
parecen estar siguiendo.
Pascal casing. El estilo Pascal casing consiste en usar mayúscula al principio del nom-
bre y al inicio de cada una las palabras que compongan el identificador. Éste es el estilo
más utilizado en Visual Basic; por ejemplo, VentasMensuales.
102 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se recomienda este estilo al denominar:


❑ Clases

❑ Enumeraciones (constantes predefinidas del lenguaje)

❑ Eventos

❑ Interfaces

❑ Espacios de nombres

❑ Métodos y propiedades

Camel casing. El estilo Camel casing se caracteriza por colocar en mayúscula la pri-
mera letra de cada palabra de un identificador, excepto la primera. Por ejemplo, ventas
Mensuales. Este estilo está muy difundido entre los programadores de C# o Java.

Se recomienda utilizar este estilo:


❑ Al denominar parámetros; si el parámetro se compone de una sola palabra, toda la pa-
labra va en minúscula.
❑ En elementos de alcance privado, como campos y variables.

Notación húngara (Hungarian notation). La Notación húngara se caracteriza por


colocar un prefijo a las variables para indicar su tipo o función. A decir de Microsoft, este
estilo está cayendo en desuso, por lo cual sugerimos evitarlo. Por ejemplo, intVentasMen-
suales, da a entender que se trata de un dato Integer.

NOTA
Evitar la notación húngara es la recomendación de Microsoft. En realidad, la notación húnga-
ra sigue siendo utilizada mucho por la comunidad de desarrollo, e incluso en el sitio de Mi-
crosoft encontramos muchos ejemplos con dicha notación. Utilizar la notación húngara será
a fin de cuentas una decisión del equipo de desarrollo, y no afecta la funcionalidad de las apli-
caciones.

Este apartado presenta recomendaciones que puede o no seguir. En cualquier caso, lo im-
portante no es el estilo que elija usar, sino que todos los miembros de un equipo de desa-
rrollo lo compartan y utilicen de manera consistente.

Tipos de datos en Visual Basic

Las variables pueden almacenar cualquier tipo de valor, desde una secuencia de caracteres
hasta un número o una fecha. Dependiendo del tipo, será posible hacer tal o cual cosa con
Capítulo 4. Variables, arreglos y tipos de datos 103

el contenido de la variable. Esto implica la necesidad de definir qué tipo de valor almace-
nará la variable para saber qué es posible hacer con ella.
Además de determinar el tratamiento interno del valor, el tipo de dato (datatype) define la
cantidad en bytes que consumirá en memoria y las operaciones que se podrán realizar con
el mismo.
Se conoce como dominio el conjunto de valores válidos para un dato. Por ejemplo, el domi-
nio de un dato que almacenará un número de mes, consiste en los números enteros del 1 al
12. Cuando el dominio está relacionado con el tipo de dato, se le llama dominio de tipo; por
ejemplo, en el caso del tipo de dato Byte, el dominio será de números enteros del 0 al 255.
Todo en Visual Basic es un objeto, y todo objeto tiene un determinado tipo, lo que se co-
noce como type. Se tienen dos clases de types en el lenguaje:
❒ Types que forman parte del lenguaje, llamados types intrínsecos.

❒ Types de usuario, llamados también user-defined types, que son clases, estructuras, in-
terfaces y otros elementos que no forman parte de .NET Framework.
Cada type tiene un nombre, que es el identificador a través del cual se invoca la funciona-
lidad desde el código fuente en un determinado lenguaje. El nombre del type puede ser más 4
corto en un lenguaje que en .NET Framework. Por ejemplo, para Visual Basic la referencia
Integer es equivalente a referir el type System.Int32 de .NET Framework, que es más
complejo. Todos los lenguajes tienen acceso a la misma biblioteca de clases, lo que varía
la implementación que cada lenguaje requiere para llegar a System.Int32 (Visual Basic,
Integer; C#, int; C++, int o long; JScript, int).

Además de nombre, los types también poseen un tamaño, que representa su el consumo en
bytes. Esto es importante dado que la memoria RAM es siempre limitada.
Los types intrínsecos pueden ser clases, estructuras e interfaces preconstruidas en .NET
Framework, que ayudan a estandarizar el manejo de valores de datos o a producir compor-
tamientos. En ese sentido, Integer es un type que representa un valor, mientras que Write-
Line es un type, en el sentido de que es un método de una clase de BCL que no debe ser
instanciada para funcionar.
104 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Visual Basic acepta los siguientes tipos de datos intrínsecos:

Tipo Estructura
de dato o Clase.NET
Framework a la que Consumo
se hace referencia en bytes Rango de valores (dominio de tipo)
Boolean System.Boolean 1 byte True o False
(estructura)
Byte System.Byte 1 byte De 0 a 255 (sin signo)
(estructura)
Char System.Char 2 bytes Caracteres UNICODE
(estructura)
Date System.DateTime 8 bytes De enero 1, 0001 a diciembre 31, 9999
(estructura)
Decimal System.Decimal 12 bytes a) +/-79,228,162,514,264,337,
(estructura) 593,543,950,335 sin punto decimal;
b) +/-7.9228162514264337593543950335
con 28 posiciones después del punto
decimal;
c) el mayor número menor a cero
representable es:
+/-0.0000000000000000000000000001
Double System.Double 8 bytes a) -1.79769313486231E+308 a
(estructura) -4.94065645841247E-324 para valores
negativos; b) 4.94065645841247E-324 a
1.79769313486231E+308 para valores
positivos
Integer System.Int32 4 bytes De -2,147,483,648 a 2,147,483,647
(estructura)
Long System.Int64 8 bytes De -9,223,372,036,854,775,808 a
(estructura) 9,223,372,036,854,775,807
Short System.Int16 2 bytes De -32,768 a 32,767
(estructura)
Single System.Single 4 bytes a) -3.402823E+38 a -1.401298E-45 para
(estructura) números negativos;
b) 1.401298E-45 a 3.402823E+38 para
valores positivos
String System.String Depende de De 0 a aproximadamente dos mil millones
(clase) la plataforma de caracteres Unicode

Se consideran tipos de dato numérico los siguientes: Byte, Double, Integer, Long,
Short y Single. Se consideran tipos de dato no numérico los siguientes: Boolean,
Date, Decimal, Object y String. Aunque Decimal almacena números, el manejo
que hace del punto flotante complica su manejo; Object, por su parte, puede asumir
cualquier valor.
Capítulo 4. Variables, arreglos y tipos de datos 105

Algunas recomendaciones pertinentes con respecto a la definición de tipos de datos son las
siguientes:
❑ Determine cuidadosamente el tipo de dato más adecuado para una variable, de forma que
las operaciones a realizar con los valores no produzcan conflictos de tipos. Si, por ejem-
plo, va a realizar operaciones de alta precisión, el tipo de datos Integer no le servirá.
❑ Utilice el tipo de datos que consuma sólo la cantidad de memoria necesaria. Si va a al-
macenar la edad de una persona, escoja Byte porque consume menos memoria que, por
ejemplo, Integer.
❑ Use, en lo posible, tipos de datos numéricos, pues son los que más eficientemente ma-
neja la computadora.
❑ En términos de tiempo de procesamiento, el tipo de dato más eficiente, indiscutiblemen-
te, es Integer, mientras que el menos eficiente es Object.
❑ Visual Basic puede realizar lo que se llama conversión de tipo cast; es decir, una con-
versión de tipos de datos en tiempo de ejecución entre tipos de datos compatibles. Es
preferible que usted mismo haga las conversiones; aunque es más cómodo dejar que el
lenguaje lo haga, usted pierde el control de su programa y, en caso de que se presenten
problemas, será más difícil determinar en dónde se encuentran. 4
❑ Sea previsor y actúe en concordancia con respecto a las posibilidades de que un dato, y
especialmente uno de tipo numérico, pueda exceder los dominios de tipo al ser manipu-
lado. Considere el siguiente ejemplo: un programador elige un tipo Integer partiendo
del razonamiento matemático de que la suma de dos números enteros siempre es un nú-
mero entero. Sin embargo, si se suma 2,000,000,000 más 2,000,000,000, el resultado ex-
cederá el límite del dominio de tipo. En este caso, el programador debió haber elegido
Long, el tipo de dato en que puede convertirse la suma de dos Integer. En ocasiones los
problemas originados por esta situación (numeric overflow), se presentan después de ha-
ber utilizado la aplicación durante mucho tiempo.

Conversión de datos
En muchas ocasiones requerirá realizar conversiones de tipos de datos, y principalmente
del tipo String a otros.
Se conoce como conversión de datos a cambiar el tipo de dato de un valor por otro. Exis-
ten tres formas de conversión de datos en Visual Basic.
106 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Conversión implícita (Casting)


La conversión implícita, conocida como casting, se da cuando el CLR realiza la conver-
sión en tiempo de ejecución sin que el programa lo especifique. Este tipo de conversión es
común en los tipos de datos numéricos.
Hay un fenómeno que se conoce como narrowing, cuando la conversión se realiza de un
tipo con mayor dominio a uno de menor dominio (Integer a Byte, por ejemplo); por otro
lado, se conoce como widening cuando la conversión se realiza de un tipo de menor domi-
nio a uno de mayor dominio (Byte a Integer, por ejemplo). En el caso de narrowing, hay
que prestar mucha atención en no proporcionar datos que excedan el dominio de tipo; por
ejemplo, tratar de pasar 100000I (Integer) a 100000S (Short), dado que los datos pueden
truncarse, e incluso provocar excepciones.

Conversión explícita
La conversión explícita consiste en aplicar funciones específicas mediante código para rea-
lizar la conversión. Se utiliza principalmente para convertir tipos String/Char a otros.
La conversión explícita puede hacerse mediante funciones específicas y funciones genéri-
cas. Las principales funciones específicas utilizadas son las siguientes:

Función Consecuencia
CBool(Expresión) Convierte Expresión a Boolean.
CByte(Expresión) Convierte Expresión a Byte.
CChar(Expresión) Convierte Expresión a Char.
CDate(Expresión) Convierte Expresión a Date.
CDbl(Expresión) Convierte Expresión a Double.
CDec(Expresión) Convierte Expresión a Decimal.
CInt(Expresión) Convierte Expresión a Integer.
CLng(Expresión) Convierte Expresión a Long.
CObj(Expresión) Convierte Expresión a Object.
CShort(Expresión) Convierte Expresión a Short.
CStr(Expresión) Convierte Expresión a String.

La principal función de conversión genérica es CType, cuya sintaxis es la siguiente:


CType(Expresión, NombreTipoDato)
Donde Expresión es la expresión a convertir, y NombreTipoDato es el nombre del tipo de
dato al que se desea convertir la expresión. Por ejemplo:
CType(“4”, Integer)
Capítulo 4. Variables, arreglos y tipos de datos 107

Conversión por método

Algunos tipos de datos, por ejemplo la mayoría de los numéricos, tienen implícito un mé-
todo que permite hacer una conversión. El más común de éstos es ToString, que permite
convertir a la representación String un valor dado. Por ejemplo:
Dim Edad As Integer = 30

Dim EdadTexto As String = Edad.ToString()

En este caso, se declara una variable llamada Edad, de tipo Integer, a la cual se le asigna
el valor 30. Después se declara una variable llamada EdadTexto que tomará la representa-
ción String de la variable Edad; es decir, “30”.

Acceso a datos Value type y Reference type


Visual Basic, como todo lenguaje de programación, permite el uso de la memoria de la máqui-
na a través de las variables. Es posible acceder a los datos almacenados en las variables me-
Datos de
referencia y
diante dos tipos de acceso: tipos de valor (value type) y tipos de referencia (reference type). 4
datos de valor
Dependiendo de la forma en que se tenga acceso a los valores almacenados, el consumo de
memoria puede variar.

Capacidades de los tipos valor y referencia

Dependiendo del tipo de acceso a los datos, las capacidades de almacenamiento y econo-
mía difieren.
Con los tipos de valor (value type):
❑ Las variables almacenan un dato de un tipo determinado.

❑ Cada variable tiene su propio alojamiento en memoria.

❑ Cada variable contiene su propia copia del dato.

❑ Las operaciones realizadas con una variable no afectan a ninguna otra.

❑ La asignación de valor a una variable crea una copia de datos (no se sustituye el valor
anterior).
Con el tipo referencia (reference type):
❑ Las variables hacen referencia a un objeto (es decir, emanan de una clase).
108 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ Las variables mantienen una referencia apuntando a la posición en memoria en donde


se encuentran los datos.
❑ Las variables son intermediarias entre un programa y la memoria.

Naturaleza de los tipos de datos


Los tipos de datos tienen una naturaleza intrínseca en relación con un tipo de acceso.
Son value type:
❑ Todos los tipos de datos que almacenan números: Byte, Decimal, Double, Integer,
Long, Short, Single.

❑ Los tipos de datos Boolean, Char y Date.

❑ Todas las estructuras, incluyendo aquellas que se conforman de elementos reference type.
Son reference type:
❑ El tipo de dato String.

❑ Todos los arreglos de memoria (arrays), aun cuando sus elementos sean value type.

❑ Lo que sea instancia de una clase.

ByVal y ByRef
Cuando los datos son pasados como argumentos a funciones y procedimientos, es posible
especificar el tipo de acceso que se desea tener.
Para ello eso se utilizan las palabras reservadas ByVal y ByRef. Si se utiliza ByVal, se le
está especificando al procedimiento o función que utilice su propia versión del dato y que
mantenga intacto su el valor original. Si se utiliza ByRef, se le está especificando al proce-
dimiento o función que utilice la misma posición de memoria que el dato original, por lo
que las modificaciones realizadas al argumento afectan a ese dato.
Es importante considerar que el uso de ByVal y ByRef es respetado siempre y cuando la
naturaleza del dato no se imponga.
Cuando sus procedimientos o funciones sean de uso genérico para varios objetos o datos,
se recomienda ampliamente utilizar ByVal, a fin de que se realicen operaciones de la ma-
nera más segura posible.
Capítulo 4. Variables, arreglos y tipos de datos 109

Strong Typing
Antes de Visual Basic, el lenguaje había sido muy permisivo con los programadores; ob-
viaba muchas cosas y les permitía no ser formales con la técnica, lo que a largo plazo siem-
pre causaba problemas.
Si no se declaraban las variables, si no se especificaban los tipos de datos o si no se pla-
neaban las conversiones, Visual Basic lo hacía de manera automática. Eso provocaba que
los errores de fondo fueran difíciles de encontrar, ya que el universo de cosas que podían
estar equivocadas excedía nuestro conocimiento dado que no todo estaba bajo nuestro con-
trol. Resultaba patético pasar horas revisando un programa en busca de un error de lógica
o algoritmo, para descubrir finalmente que el verdadero problema era “un error de dedo”
que Visual Basic había “arreglado” por nosotros sin que nos diéramos cuenta.
Para evitar esas penosas situaciones, existen dos estatutos que se agregan antes de cual-
quier cosa en el código y que aseguran que la codificación siga una técnica formal, de ti-
po strong typing; es decir, donde todos los datos están asociados de manera explícita y no
ambigua a un tipo determinado.

4
Option Explicit [On/Off]
La instrucción Option Explicit, cuando está activada (On), obliga al programador a de-
clarar todas las variables que utilice en el programa. Si se intenta emplear una variable no
declarada, se produce un error. Option Explicit permite generar programas de tipo de
datos asegurados (type safe), en el sentido de que todas las variables deben declararse a
partir de tipos de datos reconocidos.

Option Strict [On/Off]


La instrucción Option Strict, cuando está activado (On), obliga a que las conversiones de
datos se realicen de manera explícita. En tal caso, las conversiones implícitas (casting) no
están disponibles ni para las conversiones amplias. Option Strict permite generar pro-
gramas de tipo de datos reforzados (strong type), en el sentido de que todas las conversio-
nes deben ser explícitas.
Si usted especifica Option Explicit y Option Strict es muy probable que su código sea
bastante formal, y no se encontrará con errores extraños en tiempo de ejecución. El valor
predeterminado de Option Explicit y Option Strict es Off.
Una excelente práctica de desarrollo es hacer que sus programas sean Strong type, con eso
reducirá el porcentaje de errores que pudieron evitarse con un poco de formalidad al de-
clarar y utilizar variables.
110 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 4.1
Demostración del alcance de las variables y la forma
en que preservan valores (I)

En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado ValRef.
3. Edite el programa de tal forma que aparezca como sigue:

Codificación de ValRef-Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7 Dim Texto As String = “Texto Original”
8 Console.WriteLine(Texto)
9 Valor(Texto)
10 Console.WriteLine(Texto)
11 Referencia(Texto)
12 Console.WriteLine(Texto)
13 Console.Write(“Pulse INTRO para continuar”)
14 Console.ReadLine()
15 End Sub
16
17 Sub Valor(ByVal Texto As String)
18 Texto = “Texto Valor”
19 Console.WriteLine(“<” & Texto & “>”)
20 End Sub
21
22 Sub Referencia(ByRef Texto As String)
23 Texto = “Texto Referencia”
24 Console.WriteLine(“<” & Texto & “>”)
25 End Sub
26
27 End Module
Capítulo 4. Variables, arreglos y tipos de datos 111

Ejecución guiada de ValRef – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado
en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (Oprima F5).
5. Este programa es type safe, dado que todas las variables deberán declararse antes de ser
utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explícita
(Option Strict).
6. El programa declara una variable de memoria, llamada Texto, que se verá sometida a
modificaciones en su contenido (línea 7); de inicio, se le asigna un valor de Texto ori-
ginal, mismo que es mostrado en la consola (línea 8).

La variable será proporcionada como argumento a dos procedimientos, uno de los cuales
tratará el dato como valor (líneas 17 a la 20), y otro como referencia (líneas 22 a la 25).
7. Uso del dato como tipo valor. En la línea 9 se proporciona la variable como argumento
de un procedimiento llamado Valor; dicho procedimiento recibe el valor y le da trata- 4
miento como tipo valor. En la línea 18 se modifica el valor de Texto, por Texto Valor,
y se muestran los efectos del cambio en la línea 19.
Después de ejecutar Valor(), se muestra el contenido de la variable Texto (línea 10); es
posible observar que, aunque se modificó el valor de la variable en el procedimiento, el
valor original no se modificó en lo absoluto. Esto se debe a que el dato fue manejado co-
mo tipo valor, lo que provoca que el argumento genere su propia copia del dato, dejan-
do al dato original intacto.
8. Uso del dato como tipo referencia. En la línea 11 se proporciona la variable como argu-
mento de un procedimiento llamado Referencia; dicho procedimiento recibe el valor y
le da tratamiento como tipo referencia. En la línea 23 se modifica el valor de Texto, por
Texto Referencia, y se muestran los efectos del cambio en la línea 24.

Después de ejecutar Referencia, se muestra el contenido de la variable Texto (línea


12); es posible notar que el valor original se modificó. Esto se debe a que el dato fue ma-
nejado como tipo referencia, lo que provoca que el argumento no genere su propia co-
pia del dato, sino que utilice para el manejo de información la misma posición de me-
moria que el valor original.
112 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Si todo ocurrió como se esperaba, la salida será la siguiente:


Texto Original
<Texto Valor>
Texto Original
<Texto Referencia>
Texto Referencia
Pulse INTRO para continuar

FIN DEL EJERCICIO*

Manejo elemental de variables


Declaración de variables

Para utilizar una variable es necesario declararla; declarar una variable es el proceso me-
diante el cual se establece un identificador, que será reconocido en tiempo de ejecución, pa-
ra almacenar uno o más valores de un determinado tipo.
No se pueden utilizar variables que no hayan sido declaradas previamente.
La declaración de una variable se lleva a cabo a través de la instrucción de declaración:
Dim.

La sintaxis más sencilla de Dim es la siguiente:

Dim Identificador [As TipoDato] [ = ValorInicial]

Donde Identificador es el nombre que se desea asignar a la variable, y TipoDato es el tipo


de dato que corresponde al valor que almacenaremos en la variable. En .NET es posible
asignar un valor al momento de la declaración (ValorInicial).

NOTA
La expresión “almacenar valores en las variables de memoria” es una expresión en sentido fi-
gurado: los valores no “se almacenan” en las variables sino en posiciones físicas de la RAM, y
las variables son sólo el medio a través del cual se tiene acceso a dichas posiciones de memo-
ria. Cuando se dice que almacenamos valores en las variables, nos referimos a que almace-
namos valores en una posición física de memoria, que es referida por el identificador de la
variable.
Capítulo 4. Variables, arreglos y tipos de datos 113

La especificación del tipo de dato a través de la palabra reservada As es opcional; si se omi-


te la especificación de tipo de dato, la variable se declara automáticamente bajo el tipo
Object. Esta declaración automática garantiza que no se utilice una variable que no ha si-
do declarada; sin embargo, es la alternativa más ineficiente, ya el CLR tendrá que invertir
tiempo constantemente en determinar qué tipo de valor es el que está almacenado en la va-
riable.
A continuación se muestran ejemplos de declaración de variables:

1 Dim Edad
2 Dim Edad As Integer
3 Dim Edad As System.Int32
4 Dim Edad As Integer = 50
5 Dim Nombre, Apellido As String
6 Dim Nombre, Apellido As String, Edad As Integer

La línea 1 declara una variable Object. La línea 2 declara una variable Integer. La 3 es
exactamente igual a la línea 2, ya que Integer es la referencia a System.Int32. La línea
4, además de declarar la variable, le asigna un valor de inicio. La línea 5 demuestra que se
pueden declarar varias variables de un mismo tipo, separando los identificadores con co- 4
mas. La línea 6 demuestra que Dim acepta la declaración de dos o más variables de un mis-
mo tipo, y de dos o más tipos.

Constantes

Se conoce como constantes a las variables que sólo cambiarán su valor una vez en su tiem-
po de vida. Para definirlos se utiliza la siguiente sintaxis.

Const Identificador [As TipoDato] = ValorInicial

Donde Identificador es el identificador de la constante, TipoDato es el tipo de dato que ten-


drá la constante y ValorInicial es el valor que tendrá la constante durante todo su tiempo
de vida. Por ejemplo:

Const PI As Single = 3.1416

Literales

Si se menciona un número 4, no tenemos suficiente información para saber si el número


es Byte, Integer, Double, Decimal, dado que 4 puede ser de cualquiera de esos tipos. Lo
mismo ocurriría con “A”, dado que no sabríamos si se trata de un dato String o Char.
114 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se tienen literales que permiten definir un valor, liberándolo de las ambigüedades de tipo
que pudiera tener.
Las literales son las siguientes:

Type Literal Ejemplo de uso


Boolean True True
False False
Char C “A”C
Decimal D 3.1416D
Double R 3.1416R
Integer I 10I
Long L 10L
Short S 10S
Single F 3.14F
String “ “ “A”

Valores por omisión

Cada variable, en caso de que no se le asigne un valor, tendrá un valor por omisión. A con-
tinuación se muestra una relación de los valores por omisión para los tipos de datos.

Tipo de dato Valor por omisión


Tipos de datos numéricos 0
Boolean False
Date 01/01/0001 12:00 A.M.
Decimal 0
Object Nothing
String “”

Ejercicio 4.2
Demostración de la declaración de variables, constantes,
y la realización de conversiones

En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso
de variables en un proceso.
Capítulo 4. Variables, arreglos y tipos de datos 115

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado AreaRec-
tangulo.

3. Edite el programa de tal forma que aparezca como sigue.

Codificación de AreaRectangulo - Module1.vb

1 Module Module1
2
3 Sub Main()
4 Const Titulo As String = “—- Rectángulo —-”
5 Dim Base As Integer
6 Dim Altura As Single = 0
7 Dim Resultado As Single, Entrada As String
8
9 Console.WriteLine(Titulo)
10 Console.Write(“Base: “)
11 Entrada = Console.ReadLine() 4
12 Base = CInt(Entrada)
13 Console.Write(“Altura: “)
14 Entrada = Console.ReadLine()
15 Altura = CType(Entrada, Single)
16
17 Resultado = (Base * Altura)
18 Console.WriteLine(“Resultado: “ & Resultado.ToString())
19 End Sub
20
21 End Module

➤ Construcción de un solo proyecto

4. Al agregar éste, se tendrán cuatro proyectos en la solución. En ocasiones, cuando las so-
luciones son muy grandes, reconstruir una completamente para saber si se tienen proble-
mas en el proyecto que se está desarrollando puede implicar un consumo innecesario de
recursos de procesamiento.
5. Para construir únicamente un proceso, y no todos los de la solución, basta con seleccio-
nar el proyecto en Solution Explorer, desplegar el menú contextual y seleccionar la op-
ción Build. De esa forma se construirá sólo el proyecto seleccionado.
116 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Seleccione en Solution Explorer el proyecto; para ello coloque el puntero sobre el nom-
bre del proyecto AreaRectangulo, haga clic con el botón derecho del ratón para desple-
gar el menú contextual y seleccione Build.

7. Vea en Output cómo se procesa solamente el proyecto recién desarrollado. Cuando su


proyecto ya no presente errores, podrá construirse la solución, y ejecutarse con con-
fianza.

Ejecución guiada de AreaRectangulo – Module1.vb

8. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya rea-
lizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para com-
probar el comportamiento de su programa (F5).
9. La línea 4 declara una constante, a la cual se le asigna como valor el mensaje que ha de
aparecer como encabezado del programa (línea 9); en la línea 5 se muestra una decla-
ración de variable en su forma más sencilla; en la línea 6 se comprueba que es posible
asignar un valor inicial al momento de la declaración; en la línea 7 se comprueba la po-
sibilidad de declarar múltiples variables de múltiples tipos en una misma línea (aunque
esta práctica no se recomienda porque podría hacer perder claridad al código).
10. En la línea 9 se muestra el título del programa en la consola, en la 10 se muestra el men-
saje que pregunta la base del rectángulo y en la 11 se asigna a la variable Entrada el
valor que el usuario ingresa desde la consola.
11. Como el dato se recibe en formato String desde la consola, la línea 12 se encarga de
convertirlo en Integer, utilizando para ello la función específica CInt; el resultado es
asignado a la variable Base. La misma mecánica se seguirá para preguntar y convertir
Capítulo 4. Variables, arreglos y tipos de datos 117

la altura del rectángulo, con la diferencia de que se utilizará para la conversión la fun-
ción genérica CType.
12. La línea 17 calcula el área del rectángulo, asignando el valor a la variable Resultado.
Como Resultado es de tipo Single, posee de forma intrínseca el método ToString,
que es utilizado en la línea 18 para mostrar los resultados.
13. Todas las conversiones que realizamos en este programa pudieron haberse obviado, da-
do que el programa no es type safe; es decir, el CLR hubiera realizado la conversión
cast en caso de que nosotros no la hubiéramos llevado a cabo de manera explícita.
14. Proporcione un valor de 10 para la base y 15 para la altura, y vea los resultados.
Si todo ocurrió como se esperaba, la salida será la siguiente:
Entrada —- Rectángulo —-
Base: 10
Altura: 15
Resultado: 150

FIN DEL EJERCICIO*

Origen de las variables: clases y estructuras 4


Decíamos que en Visual Basic las variables son instancias de una clase o una estructura:
❑ Variables basadas en clase (intermediación requerida). Sabemos que una cla-
se es la definición formal de un tipo de objeto. Un objeto es la instancia de una clase;
éste puede contener información y comportamiento. En el caso de los datos almacena-
dos en memoria a través de un objeto, éstos pueden estar disponibles al usuario median-
te referencias. Uno hace referencia al objeto, y el objeto hace referencia a una posición
de memoria en donde se encuentra el dato; esa intermediación que realiza el objeto pa-
ra llegar al dato consume recursos de almacenamiento temporal en la computadora (lo
que se conoce como heap allocation).
Este tipo de variables exigen más recursos, pero ofrecen mayor funcionalidad.
❑ Variables basadas en estructura (acceso directo, sin intermediación). Una
estructura (structure) es muy similar a una clase, en el sentido de que puede almacenar
datos y métodos; la diferencia con respecto a una variable basada en una clase es que la
variable basada en estructura contiene de manera directa los datos definidos en la es-
tructura; esto elimina la necesidad de una intermediación entre la variable y el dato, por
lo que no se consumen recursos adicionales de la computadora en el área de almacena-
miento temporal.
En la tabla que muestra los tipos de datos disponibles en Visual Basic se hace referencia a
la estructura o la clase en la que se basan.
118 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El hecho de que las variables tengan su origen en una estructura o clase les proporciona
una funcionalidad extendida y extensible, que hace de las variables un elemento del len-
guaje con vida propia.

Alcance de las variables

El alcance (scope) de las variables determina en qué partes del código podrá ser utilizada
una variable sin utilizar un calificador.
Para entender el alcance debemos entender primero el concepto de bloque de código. Un
bloque de código (code block) es el conjunto de líneas que constituyen una unidad de eje-
cución. Generalmente se encuentran delimitados por una línea de inicio y una línea de con-
clusión (a lo que se conoce como branching); todas las instrucciones que culminen con End
son delimitadores de bloque de código (Module-End Module, Sub-End Sub, If-End If,
etcétera). Existen otras instrucciones, como For-Next y Do-Loop, que aunque no conclu-
yen con End, también contienen bloques de código. Los bloques pueden ser condicionales
o no. Son bloques condicionales cuando su ejecución depende del valor obtenido al resol-
ver una expresión lógica (If-End If, Do-Loop, por ejemplo), mientras que son bloques
no condicionales aquellos que no dependen de una evaluación para ejecutarse (Module-End
Module, Namespace-End Namespace, por ejemplo).

Un aspecto importante a tomar en cuenta es que un bloque de código puede formar parte
de otro bloque de código.
Las variables tienen los siguientes alcances:
❑ Alcance de bloque (Block scope). El alcance de bloque se presenta cuando la va-
riable está disponible sólo en el bloque de código en el que está declarada. El alcance
de bloque es el más estrecho, en el sentido de que la variable tiene la menor vigencia
posible. Cómo se define: declarando la variable dentro de un bloque de código.
Este tipo de alcance se aplica en los siguientes estatutos:
■ Do-Loop
■ For [Each]-Next
■ If-End If
■ Select-End Select
■ SyncLock-End SyncLock
■ Try-End Try
■ While-End While
■ With-End With
Capítulo 4. Variables, arreglos y tipos de datos 119

❑ Alcance de procedimiento (Procedure scope). El alcance de procedimiento se


presenta cuando la variable está disponible sólo para el procedimiento en el que está de-
clarada. Cuando las variables pueden ser utilizadas sólo dentro del procedimiento que
las declara, reciben el nombre de variables locales. Cómo se define: declarando la va-
riable dentro de un procedimiento, pero no dentro de un bloque; se recomienda decla-
rar al inicio del procedimiento, antes de cualquier bloque de código.
❑ Alcance de módulo (Module scope). El alcance de módulo se presenta cuando la
variable está disponible para todos los procedimientos de un determinado módulo, cla-
se o estructura en la que está declarada. Cómo se define: declarando la variable dentro
del capítulo, clase o estructura, antes de declarar cualquier procedimiento.
❑ Alcance de espacio de nombres (Namespace scope). El alcance de espacio de
nombres se presenta cuando la variable está disponible para todos los módulos, clases
o estructuras contenidas en un espacio de nombres. Este alcance es el de mayor ampli-
tud. Cómo se define: declarando una variable a nivel módulo, con accesibilidad Friend
o Public (que se verá más adelante).

Shadowing
4
Existe la posibilidad de que en un mismo programa existan dos variables con el mismo
nombre; esto puede parecer contradictorio, ya que se había expresado que cada variable de-
be tener un identificador único.
Ya con el conocimiento que hemos adquirido, podemos decir que dos variables no pueden
compartir el mismo identificador si tienen el mismo alcance. En resumen, pueden existir
variables homónimas si se declaran con diferente alcance; en ese sentido, podemos decla-
rar una variable variableZ a nivel módulo, y una variable variableZ dentro de un proce-
dimiento, lo cual no causará problemas al momento de compilar, pero sí se podrá generar
un procesamiento particular en tiempo de ejecución.
El hecho de que dos variables tengan el mismo identificador no causa problema para Vi-
sual Basic siempre y cuando tengan alcances distintos; el programa utilizará para el proce-
samiento de datos aquella variable con alcance más estrecho; a este comportamiento se le
da el nombre de shadowing.
Los valores de variables con el mismo nombre y distinto alcance serán mantenidos en tiem-
po de ejecución, a fin de utilizar el valor de menor alcance según se requiera en el programa.
120 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Accesibilidad de las variables (accesibility)

La accesibilidad (accesibility) de una variable es el permiso que se proporciona al código


para leerla o escribir en ella. El concepto de accesibilidad está muy ligado al concepto de
alcance, ya que entre los dos constituyen la disponibilidad real de una variable para su uso
a través de código.
Las diferentes opciones que se tienen de accesibilidad son:
❑ Public. Conocidas como variables públicas. Se proporciona acceso público a la va-
riable; es decir, no hay restricciones de uso de la variable cuando se define como públi-
ca. Sólo se puede definir a nivel capítulo, espacio de nombres o archivo físico; nunca a
nivel procedimiento.
❑ Protected. Conocidas como variables protegidas. Se proporciona acceso protegido
a la variable; es decir, pueden ser utilizadas sólo por la clase en que se declaró la varia-
ble, o en aquellas clases derivadas de ésta. Sólo se puede definir a nivel clase, nunca a
nivel procedimiento.
❑ Friend. Se proporciona acceso que asume confianza hacia el usuario (de ahí lo “amis-
toso”); pueden ser utilizadas por el programa que la declara, y por todos aquellos que
se encuentren en el mismo ensamblado. Sólo se puede definir a nivel capítulo, espacio
de nombres o archivo físico; nunca a nivel procedimiento.
❑ Protected Friend. Se proporciona la unión de restricciones de Protected y de
Friend.

❑ Private. Conocidas como variables privadas. Se proporciona acceso privado a una


variable. Sólo están disponibles para el alcance en el que fueron declaradas. Sólo se
puede definir a nivel capítulo, espacio de nombres, o archivo físico; nunca a nivel pro-
cedimiento.
❑ Static. Conocidas como variables estáticas. Permite incrementar la persistencia del
valor de las variables, manteniendo el último valor que haya asumido aun después de la
terminación del procedimiento que la declaró. Sólo se puede definir a nivel procedi-
miento. No se pueden declarar variables estáticas en los procedimientos de una estruc-
tura; sólo se aceptan para los procedimientos de clases. Static es muy similar a una va-
riable Public pero se diferencian por el lugar en donde se declaran. En cierta forma, las
variables Static serían como variables públicas declaradas en los procedimientos.
❑ Shared. Conocidas como variables compartidas. Indica que la variable no está aso-
ciada con la instancia de una clase o estructura determinada. Se puede acceder a una va-
riable compartida a través de un calificador anteponiendo al nombre de la variable el
nombre de la clase en donde se declaró inicialmente, más un punto separador. Sólo se
puede definir a nivel capítulo, espacio de nombres o archivo físico; nunca a nivel pro-
Capítulo 4. Variables, arreglos y tipos de datos 121

cedimiento. Las variables compartidas (shared variables) identifican una sola unidad de
almacenamiento, sin importar cuántas instancias de la clase que la declara hayan sido
creadas. Cuando una variable no es definida como compartida, se conoce como varia-
ble de instancia (instance variable), y cada instancia mantiene la referencia de su pro-
pio valor. Este tipo de variables es especialmente útil para trasladar valores de un for-
mulario a otro, en aplicaciones de formularios múltiples, ya que no basta con que las
variables sean públicas.
❑ ReadOnly. Especifica que se trata de una variable de sólo lectura.
Si no se especifica alguna opción de accesibilidad, las variables serán variables de ins-
tancia y privadas (instance variable, private).
En caso de que se desee asignar alguna opción de accesibilidad, la especificación pasa a
ser el estatuto de declaración y puede sustituir a Dim. Por ejemplo:
Static Dim Edad As Integer

Es lo mismo que:
Static Edad As Integer

4
NOTA
En el caso de la accesibilidad es importante tener en cuenta la accesibilidad del objeto conte-
nedor de la variable (objeto que contiene a otro objeto).

Se puede proporcionar permiso a nivel procedimiento, pero si no se tiene permiso para dis-
poner del capítulo, clase o estructura que contiene el procedimiento mencionado, no será po-
sible llegar nunca a él.

Ejercicio 4.3
Demostración del alcance de las variables y la forma en que preservan
valores (II)

En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Alcance.
3. Edite el programa de tal forma que aparezca como sigue:
122 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Alcance - Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5 Dim Texto1 As String = “Alcance módulo”
6
7 Sub Main()
8 Console.WriteLine(Texto1)
9 Dim Texto2 As String = “Alcance procedimiento”
10 If Texto2 <> “” Then
11 Console.WriteLine(Texto2)
12 Dim Texto3 As String = “Alcance block”
13 Console.WriteLine(Texto3)
14 End If
15 Procedimiento1()
16 Procedimiento1()
17 Procedimiento1()
18 Procedimiento2()
19 Console.WriteLine(“ “)
20 Console.Write(“Pulse INTRO para continuar”)
21 Console.ReadLine()
22 End Sub
23
24 Sub Procedimiento1()
25 Static Texto4 As String
26 Texto4 = “Valor + “ & Texto4
27 Dim Texto5 As String = “Texto 5”
28 Console.WriteLine(“—Procedimiento 1 ——”)
29 Console.WriteLine(“Texto 1: “ & Texto1)
30 Console.WriteLine(“Texto 4: “ & Texto4)
31 Console.WriteLine(“———————————”)
32 End Sub
33
34 Sub Procedimiento2()
35 Console.WriteLine(“—Procedimiento 2 ——”)
36 If Texto1 <> “” Then
37 Dim Texto1 As String = “Shadow”
38 Console.WriteLine(“Texto 1: “ & Texto1)
39 End If
40 Console.WriteLine(“Texto 1: “ & Texto1)
41 Console.WriteLine(“———————————”)
42 End Sub
43
44 End Module
Capítulo 4. Variables, arreglos y tipos de datos 123

Ejecución guiada de Alcance – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya reali-
zado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para com-
probar el comportamiento de su programa (Oprima F5).
5. Este programa es type safe, dado que todas las variables deberán declararse antes de ser
utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explícita
(Option Strict) (líneas 1 y 2).
6. Se declaran variables con diferente alcance en las líneas 5, 9 y 12. En la línea 5 se de-
clara la variable Texto1; ésta tiene un alcance a nivel módulo, debido a que se declara
dentro del módulo, fuera de cualquier procedimiento.
Esta variable podrá ser utilizada por todos los procedimientos del módulo, es decir,
Main(), Procedimiento1() y Procedimiento2(); esto se comprueba en la líneas 8 y
29, pues se despliega en la consola una variable no definida en esos procedimientos.
En la línea 9 se declara la variable Texto2, que tiene un alcance a nivel procedimiento,
por estar declarada dentro de un procedimiento específico, pero fuera de un bloque de
4
código; por esa razón se trata de una variable local. Esta variable estará disponible só-
lo para Main(), pero no para otros procedimientos.
En la línea 12 se declara la variable Texto3, que tiene un alcance a nivel bloque de có-
digo y estará disponible desde que se declara (línea 12) hasta que se encuentre el esta-
tuto que marca el final del bloque de código (en este caso End If, en la línea 14).
Si se trata de utilizar la variable Texto3 después de la línea 14, pensando que es una va-
riable local (de alcance a nivel procedimiento), nuestro programa generará error, ya que
la variable sólo existe declarada para el bloque en que se declara.
7. Comprobación de la variable estática. En la línea 15 se manda ejecutar Procedimien-
to1(); en dicho procedimiento se define una variable estática llamada Texto4 (línea
25). Esta variable tendrá un tiempo de vida que excede el tiempo de vida del procedi-
miento que la declara, ya que por ser estática, mantendrá los valores en memoria aun
después de concluida la ejecución del procedimiento.
En la línea 26 se asigna a Texto4 la constante String Valor + que se concatenará con
el valor que tenga la misma Texto4; en virtud de que la variable es estática, el valor que
va adoptando se comporta como un acumulador, que nunca pierde el valor que tenía,
obtenido de procesamientos anteriores.
124 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las líneas 16 y 17 mandan ejecutar Procedimiento1(), a fin de que se compruebe que


efectivamente la variable mantiene su valor al correr de las múltiples ejecuciones del
procedimiento.
8. Comprobación de shadowing. Ya vimos que en la línea 5, Texto1 se definió con un al-
cance a nivel módulo y, al momento de declarar la variable, se le asignó el valor Alcan-
ce módulo. En Procedimiento2(), se vuelve a definir la variable Texto1 (línea 37) y
se le asigna al momento de declaración el valor Shadow.
9. a) ¿Qué alcance tiene la variable Texto1, declarada en la línea 37?

b) ¿Qué valor posee Texto1 cuando es desplegada en la consola en la línea 38?

c) ¿Qué valor posee Texto1 cuando es desplegada en la consola en la línea 40?

Como podrá darse cuenta, el programa no genera conflicto con la doble declaración de la
variable; simplemente utiliza aquella que tenga menor alcance.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Alcance módulo
Alcance procedimiento
Alcance block
––Procedimiento 1 ––––
Texto 1: Alcance módulo
Texto 4: Valor +
––––––––––––––––––––––
––Procedimiento 1 ––––
Texto 1: Alcance módulo
Texto 4: Valor + Valor +
––––––––––––––––––––––
––Procedimiento 1 ––––
Texto 1: Alcance módulo
Texto 4: Valor + Valor + Valor +
––––––––––––––––––––––
––Procedimiento 2 ––––
Texto 1: Shadow
Texto 1: Alcance módulo
––––––––––––––––––––––

Pulse INTRO para continuar


Capítulo 4. Variables, arreglos y tipos de datos 125

10. Modifique la línea 21, sustituyendo el estatuto de declaración Static por Dim. Ejecute
el programa nuevamente, y explique qué sucede:

FIN DEL EJERCICIO *

Arreglos
Se conoce como arreglos (arrays) —también llamados matrices en algunos casos— a un
conjunto de posiciones en memoria que son referidas por un mismo identificador.
Se accede a un dato almacenado en una posición de memoria dentro de un arreglo a tra-
vés de un subíndice, que es la posición secuencial de cada elemento dentro de la colec- 4
ción. Los subíndices, como en todos los lenguajes de .NET, son de base cero; es decir, ini-
cian en cero.
En Visual Basic, los arreglos tienen un tratamiento de colecciones, por lo cual los subíndi-
ces siempre se especifican entre paréntesis. Las colecciones son conjuntos de objetos lógi-
camente relacionados, diferenciados por un subíndice.
En su calidad de colecciones, pueden ser explorados con la instrucción For Each, cuya sin-
taxis es la siguiente:

For Each Elemento [As TipoDato] In Colección


BloqueCódigo
[Exit For]
Next

Donde Elemento es la variable de trabajo en donde se almacenará el elemento (TipoDato),


que de no especificarse asumirá el mismo tipo de dato que tengan los elementos de la
colección. Colección es la colección de objetos que podrán ser leídos de forma secuencial
utilizando For Each. BloqueCodigo es el bloque de código que se ejecutará de forma ite-
rativa para cada elemento de la colección explorado. Al encontrar Next, el proceso iterati-
vo comienza nuevamente; es posible interrumpir el ciclo en cualquier momento utilizando
Exit For.
126 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Arreglos unidimensionales

Los arreglos unidimensionales se conocen simplemente como arreglos, y requieren de un


sólo subíndice para tener acceso a un elemento del arreglo. La forma de declarar un arre-
glo en Visual Basic es la siguiente.
Dim Arreglo(MáximoSubíndice) As TipoDato

Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que
las variables. MáximoSubíndice es el número mayor de subíndice del arreglo y TipoDato
es el tipo de dato de los elementos del arreglo. Por ejemplo:
Dim VentaMensual(11) As Integer

En este caso se tiene un arreglo de 12 posiciones (0 a 11), donde los elementos son de ti-
po Integer.
En caso de que no se especifique un número determinado de elementos, el arreglo será de
un número indeterminado de elementos.
Dim VentaMensual() As Integer

A este tipo de arreglos se les llama arreglos unidimensionales, pues únicamente es nece-
sario especificar un subíndice para tener acceso a una de sus posiciones en memoria.
También es posible asignar valores al momento de declarar un arreglo. En ese caso no se
deberá especificar número de elementos, ya que éste se calculará automáticamente consi-
derando el número de valores que se especifiquen entre llaves ({ }), separados por comas
(,). La sintaxis correspondiente es la siguiente:
Dim Arreglo() As TipoDato = {SerieValores}
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos y Se-
rieValores es la serie de valores que asumirán los elementos; los valores deberán estar se-
parados por comas. Por ejemplo:
Dim Numeros() As Integer = {10,20,40,100}

En este caso, Numeros(1) tendrá el valor de 20.


Capítulo 4. Variables, arreglos y tipos de datos 127

Arreglos multidimensionales

Se conoce como arreglo multidimensional a un conjunto de posiciones en memoria que


son referidas por un solo identificador a través de dos o más subíndices.
Al número de subíndices que es necesario especificar para tener acceso a una posición de
memoria de un arreglo se le llama dimensionalidad (dimensionality) o rango (rank); Vi-
sual Basic acepta hasta 32 dimensiones.
A los arreglos de dos dimensiones (dimensionalidad 2), que son los multidimensionales
más utilizados, se les da el nombre de arreglos rectangulares. La sintaxis para definirlos
es la siguiente:
Dim Arreglo(MS1,MS2,...,MSn) As TipoDato

Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que
las variables. MS1 es el número mayor de subíndice para la dimensión 1, MS2 es el núme-
ro mayor de subíndice para la dimensión 2, y así hasta definir todas las dimensiones. Tipo-
Dato es el tipo de dato de los elementos del arreglo. Por ejemplo:
Dim VentaTrim(2,3) As Integer
4
En este caso se tiene un arreglo de 12 posiciones (de 0 a 2, 3 posiciones; de 0 a 3, 4 posi-
ciones; 3 posiciones  4 posiciones=12), donde los elementos son de tipo Integer.
En caso de que no se especifique un número determinado de elementos, el arreglo será de
un número indeterminado de elementos.
Dim VentaTrim(,) As Integer

A este tipo de arreglos se les llama arreglos multidimensionales, pues es necesario especi-
ficar un subíndice para tener acceso a una posición en memoria del arreglo.
También es posible asignar valores al momento de declarar un arreglo. En ese caso no se
deberá especificar número de elementos, ya que el número de elementos se calculará au-
tomáticamente considerando el número de valores que se especifiquen entre llaves ({ }),
separados por comas (,). Cada llave constituye la serie de valores para una dimensión. La
sintaxis sería la siguiente.
Dim Arreglo(,) As TipoDato = {{SerieValores1},{SerieValores2}}
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y
SerieValores1 y SerieValores2 es la serie de valores que asumirán los elementos; los valo-
res deberán estar separados por comas.
128 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejemplo.
Dim VentaTrim(,) As Integer = {{1000,20000,10000,5000}, _

{2000,30000,15000,2000}}

En este caso, VentaTrim(1,2) tendrá el valor de 15000.

Arreglos escalonados

Se conoce como arreglos escalonados (jagged arrays) a un arreglo que almacena arreglos.
La sintaxis para su definición sería la siguiente.
Dim Arreglo()() As TipoDato
Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que
las variables. Dependiendo el número de arreglos que se desee incluir, se deberán agregar
pares de paréntesis después del nombre de variable. TipoDato es el tipo de dato que tienen
los elementos en los arreglos. Por ejemplo:
Dim Numeros()() As Byte

En este caso se tiene un arreglo que almacenará dos arreglos, donde los elementos son de
tipo Byte.
También es posible asignar valores al momento de declarar un arreglo. En ese caso, los va-
lores son definiciones de arreglos.
Dim Arreglo()()As TipoDato = {Arreglo1,Arreglo2}
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y
Arreglo1 y Arreglo2 son arreglos con elementos que son TipoDato; los arreglos deberán es-
tar separados por comas. Por ejemplo:
Dim Numeros()() As Byte = { Byte(){10,15,12,11}, _

Byte() {40,50,60} }
Capítulo 4. Variables, arreglos y tipos de datos 129

En este caso, Numeros(0)(3) tendrá el valor de 11. Estaríamos extrayendo, del arreglo 0,
el elemento 3. El primer subíndice indica el número de arreglo del que se trata, mientras
que el segundo indica el o los subíndices del elemento que queremos extraer. Un arreglo
escalonado puede contener arreglos unidimensionales o multidimensionales.
Los arreglos escalonados no son lo mismo que los arreglos multidimensionales; estos últi-
mos pueden llegar a consumir cantidades muy grandes de memoria. Por ejemplo, si se
quiere almacenar en un arreglo el número de identificación de 1000 empleados y 5 núme-
ros de categorías de empleados, un arreglo multidimensional ocuparía 1000  5 posicio- 4
nes de memoria, es decir, 5000; un arreglo escalonado, por el contrario, requeriría sólo
1000  5, es decir, 1005. Si el arreglo fuera de datos Long (8 bytes), la diferencia en con-
sumo de memoria sería de 31,960, que podría implicar un ahorro muy importante.
Algo que es importante tomar en cuenta es que los arreglos escalonados no forman parte
de CLS, por lo que trabajarán adecuadamente sólo en implementaciones Microsoft, y no
en otras plataformas que implementen considerando CLS como base.

Ejercicio 4.4
Comprobación del uso de arreglos unidimensionales, multidimensionales
y escalonados

En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Arreglos.
3. Edite el programa de tal forma que aparezca como sigue:
130 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Arreglos - Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7 Dim i As Integer
8
9 Console.WriteLine(“Arreglo unidimensional 1:”)
9 Dim Uni1() As Integer = {22, 49, 20, 40}
10 For Each i In Uni1
11 Console.WriteLine(i)
12 Next
13 Console.WriteLine(“Arreglo unidimensional 2:”)
14 Dim Uni2() As Integer = {55, 66, 77}
15
16 For Each i In Uni2
17 Console.WriteLine(i)
18 Next
19
20 Console.WriteLine(“Arreglo multidimensional:”)
21 Dim Multi(,) As Integer = {{92, 49}, {44, 20}, {10, 48}}
22 Console.WriteLine( _
23 String.Format(“Fila 0: {0},{1} “, Multi(0, 0),
Multi(0, 1)))
24 Console.WriteLine( _
25 String.Format(“Fila 1: {0},{1} “, Multi(1, 0),
Multi(1, 1)))
26 Console.WriteLine( _
27 String.Format(“Fila 2: {0},{1} “, Multi(2, 0),
Multi(2, 1)))
28
29 Console.WriteLine(“Arreglo escalonado:”)
30 Console.WriteLine(“Arreglo 1, posición 2”)
31 Dim Esca()() As Integer = {Uni1, Uni2}
32 Console.WriteLine(Esca(1)(2))
33
34 Console.Write(“Presione INTRO”)
35 Console.ReadLine()
36 End Sub
37
38 End Module
Capítulo 4. Variables, arreglos y tipos de datos 131

Ejecución guiada de Arreglos – Module1.vb

4. Construya la solución (Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de


inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución
(Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su progra-
ma (oprima F5).
5. En la línea 10 se declara un arreglo unidimensional, llamado Uni1, y al mismo tiempo
que se declara se le asignan valores a las posiciones de memoria del arreglo. Se trata de
un arreglo de cuatro posiciones de memoria, por lo que sus subíndices irán de 0 a 3.

22

49

20

40
4
En la línea 11 se inicia una estructura For Each que permitirá hacer una lectura de los
valores almacenados en el arreglo. La estructura utilizará la variable i, que es de tipo
Integer, para trabajar cada uno de los elementos del arreglo Uni1. La estructura For
Each comenzará una lectura secuencial de todos los elementos, desde el subíndice 0 has-
ta el 3; i asumirá el valor del elemento que se esté leyendo en el momento, por lo que
trabajar con i es como estar trabajando con el elemento del arreglo. La línea 12 provo-
ca que se vea en la consola el contenido de cada una de las posiciones en memoria.
La línea 16 declara un arreglo unidimensional de tres posiciones, llamado Uni2, que se-
rá utilizado junto con Uni1 más adelante. El proceso para el mostrado de contenido se
repite con Uni2. Sus valores son los siguientes:

55

66

77

6. En la línea 22 se declara un arreglo multidimensional, llamado Multi, constituido por


dos dimensiones. Se asignan valores al momento de la declaración, que nos indican que
el arreglo será de dos columnas y tres filas. Vea cómo el número de series de valores de-
132 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

termina el número de filas, mientras que el número de elementos de cada serie de valo-
res determina el número de columnas:

92 49

44 20

10 48

Las líneas de la 23 a la 28 se encargan de mostrar los valores que componen cada fila.
Para ello nos apoyamos de la función String.Format, que hace una sustitución directa
de parámetros. Vea cómo funciona:
String.Format(“Primer valor {0} segundo valor {1}”, 10, 20)

generaría como resultado:


“Primer valor 10 segundo valor 20”

Los parámetros se incluyen con base 0, y deberá proporcionarse una serie de valores se-
parados por comas después del String que queremos construir. El primer valor de la
serie toma la primera posición ({0}), el segundo la segunda ({1}), y así sucesivamente.
Los subíndices en los arreglos indican la fila y la columna, considerando una base cero.
7. La línea 32 define un arreglo escalonado, llamado Esca, que almacena los arreglos Uni1
y Uni2:

22 55

49 66

20 77

40

La línea 33 muestra, del segundo arreglo almacenado (subíndice 1), el tercer elemento
almacenado (subíndice 2). Entre los primeros paréntesis irá el subíndice del arreglo es-
calonado; es decir, permite seleccionar al arreglo a inspeccionar. En los siguientes pa-
réntesis se coloca el subíndice (o subíndices) del arreglo seleccionado.
A diferencia de un arreglo multidimensional, en donde todas las filas tienen igual nú-
mero de columnas, en un arreglo escalonado la forma y dimensiones dependen de los
arreglos almacenados.
Capítulo 4. Variables, arreglos y tipos de datos 133

Si todo ocurrió como se esperaba, la salida será la siguiente:

Arreglo unidimensional 1:
22
49
20
40
Arreglo unidimensional 2:
55
66
77
Arreglo multidimensional:
Fila 0: 92,49
Fila 1: 44,20
Fila 2: 10,48
Arreglo escalonado:
Arreglo 1, posición 2
77
Presione INTRO

8. Vea el siguiente ejemplo y coloque las referencias que hacen falta.


a) Para utilizar Uni1 49 = Uni1(1)
4
b) Para utilizar Uni2 55 = _________________________
c) Para utilizar Multi 10 = _________________________
d) Para utilizar Esca 66 = _________________________

Estructuras y enumeraciones
Estructuras

Las estructuras (structures) son la implementación de estructuras de datos definidos por el


usuario en Visual Basic. Las estructuras son elementos value type y pueden contener datos
y comportamientos. Son muy parecidas a las clases, con la diferencia que estas últimas son
reference type.
La forma de implementar estructuras se identifica de acuerdo con la siguiente sintaxis:

Structure NombreEstructura
Elementos
End Structure
134 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

donde NombreEstructura es el nombre de la estructura en cuestión, y Elementos podrán ser


variables, funciones, procedimientos y eventos asociados a aquélla. Por ejemplo:

Structure NombreCompleto
Public Nombre As String
Public ApellidoPaterno As String
Public ApellidoMaterno As String
Function
End Structure

En este caso se declaró una estructura que almacena el nombre y los apellidos de una per-
sona. Las variables que componen la estructura tienen acceso público, a fin de ser utiliza-
das de forma abierta. En caso de que se tengan en una estructura variables que se utilicen
sólo dentro de la estructura misma, la accesibilidad deberá variarse.

Enumeraciones
Las enumeraciones (enumerations) son colecciones de valores constantes, nominados con
el fin de limitar un dominio determinado. Son muy útiles para evitar el uso de valores no vá-
lidos para elementos clasificados, como podrían ser colores, categorías, estados, etcétera.
La forma de implementar enumeraciones se realiza de acuerdo con la siguiente sintaxis:

Enum NombreEnumeración
Elementos
End Enum

Donde NombreEnumeración es el nombre de la enumeración, y Elementos podrán ser las


constantes permitidas. A las constantes se les puede asignar o no un valor de inicio. Por
ejemplo:
Enum Estado
Activo
Inactivo
End Structure

En este caso se declaró una enumeración que permite el uso de las referencias Estado.Ac-
tivo y Estado.Inactivo como valores válidos.

Pudo haber sido también de la siguiente forma:


Enum Estado
Activo = “A”
Inactivo = “I”
End Structure

Donde además de limitarse el dominio, se permite asignar un valor interno a la constante.


Capítulo 4. Variables, arreglos y tipos de datos 135

MAPA MENTAL DEL CAPÍTULO

4
136 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Accesabilidad, 100, Constantes, 113 Matrices, 125 typing, 109


120 Conversión Module scope, 119 Structure(s), 117,
Accessibility, 100, de datos, 104 Namespace scope, 133
120 explícita, 106 119 Subíndice, 125
Alcance, 100, 118 implícita, 106 Narrowing, 106 Tiempo de vida, 100
de bloque, 118 por método, 107 Notación húngara, Tipo de dato, 100,
de espacio de Datatype, 100, 103 102 103
nombres, 119 Date, 104 Option no numérico,
de módulo, 119 Decimal, 104 Explicit, 109 104
de procedimiento, Dim, 112 Strict, 109 numérico, 104
119 Dimensionalidad, Pascal casing, 101 Tipos de
Arrays, 125 127 Private, 120 referencia, 107
Arreglo(s), 125 Dimensionality, 127 Procedure scope, de valor, 107
dimensional, 127 Dominio, 103 119 Type safe, 109
escalonados, 128 Double, 104 Programas de tipo Value type, 107
unidimensionales, Enum, 134 de datos Variable(s)
126 Enumeraciones, 134 asegurados, 109 basadas en clase
As, 113 Enumerations, 134 reforzados, 109 (intermediación
Block scope, 118 Estructura, 117, 133 Protected, 120 requerida),
Bloque(s) Friend, 120 Friend, 120 117
condicionales, Hungarian Public, 120 basadas en
118 notation, 102 Rango, 127 estructura(sin
de código, 118 Identificador, 100 Rank, 127 intermediación
no condicionales, Identifier, 100 ReadOnly, 121 requerida), 117
118 Instance variable, Reference type, 107 compartidas, 120
Boolean, 104 121 Scope, 100, 118 de instancia, 121
ByRef, 108 Instrucción de Shadowing, 119 de memoria, 99
Byte, 104 declaración Shared, 120 de solo lectura,
ByVal, 108 (Dim), 112 Short, 104 121
Camel casing, 102 Integer, 104 Single, 104 estáticas, 120
Casting, 106 Jagged arrays, 128 Static, 120 privadas, 120
Char, 104 Lifetime, 100 String, 104 protegidas, 120
Code block, 118 Literales, 113 Strong públicas, 120
Colecciones, 125 Long, 104 type, 109 Widening, 106

PREGUNTAS
4.1 ¿Qué son las variables y cuáles son sus principales características?
4.2 ¿Qué son los arreglos y de qué tipos hay?
4.3 Explique la diferencia entre Value Type y Reference Type.
4.4 ¿Cómo se puede lograr que un programa sea strong typing?
4.5 ¿Qué tipos de datos acepta .NET? Enumérelos y proponga un ejemplo de un da-
to de la vida real que encaje dentro del dominio de tipo.
Capítulo 4. Variables, arreglos y tipos de datos 137

Notas:

4
138 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.

1. Es la referencia lógica a una posición física de la memoria RAM:


a) Estructura
b) Variable
c) Tipo de dato

2. Es el estatuto que ayuda a que el código sea type safe:


a) Option Explicit
b) Option Strict
c) Option Compare

3. Es el atributo que define la cantidad de código en que una variable puede ser utilizada sin invocar su
calificador:
a) Alcance
b) Accesibilidad
c) Tiempo de vida

4. Es el permiso que se proporciona al código para poder leer y escribir en una variable:
a) Alcance
b) Accesibilidad
c) Tiempo de vida

5. Es el comportamiento que da preferencia a la variable de alcance más estrecho:


a) Selecting
b) Scoping
c) Shadowing

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Las variables públicas son las que tienen mayores restricciones.

7. Una de las nuevas capacidades de .NET es poder utilizar variables aun sin haberlas
declarado.

8. Los arreglos multidimensionales tienen un manejo de memoria más económico que


los arreglos escalonados.

9. El alcance de módulo es más estrecho que el alcance de bloque.

10. El identificador de una variable no puede repetirse en un mismo alcance.


CAPÍTULO 5
Espacios de nombres
y desarrollo de librerías
Objetivos: Aprender qué son los espacios de nombres y cómo crearlos y
utilizarlos.

1. Conocerá qué son los espacios de nombres.


2. Sabrá cuáles son los espacios de nombres más utilizados en .NET.
3. Se familiarizará con el manejo de los nombres calificados para in-
vocar espacios de nombres.
4. Aprenderá a importar espacios de nombres en un programa.
5. Aprenderá a crear espacios de nombres definidos por el usuario
y se familiarizará con la forma en que se utilizan en forma de li-
brerías.
6. Aprenderá el uso de alias de espacios de nombres.

139
140 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Espacios de nombres (namespaces) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Nomenclatura para los espacios de nombres . . . . . . . . . . . . . . . . . . . . 143
Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Uso de espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Creación de namespaces propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Alias para los espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Independencia de los ensamblados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Creación y consumo de una librería (DLL) basada
en un espacio de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
➤ Creación de una librería DLL . . . . . . . . . . . . . . . . . . . . . 153
➤ Revisión de todos los elementos asociados a un
proyecto, usando Solution Explorer . . . . . . . . . . . . . . . . 154
➤ Establecimiento de una referencia a una librería
desde Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . 155
➤ Consumo de una librería programáticamente . . . . . . . . 156
Utilización del depurador (Debug) de Visual Studio
y la ejecución línea a línea basada en puntos de
interrupción (breakpoints) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
➤ Establecimiento de un punto de interrupción
(breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
➤ Ejecución línea por línea (Code Stepping) . . . . . . . . . . . 158
➤ Modificación de programas en tiempo de ejecución . . . 159
➤ Puntos de interrupción condicionales . . . . . . . . . . . . . . . 160
➤ Habilitación e inhabilitación de puntos de
interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
➤ Eliminación de los puntos de interrupción
(breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Utilización de Command Window . . . . . . . . . . . . . . . . . . . . . . . . 162
➤ Escritura de comandos de Visual Studio usando
Command Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Uso de herramientas avanzadas para la depuración . . . . . . . . . 165
➤ Apilado de herramientas en Visual Studio . . . . . . . . . . . 165
➤ Ventanas de variables (variable windows) . . . . . . . . . . . 166
➤ Ventanas de inspección de código . . . . . . . . . . . . . . . . . 168
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Capítulo 5. Espacios de nombres y desarrollo de librerías 141

Espacios de nombres (namespaces)


Por definición, un espacio de nombres (namespace) es un esquema lógico que permite
agrupar clases y types relacionados a través de un nombre. En términos generales, es una
referencia lógica a las librerías utilizadas por un programa.
Las librerías, como seguramente ya sabe, son archivos binarios ejecutables, preferente-
mente con extensión DLL, que contienen procedimientos de uso común (en forma de cla-
ses) disponibles para que los programas los utilicen.
La extensibilidad de un lenguaje es su capacidad para integrar librerías desarrolladas por
otros.
Seguramente le habrá sucedido que al tratar de ejecutar un programa (con extensión EXE)
que copió desde otra máquina éste no funciona y despliega una mensaje de error donde di-
ce que no puede encontrar un DLL que necesita para trabajar.
Podemos concluir algo: que los programas se apoyan en las librerías, pues mandan llamar
a ejecución procedimientos contenidos en ellas. Los espacios de nombres hacen que la
identificación, localización y uso de las librerías se realice de manera sencilla y lógica.
Cuando se desarrolla en Visual Basic se crean muchos objetos que de manera conjunta re-
presentan la interfaz de usuario, y que a través de su comportamiento forman lo que llama-
mos aplicación. A cada objeto de la aplicación se le pueden alterar las propiedades o eje-
cutar sus métodos, y éstos pueden ser utilizados por funciones o estructuras de decisión y
control.
5
Tanto las clases de las que derivan los objetos como las funciones del lenguaje deben es-
tar definidas en alguna parte.
Físicamente, los archivos de clases de .NET Framework tienen la extensión DLL; en .NET
las cosas no cambian y cada vez que usted declara una variable de tipo int, por ejemplo,
realmente está generando una instancia de una clase que se encuentra definida en un archi-
vo DLL. Probablemente para usted sea transparente, pero un programa simple puede estar
haciendo referencia a varias clases que se encuentran en archivos DLL distintos.
Tome en cuenta que .NET Framework pone a su disposición un número muy grande de cla-
ses ya preparadas para que usted las utilice; éstas se distribuyen en muchas librerías de
vínculos dinámicos (DLL), algunas de ellas de más de 2 MB de código puro, que satisfa-
cen casi cualquier requerimiento general de programación.
Tener en mente los nombres físicos de los archivos DLL y la referencia exacta de las clases
que contienen puede ser una labor titánica. Si desarrolla utilizando Visual Studio quizá se
facilite su trabajo, porque la herramienta de desarrollo establece los enlaces con los DLL de
manera automática.
142 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Tener muchos archivos físicos de librerías constituye una ventaja, pues implica que el len-
guaje ya contiene muchas funciones que no será necesario programar; por otro lado, plan-
tea un problema, pues encontrar tantos archivos no resulta práctico.

NOTA
Las librerías de vínculos dinámicos que conforman el .NET Framework cumplen con todas las
especificaciones de .NET y, por tanto, son ensamblados; aclaramos esto para que no intente
llevar estos archivos DLL a otro sistema y registrarlos, pensando que funcionarán: si no tiene
instalado .NET Framework no lo harán porque son ensamblados y, por tanto, son código ad-
ministrado que requiere la presencia del CLR.

Buscando la simplificación, Microsoft creó un sistema lógico que permite organizar y ca-
tegorizar las clases disponibles en las librerías que componen el .NET Framework, basán-
dose en un concepto: los espacios de nombres (namespaces).
Los espacios de nombres proporcionan una estructura que organiza y simplifica la referen-
cia a las clases a través del .NET Framework, y no sólo Microsoft Visual Basic puede usar
los espacios de nombres; también pueden hacerlo el resto de los lenguajes .NET, ya que
realmente conviven con el CLR.
Es muy importante señalar que los espacios de nombres no tienen nada que ver con la
herencia entre las clases. Los espacios de nombres sólo están relacionados con la identi-
ficación de clases, y no con la jerarquía madre-hija de éstas. Ciertamente, los espacios de
nombres sugieren una jerarquía, pero ésta no tiene nada que ver con la herencia entre cla-
ses; realmente se trata de un agrupamiento basado en funcionalidad.
Quienes desarrollan basándose en la tecnología COM están conscientes de que los espa-
cios de nombres son la evolución lógica de los identificadores ProgID.
Un espacio de nombres es dos cosas: a) un convencionalismo de nomenclatura y b) un es-
quema lógico de organización de clases de .NET Framework.
Los espacios de nombres organizan colecciones de clases y eliminan la ambigüedad al mo-
mento de hacer referencias a ellas. Un mismo espacio de nombres puede hacer referencia
a diferentes archivos DLL que contengan clases de funcionalidad similar.
Los espacios de nombres parten de dos grandes grupos: System y Microsoft. A partir de
ahí se generan subgrupos especiales, de acuerdo con la funcionalidad.
Capítulo 5. Espacios de nombres y desarrollo de librerías 143

Nomenclatura de los espacios de nombres


La nomenclatura de los espacios de nombres se basa en la notación Pascal casing, con di-
visión basada en puntos para representar la jerarquía.
En el caso de System.Console.WriteLine que ya hemos utilizado, System es el espacio
de nombres, Console es la clase y WriteLine es el método de la clase. Generalmente, el
último elemento del nombre es un type (método, propiedad, campo, etcétera), el penúltimo
es una clase de BCL, y todo lo que anteceda es la jerarquía de espacios de nombres para
llegar a la clase.
Es importante mencionar que el desarrollador puede crear sus propias jerarquías de espa-
cios de nombres, que también se regirán por las mismas reglas de nomenclatura.
Algunos de los espacios de nombres más utilizados de la librería de clases de .NET Fra-
mework son los siguientes:

NOTA
Por su extensión, no se listan todos los espacios de nombres disponibles en .NET Framework,
sino sólo los que a criterio del autor son los más usuales.

Microsoft
El espacio de nombre Microsoft y todas sus dependencias ayudan a integrar las tecnolo-
gías Microsoft a los desarrollos. Además integra los elementos principales de los nuevos
lenguajes de Microsoft. 5

Espacio de nombre (Namespace) Utilidad

Microsoft.SqlServer.Server Contiene clases que permiten integrar CLR en


Microsoft SQL Server y su motor de ejecución.
Microsoft.Csharp Contiene clases que dan soporte a la compilación y
generación de código usando C#.
Microsoft.Jscript Contiene clases que apoyan a la compilación y
generación de código usando Jscript.
Microsoft.VisualBasic Contiene clases que apoyan a la compilación y
generación de código usando Visual Basic.
Microsoft.VisualBasic.FileIO Contiene tipos que dan soporte al manejo del
sistema de archivos usando Visual Basic.
Microsoft.Win32 Provee dos tipos de clases: aquellas que manejan
eventos iniciados por el sistema operativo y las
que manipulan el registro del sistema (Windows
Registry).
144 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

System

El espacio de nombre System y todas sus dependencias contienen las clases fundamenta-
les de la plataforma .NET. En esta jerarquía se encuentran las clases base para definir va-
lores, referencias, tipos de datos, eventos y manejadores de eventos; además contienen los
elementos para la declaración de interfaces, atributos, excepciones de procesos, etcétera.
También se incluyen en ella todas las clases que hacen de los lenguajes de .NET herra-
mientas de propósito general, dado que se encuentran clases de graficación, acceso a da-
tos, telecomunicaciones, criptografía, matemáticas, etcétera.

Nombre del espacio de nombre


(Namespace) Utilidad
System.Collections Contiene interfaces y clases que definen varias
colecciones de objetos, como lists, queues, arreglos de
bits, hashtables y diccionarios.
System.Collections.Generic Contiene interfases y clases que definen colecciones
genéricas, que permiten a los usuarios crear
colecciones strong type que proveen mejor tipo de
seguridad y desempeño.
System.Configuration Contiene los tipos que proveen el modelo de
programación para manejo de datos de
configuración.
System.Data Contiene clases que constituyen la mayor parte de la
arquitectura de ADO.NET. La arquitectura de
ADO.NET permite el acceso y manipulación eficiente
de bases de datos de diversas tecnologías (SQL Server,
Acces, Oracle, ODBC, OLEDB, etcétera).
System.Data.Common Contiene clases compartidas por los proveedores de
datos de .NET Framework. Un proveedor de datos de
.NET Framework, describe una colección de clases
usadas para acceder orígenes de datos, como bases de
datos, en el espacio administrado.
System.Data.Design Contiene clases que pueden ser usadas para generar
typed-datasets personalizados.
System.Data.Odbc Contiene clases que el proveedor de datos para ODBC
de .NET Framework encapsula.
System.Data.OleDb Contiene clases que el proveedor de datos para OLE
DB de .NET Framework encapsula.
System.Data.OracleClient Contiene clases que el proveedor de datos para Oracle
de .NET Framework encapsula.
System.Data.Sql Contiene clases que apoyan funcionalidad específica
de SQL Server. Complementa a System.Data.SqlClient,
sobre todo en el manejo integrado de SQL Server
2005 y CLR.
Capítulo 5. Espacios de nombres y desarrollo de librerías 145

System.Data.SqlClient Contiene clases que el proveedor de datos


para SQL Server de .NET Framework
encapsula.
System.Data.SqlServerCE Describe una colección de clases que
pueden ser usadas para acceder a una base
de datos en SQL Server CE para dispositivos
Windows CE-based en el espacio
administrado.
System.Data.SqlTypes Contiene clases para tipos de datos nativos
en SQL Server. Estas clases proveen una
alternativa más rápida que otros tipos de
datos. Ayuda a prevenir errores de
conversión que puedan derivar en pérdida
de precisión.
System.Diagnostics Provee de clases que permiten interactuar
con los procesos del sistema, logs de
eventos, desempeño de contadores.
También provee clases que permiten buscar
errores en la aplicación y rastrear la
ejecución de código.
System.DirectoryServices Provee acceso sencillo al Active Directory.
System.DirectoryServices.ActiveDirectory Provee un modelo abstracto de alto nivel
para la manipulación de las tareas de
servicio del directorio de Microsoft® Active
Directory®.
System.Drawing Provee acceso a la funcionalidad de
gráficos básicos GDI+.
System.Drawing.Design Contiene clases que extienden la interfaz
de usuario en tiempo de diseño. 5
System.Drawing.Drawing2D Provee funcionalidad gráfica avanzada
(bidimensional y vectores). Incluye paletas
de gradientes, la clase Matrix (usadas para
definir transformaciones geográficas) y la
clase GraphicsPath.
System.Drawing.Printing Provee de servicios de impresión de
gráficos.
System.Drawing.Text Provee funcionalidad de tipografía GDI+
avanzada. Permite a los usuarios crear una
colección de fuentes.
System.Globalization Contiene clases que definen información
relacionada con la cultura, incluyendo
lenguajes, el país/región, el calendario en
uso, el formato de fechas, moneda,
números y el orden de cadenas.
Indispensable su uso si se desarrollan
aplicaciones de alcance internacional.
146 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

System.IO Contiene tipos que permiten lectura


sincrónica y asincrónica de flujos de datos
y archivos.
System.IO.Compression Contiene clases que proveen compresión y
descompresión básica de flujos de datos.
System.IO.Ports Contiene clases para el control y uso de
puertos.
System.Messaging Provee clases que permiten la conexión,
monitoreo y administración de mensajes de
colas en la red para enviar y recibir mensajes.
System.Net Proveen una interfaz de programación para
los principales protocolos usados en redes
actuales.
System.Net.Configuration Contiene clases para la configuración
programática de System.Net.
System.Net.Mail Contiene clases usadas para enviar correos
electrónicos a un servidor SMTP (Simple
Mail Transfer Protocol).
System.Net.Mime Permite representar encabezados MIME
(Multipurpose Internet Mail Exchange).
System.Net.NetworkInformation Provee acceso a datos de tráfico de datos,
información de direcciones de red y
notificaciones de cambios de direcciones
de la computadora local. También contiene
clases para implementar Ping.
System.Net.Sockets Provee una implementación de interfaces
Windos Sockets(Winsock), para ayudar a los
desarrolladores que necesitan control de
acceso a la red.
System.Runtime.Remoting Provee de clases e interfaces que permiten
a desarrolladores crear y configurar
aplicaciones distribuidas.
System.Security Provee de una estructura subyacente del
sistema de seguridad de .NET Framework,
incluyendo clases base para permisos.
System.Security.Cryptography Provee servicios criptográficos. Incluye
codificación y descodificación segura de
datos, así como muchas otras operaciones,
como hashing, generación de números
aleatorios, y autentificación de mensajes.
System.Security.Cryptography.X509Certificates Contiene lenguaje de implementación del
certificado Authenticode X.509 v.3.
System.Security.Cryptography.Xml Contiene clases que apoyan la creación y
validación de firmas digitales XML.
Capítulo 5. Espacios de nombres y desarrollo de librerías 147

System.Text Contiene clases para la representación y


conversión de sistemas textuales, como
ASCII, Unicode, UTF-7 y UTF-8.
System.Text.RegularExpressions Contiene clases que proveen acceso al motor de
expresiones regulares de .NET Framework.
System.Threading Provee clases e interfaces que habilitan
programación multitarea.
System.Timers Provee de un componente temporizador, que
permite disparar un evento en intervalo
específico.
System.Transactions Contiene clases que permiten al código participar
en transacciones.
System.Web Provee clases e interfaces que habilitan el modelo
de petición respuesta para ambientes Web,
basados en el protocolo HTTP, además del manejo
de cookies.
System.Web.Configuration Contiene clases que son usadas para configurar
ASP.NET.
System.Web.Mobile Contiene las capacidades principales, incluyendo
autentificación y manejo de errores, requerido
para construir aplicaciones móviles ASP.NET.
System.Web.SessionState Provee clases e interfaces que habilitan el
almacenamiento de datos desde un cliente
específico en una aplicación Web en el servidor.
System.Web.UI Provee clases e interfaces que permiten crear
interfaces de usuario en ambiente Web.
System.Web.UI.WebControls Contiene clases que permiten crear elementos
gráficos de interfaz de usuario en una aplicación 5
Web.
System.Windows.Forms Contiene clases para crear aplicaciones basadas
en Windows para aprovechar las características de
la interfaz gráfica disponibles en el sistema
operativo de Microsoft Windows.
System.Xml Provee soporte de procesamiento XML.
System.Xml.Serialization Contiene clases que son usadas para serializar
documentos en formato XML.
148 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

No son todos los espacios de nombres; la mayoría tiene niveles jerárquicos de mayor pro-
fundidad que sería imposible tratar en este texto. Utilice la tabla como punto de partida pa-
ra buscar más información.
En la ayuda de Visual Studio puede buscar .NET Framework Class Library, y de ahí selec-
cionar un tema que le interese.

Uso de espacios de nombres


Las aplicaciones desarrolladas en .NET pueden disponer de todas las clases y objetos del
.NET Framework, es decir, todos los recursos de .NET Framework; lo único que hay que
Tiempos de hacer es referirlos adecuadamente.
compilación
de CLR
Si se desea hacer uso de cualquier clase de BCL es necesario proporcionar el nombre pre-
ciso de ésta. Una forma en que se pueden referir los recursos de BCL es a través de lo que
se conoce como nombres calificados (fully qualified name), que son la especificación tex-
tual de la jerarquía de espacios de nombres que permite ubicar una clase o type (Namespa-
ce.Clase.Type).

Es posible utilizar todas las clases disponibles de .NET Framework a través de sus nom-
bres calificados, pero eso no es del todo práctico pues en ocasiones éstos pueden ser bas-
tante largos (System.Runtime.Remoting.Channels.Http, por ejemplo).
Una forma de obviar la escritura del nombre calificado completo es importando los espa-
cios de nombres. Para ello se utiliza la instrucción Imports.
Basta con que coloque lo siguiente al principio de su programa:

Imports EspacioNombre

Donde EspacioNombre es la parte del nombre calificado que desea obviar al momento de
programar. En Visual Basic se puede incluir hasta el nombre de la clase de BCL, con lo
que el código puede llegar a simplificarse bastante.
Puede darse el caso de que en dos o más ensamblados se repita el nombre de clases, refe-
rencias o métodos; en ese caso, la ambigüedad debe eliminarse a través de nombres califi-
cados, los cuales permiten definir el origen de los recursos referidos.
Capítulo 5. Espacios de nombres y desarrollo de librerías 149

Los siguientes dos programas funcionarían de la misma forma:


Sin uso de instrucción Imports:
Module Module1

Sub Main()
System.Console.Write(“Presione INTRO”)
system.Console.ReadLine()
System.Console.WriteLine(“Hola mundo.”)
End Sub

End Module

Con uso de instrucción Imports:


Imports System.Console

Module Module1

Sub Main()
Write(“Presione INTRO”)
ReadLine()
WriteLine(“Hola mundo.”)
End Sub

End Module

Contaminación de espacios de nombres y colisiones de nombre. Como puede


apreciar, los espacios de nombres permiten obviar la jerarquía de clases que permite tener
acceso a una clase o a un método (type).
Puede darse el caso, principalmente cuando un equipo de desarrollo trabaja sobre un mis-
mo proyecto, de que dos o más programadores denominen a un método de la misma for-
5
ma; cuando se da esa repetición de nombres de métodos en diferentes jerarquías, se dice
que estamos ante contaminación de espacios de nombres (namespace pollution). Si, exis-
tiendo contaminación de nombres, en un mismo programa se tratan de utilizar métodos ho-
mónimos, CLR es incapaz de diferenciarlos, por lo que se presenta el fenómeno de colisión
de nombres (name collisions).
Las colisiones de nombres se resuelven utilizando nombres calificados, mientras que la
contaminación de espacios de nombres se evita mediante una planeación minuciosa del
proyecto de desarrollo, además de utilizar métodos estructurados de desarrollo.

Creación de namespaces propios


.NET Framework proporciona una cantidad enorme de clases, accesibles a través de sus
muchos espacios de nombres. Pero eso no es suficiente, pues todo lenguaje que presuma de
ser extensible debe permitir a los desarrolladores agregar funcionalidad específica que no
está presente de manera genérica.
150 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Es posible agregar espacios de nombres adicionales a los contenidos de origen en .NET


Framework; los pasos para hacerlo son los siguientes:
1. Desarrollar el código de una librería (programa de extensión de Microsoft Visual Ba-
sic), delimitando el contenido de la librería a través del estatuto Namespace.
2. Compilar el código de la librería como tipo library, con lo cual no se generaría un ar-
chivo ejecutable (EXE), sino una librería de vínculos dinámicos (DLL).
3. Para hacer uso de la funcionalidad de una librería, es necesario hacer referencia a ella;
eso se puede hacer desde Visual Studio (si se trata de una aplicación Windows o Web,
a través de la opción de menú Project – Add Reference...), o en tiempo de compilación
si se trata de una aplicación de consola y no se utiliza Visual Studio.
4. Es opcional utilizar nombres calificados una vez que se establece la referencia. La sin-
taxis para crear un espacio de nombres es la siguiente:
Namespace EspacioNombre
‘ Codigo de elementos
End Namespace

Donde EspacioNombre es el nombre a través del cual se referirán los elementos conteni-
dos en espacio de nombres que se genera.
Una cosa importante a tomar en cuenta es que para crear una jerarquía dentro de un espa-
cio de nombres es posible anidarlos, por lo cual una declaración Namespace puede estar
definida dentro de otra, creando el efecto EspacioNombre1.EspacioNombre2.Type.

Alias para los espacios de nombres


Codificar utilizando nombres calificados puede ser muy complicado debido a que, en ocasio-
nes, los espacios de nombres no son muy cortos (de ahí que recurriéramos a importarlos).
Esto plantea un nuevo problema: nos quedamos sin información con relación a qué espa-
cio de nombres contiene qué elementos.
Un escenario ideal sería que los espacios de nombres no tuvieran el nombre muy largo, a
fin de poder integrarlos al código sin necesidad de mucho esfuerzo; con ello obtendríamos
información con relación al espacio de nombres de origen y, al mismo tiempo, comodidad
al codificar. En pocas palabras, queremos espacios de nombres con nombres no muy lar-
gos, pero tampoco de nombre inexistente.
Capítulo 5. Espacios de nombres y desarrollo de librerías 151

Esto es posible si asignamos un alias al espacio de nombres. Un alias de importación es la


equivalencia en nombre que le damos a un espacio de nombres al momento de importarlo.
Vea la sintaxis para establecer un alias de espacio de nombres:
Imports Alias = EspacioNombres
Donde EspacioNombres será el nombre del espacio de nombres que será referido a través
de Alias.

Independencia de los ensamblados


Una referencia del ejecutable hacia el archivo DLL se realiza en el momento en que se ge-
nera el ejecutable, y la referencia es directa entre el ejecutable y la librería.
El DLL se encuentra en el mismo directorio que la aplicación; otros ensamblados podrán
hacer referencia al DLL, incluso con el mismo nombre y no importa: el metadatos sabrá re-
conocer qué librería le corresponde al ejecutable.
Esta sencilla modificación que aporta .NET tiene implicaciones trascendentales. Anterior-
mente, se generaba un componente o una librería y ésta debía ser registrada en el Registro
de Windows antes de poder ser utilizada (por lo general se almacenaba en un recipiente co-
mún \Windows\System o \WINNT\System, según el sistema).
Cuando una librería se actualizaba, los programas que la utilizaban podrían ya no ser com-
patibles, dando lugar al infierno de los DLL. Ahora, cada ejecutable puede disponer de su
propia versión de la librería, y .NET no dejará que se pierdan las referencias entre librerías 5
y ejecutables.
En .NET, las librerías desarrolladas por el usuario tienen total independencia del Registro
de Windows. Para distribuir una aplicación, basta copiar el ejecutable y las librerías que
utiliza.
Sobra decir que no necesitará copiar las librerías que forman parte de .NET Framework, ya
que para que un ejecutable .NET (ensamblado) funcione en un equipo, éste debe tener el
CLR y el .NET Framework instalado, por lo que dichas librerías se tienen por disponibles.

Referencias
Una referencia puede definirse como la especificación de enlazado entre un programa y
una librería, en donde la librería pone su funcionalidad a disposición del programa hasta
donde la accesibilidad lo permite.
152 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las referencias pueden establecerse fácilmente desde Visual Studio. Lo primero que hay
que saber es que cada proyecto tiene sus propias referencias. Al crear un proyecto desde
Visual Studio, la herramienta establece las referencias más usuales para el tipo de aplica-
ción. En el Solution Explorer pueden observarse claramente, ya que bajo el nodo de un pro-
yecto siempre hay un nodo References.
Si se requiere hacer una nueva referencia, es necesario colocarse sobre el nodo References
del proyecto al que se desea agregar la referencia, y seleccionar Add Reference desde el
menú contextual.
Con esto aparecerá la ventana Add Reference.

La ventana muestra varias fichas. En la ficha .NET podrán seleccionarse las librerías de
.NET Framework o aquellas que se registren en GAC utilizando nombres fuertes (strong
names). En la ficha COM se pueden seleccionar aquellas librerías COM que se desee uti-
lizar, dado que la plataforma .NET les da soporte. En la ficha Projects es posible seleccio-
nar los proyectos .NET que sean de tipo Library (DLL), de los cuales se pueden consumir
clases expuestas. En la ficha Browse pueden examinarse los archivos que se encuentran en
el equipo, con el fin de seleccionar algún DLL. La ficha Recent permite invocar las libre-
rías de reciente uso o creación, a fin de encontrarlas sin buscar en todos lados.
Capítulo 5. Espacios de nombres y desarrollo de librerías 153

En cualquiera de las fichas es posible seleccionar los componentes seleccionando la librería


a referir y haciendo clic en el botón Ok, a fin de que las referencias queden establecidas.

Ejercicio 5.1
Creación y consumo de una librería (DLL) basada en un espacio
de nombres

En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Vi-
sual Basic, y la manera en que podemos aprovechar su manejo para preservar valores en
memoria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).

➤ Creación de una librería DLL

2. Agregue a su solución un proyecto Windows – Class library, llamado MisUtilerias. Es


muy importante que el proyecto sea una librería de clases, para que al compilar el pro-
yecto se genere un ensamblado de extensión DLL.
3. Edite el programa de tal forma que aparezca como sigue:

Codificación de MisUtilerias - Continuar.vb 5


1 Imports System.Console
2
3 Namespace Funciones
4
5 Public Class Continuar
6
7 Public Shared Sub EsperaINTRO()
8 WriteLine()
9 WriteLine(“Pulse INTRO para continuar”)
10 ReadLine()
11 End Sub
12
13 End Class
14
15 End Namespace

4. Esta librería generará el archivo MisUtilerias.DLL. Posee un espacio de nombres de-


nominado Funciones, que a su vez contiene una clase llamada Continuar que tiene defi-
154 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

nido un método llamado EsperarINTRO. El método se encarga de mostrar un mensaje y


esperar a que se pulse INTRO para continuar. Como lo recordará, hemos estado utilizan-
do código similar en los últimos ejercicios, por lo que en éste constituye una manera de
automatizar esa labor tan común.
5. Es muy importante notar que la clase es pública (Public) dado que le daremos un uso
de librería, y deseamos que sea utilizable por cualquier proyecto (incluso aquellos que
no pertenecen a la solución). También es importante ver que el método es público y
compartido (Shared), lo que indica que está disponible para uso externo a la clase.
6. Construya el nuevo proyecto que creó y guarde todos los archivos de la solución (opri-
ma las teclas Ctrl-Mayús-S).
7. Compruebe que al generar el proyecto se haya creado una librería DLL en su equipo.
Busque en la siguiente ruta:

C:\APVBNETVS\Ejercicios\MisUtilerias\bin\Debug

➤ Revisión de todos los elementos asociados a un proyecto,


por medio de Solution Explorer

8. Agregue a su solución un proyecto Windows – Console Application, llamado Consu-


meUtilerias.

9. Seleccione en Solution Explorer el proyecto ConsumeUtilerias. Haga clic en el bo-


tón Show All Files de la barra de herramientas de Solution Explorer. Con ello apare-
cerán elementos que hasta el momento no había visto. Vea el árbol jerárquico de recur-
sos asociados a su proyecto. El que nos interesa más en estos momentos es el nodo
References; haga clic en dicho nodo con el fin de ver qué contiene.
Capítulo 5. Espacios de nombres y desarrollo de librerías 155

10. Al seleccionar un Template al momento de crear un proyecto en Visual Studio, la he-


rramienta sabe qué espacios de nombres son los más comunes para el tipo de proyec-
to, y procede a establecer referencias con las librerías correspondientes. Eso nos libe-
ra del trabajo de establecer referencias que son obvias, dado un tipo de archivo. Como
podemos comprobar, nuestra librería MisUtilerias no se encuentra dentro de las refe-
rencias, por lo que no podríamos utilizar su funcionalidad en nuestro programa.

➤ Establecimiento de una referencia a una librería


desde Solution Explorer

11. Seleccione su proyecto ConsumeUtilerias en Solution Explorer. Despliegue el menú


contextual y seleccione Add Reference. Vaya a la ficha Projects y seleccione el pro-
yecto MisUtilerias. Haga clic en Ok.

12. Vea cómo al agregar la referencia, Solution Explorer actualiza el árbol de elementos
del proyecto, incluyendo nuestra librería.
156 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Consumo de una librería programáticamente

13. Ahora codifique el programa que consume la librería.

Codificación de ConsumeLibrería – Module1.vb

1 Imports System.Console
2 Imports MisUtilerias.Funciones
3
4 Module Module1
5
6 Sub Main()
7 WriteLine(“Mensaje desde el programa”)
8 Continuar.EsperaINTRO()
9 End Sub
10
11 End Module

14. Vea cómo al editar las líneas de importación de espacios de nombres, ya teníamos dis-
ponible nuestro espacio de nombres en Intellisense.
Capítulo 5. Espacios de nombres y desarrollo de librerías 157

15. Se importa el nombre de la librería y el espacio de nombres (línea 2). Ya en el código,


sólo es necesario invocar el nombre de la clase y el type (línea 8). Podríamos haber sim-
plificado aún más, incluyendo la clase en el Imports.

Ejecución guiada de ConsumeLibrería – Module1.vb

16. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto
como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realiza-
do en la solución (oprima Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (oprima F5).
17. Si todo salió bien, el programa debe producir el siguiente resultado:
5
Mensaje desde el programa

Pulse INTRO para continuar

18. Con este pequeño ejemplo ya comprobó cómo se generan bibliotecas de clases en .NET
y cómo se consumen desde otros proyectos.
FIN DEL EJERCICIO *

Ejercicio 5.2
Utilización del depurador (Debug) de Visual Studio y la ejecución línea
a línea basada en puntos de interrupción (breakpoints)

Se agregarán puntos de interrupción a una aplicación, y se revisarán las opciones de ejecu-


ción línea a línea usando Visual Studio.
158 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

1. Usando Visual Studio, abra la solución Ejercicios.


2. En el Solution Explorer encuentre el nodo correspondiente a ConsumeLibreria –
Module1.vb. Haga doble clic en dicho nodo para editar el código. Establezca el proyec-
to como proyecto de inicio (StartUp Project).

➤ Establecimiento de un punto de interrupción (breakpoint)

3. Seleccione la línea Sub Main() y establezca un punto de interrupción con la opción


Debug – Toggle Breakpoint (F9), o bien, haciendo clic en el borde externo izquierdo de
Text Editor, junto a la línea en la que desea agregar un punto de interrupción. Aparece-
rá una marca en el borde externo izquierdo de Text Editor, indicando que la línea tiene
un punto de interrupción.

4. Genere nuevamente la solución y ejecútela.

➤ Ejecución línea por línea (code stepping)

5. Al momento de llegar a la línea 6 el programa se detendrá.

6. Al lanzar a ejecución una aplicación (oprimiendo la tecla F5), se entra en modo de-
bug, que es un estado de ejecución en donde Visual Studio provee todas las herramien-
tas para la depuración de aplicaciones en tiempo de ejecución.
7. Seleccione repetidamente Debug – Step Over (F10), hasta terminar la ejecución del
programa. La ejecución continuará en modo línea a línea. Al encontrar un llamado a un
recurso externo al programa (clases, librerías, funciones, etcétera), las tomará como una
sola línea; es decir, no profundizará en lo que pasa dentro del recurso externo al progra-
ma. Las líneas que se vayan ejecutando aparecerán resaltadas en amarillo.
Capítulo 5. Espacios de nombres y desarrollo de librerías 159

8. Ejecute nuevamente la aplicación (oprima F5). Seleccione repetidamente Debug –


Step Into (F11), hasta terminar la ejecución del programa. La ejecución continuará en
modo línea a línea. Al encontrar un llamado a un recurso externo al programa (clases,
librerías, funciones, etcétera), realizará también una inspección línea a línea de dichos
recursos. Las líneas que se vayan ejecutando aparecerán resaltadas en amarillo.
9. Ejecute nuevamente la aplicación (oprima F5). Seleccione repetidamente Debug –
Step Into (F11), hasta llegar a las líneas de código de la librería de MisUtilerias. Selec-
cione Debug – Step Out (Mayús-F11) para terminar de ver el contenido de la librería y
continuar con la ejecución en el programa que mandó llamar la librería.
10. En cualquier momento, cuando se está en tiempo de depuración, se puede
continuar la ejecución normalmente (Continue), detener momentáneamente la ejecu-
ción (Break All) o terminar la depuración (Stop Debugging).

➤ Modificación de programas en tiempo de ejecución


(Edit and Continue)
5
> Lo nuevo
Anteriormente, una vez que se iniciaba la depuración de un programa (oprimiendo F5), no
había forma de modificar el programa en el momento. Si detectábamos un error de orto-
grafía en un mensaje del sistema, por ejemplo, y nos percatábamos del error al estar eje-
cutando el programa línea por línea, no era posible hacer la modificación en el momento.
Si queríamos corregir el error de inmediato era necesario suspender la ejecución, hacer las
modificaciones, volver a construir la aplicación y volver a ejecutarla. En Visual Studio 2005,
en cambio, es posible modificar un programa en tiempo de depuración, viendo los cam-
bios de manera inmediata.

11. Ejecute nuevamente la aplicación (F5). Al llegar al punto de interrupción, continúe la


ejecución con Step Over (F10). Al llegar a la línea 7, que despliega Mensaje desde
el programa, cambie en ese momento el mensaje por Mensaje editado en tiempo de
depuración. Siga ejecutando con Step Over. Compruebe en la consola que se ha escrito
el nuevo mensaje, lo que indica que tomó como buenos nuestros cambios realizados en
160 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

tiempo de depuración. A esta capacidad de Visual Studio se le denomina Edit and Con-
tinue, y sólo está disponible si el archivo está en vista de código fuente (source view).

➤ Puntos de interrupción condicionales

12. En ocasiones queremos que un punto de interrupción detenga la depuración sólo en ca-
so de que sea necesario. La necesidad de interrupción debe estar expresada en térmi-
nos de una condición lógica. A los puntos de interrupción que detienen la depuración
sólo con base en una condición se les llama puntos de interrupción condicionales.
13. En el Solution Explorer encuentre el nodo correspondiente a AreaRectángulo –
Module1.vb. Haga doble clic en dicho nodo para editar el código. Establezca el pro-
yecto como proyecto de inicio (StartUp Project).
14. Coloque un punto de interrupción en la línea Base=CInt(Entrada).
15. Coloque el puntero del ratón sobre el punto de interrupción, despliegue el menú con-
textual y seleccione Condition....

16. Aparecerá la ventana Breakpoint Condition, en donde se podrá especificar la condi-


ción que provocará que el punto de interrupción detenga la depuración. Especifique
que si el dato proporcionado es menor o igual a cero se detenga la depuración
(CInt(Entrada)<=0).
Capítulo 5. Espacios de nombres y desarrollo de librerías 161

17. Inicie la depuración de la solución (oprima F5). Cuando el programa le pregunte la ba-
se, proporcione el número 10. Proporcione una altura de 15 y vea cómo el programa
no detiene la depuración en ningún momento.
18. Inicie nuevamente la depuración de la solución (oprima F5). Cuando el programa
le pregunte la base, proporcione el número 0. Al cumplirse la condición, el programa se
detiene.

➤ Habilitación e inhabilitación de puntos de interrupción

19. En ocasiones se desea iniciar la depuración de un programa sin tener que lidiar con los
puntos de interrupción. Una alternativa definitiva es eliminar los puntos de interrupción;
si no se desea que los puntos de interrupción se pierdan pero que tampoco detengan la
5
depuración en un momento dado, la opción más recomendable es inhabilitarlos.
20. Seleccione la opción Debug – Disable All Breakpoints. Inicie la depuración y proporcio-
ne como valor base el 0. En teoría debería detenerse la depuración, dado que la condición
del punto de interrupción se cumple; sin embargo, la depuración no se detiene.
21. Seleccione la opción Debug – Enable All Breakpoints. Inicie la depuración y proporcione
como valor base el 0. Vea cómo el punto de interrupción ha vuelto a su comportamiento
normal.

➤ Eliminación de los puntos de interrupción (breakpoints)


22. Para eliminar un punto de interrupción, basta hacer clic en el punto rojo que se agregó
en el lado izquierdo de Text Editor.
23. Si deseamos eliminar todos los puntos de interrupción agregados, hay que ir al menú
Debug – Delete All Breakpoints (Crtl-Mayús-F9). Aparecerá una ventana de confir-
162 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mación que debe responder afirmativamente en caso de que desee eliminar los puntos
de interrupción.
24. Elimine todos los puntos de interrupción que tiene su programa.
25. Guarde todos los cambios en la solución.
FIN DEL EJERCICIO*

Ejercicio 5.3
Utilización de Command Window

En este ejercicio se comprobará el uso de Command Window para la ejecución de coman-


dos de Visual Studio en forma textual.
1. Usando Visual Studio, abra la solución Ejercicios.
2. En el Solution Explorer encuentre el nodo correspondiente a Alcance – Module1.vb.
Haga doble clic en dicho nodo para editar el código.
3. Establezca el proyecto como proyecto de inicio (StartUp Project).

➤ Escritura de comandos de Visual Studio usando


Command Window

4. Casi todas las actividades que es posible realizar en Visual Studio a través de opciones de
menú o la barra de herramientas tienen un equivalente textual que es posible aplicar des-
de la línea de comandos de Visual Studio (Command Window). Los usuarios de FoxPro
estarán habituados a dicha ventana, dado que muchas operaciones pueden ser especifi-
cadas más rápidamente de forma textual, sobre todo cuando se es rápido escribiendo y cam-
biar del teclado al ratón implica más esfuerzo.
5. Para mostrar Command Window se puede utilizar la opción View – Other Widows –
Command Window (teclas Ctrl-Alt-A). En tiempo de depuración, Command Window
aparece automáticamente.
Capítulo 5. Espacios de nombres y desarrollo de librerías 163

6. Esta ventana es la línea de comandos de Visual Studio. Al escribir un comando y pre-


sionar Intro, éste se ingresa a Visual Studio y se ejecuta. Los comandos son muy pare-
cidos a las opciones que tendríamos que seleccionar en el menú; por ejemplo, la opción
File – Close tiene su comando equivalente, que es File.Close. Para simplificar aún
más, algunos comandos poseen alias de comando (command alias), que permiten redu-
cir la escritura de comandos. Por ejemplo, Close es el alias de File.Close. En otras pa-
labras, escribir Close en Command Window es lo mismo que seleccionar en el menú
File – Close. El proceso se simplifica aún más dado que Command Window tiene Inte-
llisense, y además nos permite definir nuestros propios comandos. Si es rápido con los
dedos, presionar Ctrl-Alt-A, Close es equivalente a seleccionar la opción File – Close.
La más importante contribución de Command Window es permitir la ejecución de co-
mandos que no aparecen en ninguna opción de menú en Visual Studio.
7. Éstos son algunos de los comandos más usuales que cuentan con un alias predetermina-
do en Visual Studio.

Command Name Alias Complete Name


Add New Project AddProj File.AddNewProject
Alias Alias Tools.Alias
Autos window Autos Debug.Autos
Breakpoints window bl Debug.Breakpoints
Call Stack window CallStack Debug.CallStack
Clear All cls Edit.ClearAll
Clear Bookmarks ClearBook Edit.ClearBookmarks
Close Close File.Close
Close All Documents CloseAll Window.CloseAllDocuments
Command mode cmd View.CommandWindow 5
Command Window Mark Mode mark Tools.CommandWindowMarkMode
Cut Line LineCut Edit.LineCut
Delete Line LineDel Edit.LineDelete
Disassembly window disasm Debug.Disassembly
Evaluate Statement eval Debug.EvaluateStatement
Exit Exit File.Exit
F1Help Help Help.F1Help
Format Selection format Edit.FormatSelection
Full Screen FullScreen View.FullScreen
Go To GotoLn Edit.GoTo
Go to Brace GotoBrace Edit.GotoBrace
Immediate Mode immed Tools.ImmediateMode
Insert File as Text InsertFile Edit.InsertFileAsText
List Call Stack kb Debug.ListCallStack
List Disassembly u Debug.ListDisassembly
List Members ListMembers Edit.ListMembers
List Memory Float format df Debug.ListMemory/Format:Float
List Threads ~ Debug.ListThreads
Locals window Locals Debug.Locals
164 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Make Lower Case Lcase Edit.MakeLowercase


Make Uppercase Ucase Edit.MakeUppercase
Memory window Memory Memory1 Debug.Memory1
Memory Window 2 Memory2 Debug.Memory2
Memory Window 3 Memory3 Debug.Memory3
Memory Window 4 Memory4 Debug.Memory4
New File nf File.NewFile
New Project np NewProj File.NewProject
Next Bookmark NextBook Edit.NextBookmark
Open File of Open File.OpenFile
Open Project op File.OpenProject
Parameter Information ParamInfo Edit.ParameterInfo
Previous Bookmark PrevBook Edit.PreviousBookmark
Print ? Debug.Print
Print File print File.Print
Properties Window props View.PropertiesWindow
Quick Watch ?? Debug.Quickwatch
Redo redo Edit.Redo
Registers window registers Debug.Registers
Run to Cursor rtc Debug.RunToCursor
Save All SaveAll File.SaveAll
Save As SaveAs File.SaveSelectedItemsAs
Save Selected Items save File.SaveSelectedItems
Script Only View ScriptOnly View.ShowScriptOnly
Shell shell Tools.Shell
ShowWebBrowser nav navigate View.ShowWebBrowser
Start g Debug.Start
Step Into t Debug.StepInto
Step Out pr Debug.StepOut
Step Over p Debug.StepOver
Stop q Debug.StopDebugging
Stop Find In Files StopFind Edit.FindInFiles /stop
Swap Anchor SwapAnchor Edit.SwapAnchor
Tabify Selection tabify Edit.TabifySelection
Tasklist window TaskList View.TaskList
Threads window Threads Debug.Threads
Tile Horizontally TileH Window.TileHorizontally
Tile Vertically TileV Window.TileVertically
Toggle Bookmark ToggleBook Edit.ToggleBookmark
Toggle Breakpoint bp Debug.ToggleBreakPoint
Toggle Word Wrap WordWrap Edit.ToggleWordWrap
Toolbox window toolbox View.Toolbox
Undo undo Edit.Undo
Untabify Selection Untabify Edit.UntabifySelection
View Code code View.ViewCode
View Designer designer View.ViewDesigner
Watch window Watch Debug.WatchN
Capítulo 5. Espacios de nombres y desarrollo de librerías 165

8. La mayoría de los comandos puede inferirse fácilmente. Sólo piense cómo están loca-
lizables en los menús. Por ejemplo, para iniciar la depuración de una solución la op-
ción de menú es Debug – Start Debugging; el comando es Debug.Start, lo cual es
bastante obvio. Aproveche Intellisense en Command Window para descubrir los co-
mandos que le interesan.
9. En Command Window escriba los siguientes comandos:
>GotoLn 7
>Debug.ToggleBreakpoint
>Debug.Start
>Debug.StepOver
>Debug.StepOver
>Debug.StepOver
>Debug.StopDebugging
>Debug.DeleteAllBreakpoints

10. Lo que hicimos fue ir a la línea 7 del código, establecer un punto de interrupción, ini-
ciar la depuración, ejecutar tres líneas, línea por línea, y detener la depuración. En el ca-
so de comandos que se repiten, podemos ahorrarnos la escritura consultando la historia
de comandos de Command Window (oprimiendo la tecla de dirección hacia arriba).
FIN DEL EJERCICIO*

Ejercicio 5.4
Uso de herramientas avanzadas para la depuración
5
Se agregarán puntos de interrupción a una aplicación y se revisarán las opciones de ejecu-
ción línea a línea, usando Visual Studio.
1. Usando Visual Studio, abra la solución Ejercicios.
2. En el Solution Explorer encuentre el nodo correspondiente a Alcance – Module1.vb.
Haga doble clic en dicho nodo para editar el código. Establezca el proyecto como pro-
yecto de inicio (StartUp Project).
➤ Apilado de herramientas en Visual Studio
3. Seleccione la línea Module Module1 y establezca un punto de interrupción.
4. Inicie la depuración de la solución (tecla F5).
5. En tiempo de depuración aparecen dos herramientas principales: Auto y Command Win-
dow. En realidad son muchas más herramientas, sólo que no están visibles por el momen-
to. Como podrá comprobar, en tiempo de depuración Command Window comparte su es-
pacio con otras herramientas: Call Stack, Breakpoints, Immediate Window y Output.
166 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Por otro lado, Autos comparte su espacio con otras herramientas: Locals y Watch 1.

7. Cuando hay varias herramientas apiladas en un mismo espacio en Visual Studio, cada
una constituye una ficha de selección horizontal (Tabs). La forma de seleccionar algu-
na de las herramientas es haciendo clic sobre la ficha. En caso de que las herramientas
estén en modo de ocultación automática, lo que usted verá serán las pestañas de selec-
ción vertical de las fichas; cumplen con la misma funcionalidad que las horizontales,
sólo que se distribuirán en los extremos laterales de Visual Studio.

➤ Ventanas de variables (variable windows)

8. Visual Studio proporciona una serie de herramientas que permiten ver los cambios que
las variables experimentan en tiempo de depuración. A estas herramientas se les da
el nombre de ventanas de variables (variable windows). Ordinariamente se trata de
Locals, Autos, Watch y Quick Watch. Cada una de las ventanas muestra tres colum-
nas: nombre de la variable (name), valor (value) y tipo de dato (type).
9. La ventana Autos sirve para mostrar las variables utilizadas por la línea de código que
actualmente se está ejecutando, así como las variables utilizadas por las líneas anterio-
res a la que se está ejecutando, dentro de un mismo alcance. Esta ventana cambia di-
námicamente y es alimentada por el Depurador de Visual Studio (debugger).
10. Oprima repetidamente la tecla F11 hasta llegar a Sub Main(). Vea los cambios que ex-
perimenta la ventana Autos.
Capítulo 5. Espacios de nombres y desarrollo de librerías 167

11. Vea cómo se muestran dos variables. Al llegar a Sub Main() detecta que el procedi-
miento tiene una variable llamada Texto2, que aún no toma valor. La variable Texto1,
aunque no forma parte del procedimiento, se muestra porque está disponible dado que
tiene alcance de módulo. En otras palabras, es una variable utilizada por las líneas an-
teriores a la actual.
12. Seleccione la pestaña Locals. Esta herramienta sólo mostrará las variables locales del
alcance en que se encuentra la línea de código que actualmente se está ejecutando. Da-
da la línea en la que nos encontramos, sólo aparecerá la variable Texto2.

13. Seleccione Watch 1. Esta herramienta permite agregar variables y expresiones que de-
seamos saber cuánto valen en todo momento. Esta herramienta no carga variables au-
tomáticamente, por lo que hay que especificarle qué queremos que muestre.
5
14. La ventana Quick Watch (oprima las teclas Ctrl-Alt-Q) funciona de forma parecida a
Watch, con la diferencia de que puede mostrar sólo el contenido de una variable o ex-
presión en un momento dado. Por ejemplo, si queremos saber qué valor tiene la varia-
ble Texto4 en este momento, presionamos las teclas Ctrl-Alt-Q, con lo que aparecerá
Quick Watch. Coloque en Expression Texto4 y haga clic en Reevaluate. Con ello se
mostrará el contenido de la variable. En nuestro caso, Texto4 no está dentro del alcan-
ce en donde nos encontramos, por lo cual se reporta como no declarada.
168 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

15. Si estando en Quick Watch hacemos clic en Add Watch, la variable que evaluamos se
agregará a Watch.

➤ Ventanas de inspección de código


16. Seleccione Call Stack, que se encuentra apilada junto con Command Window. En
esta herramienta se muestran los programas, procedimientos y métodos que se están
ejecutando en un momento dado. En caso de que un procedimiento llame a otro proce-
dimiento, aparecerán los dos.

17. En nuestro caso, muestra que actualmente nos encontramos en la línea 37, en el
Procedimiento2() que fue llamado en la línea 18 por el procedimiento Main(). Saber
de dónde nace la ejecución de un procedimiento ayuda a resolver el origen de los pro-
blemas, en caso de que se presenten. Resulta interesante ver que Call Stack revisa el
origen de los procedimientos hasta llegar al ensamblado (Alcance.exe), dando infor-
mación del proyecto (Alcance), el programa (Module1) y finalmente el procedimiento.
Capítulo 5. Espacios de nombres y desarrollo de librerías 169

18. Seleccione Breakpoints, que sirve para mostrar todos los puntos de interrupción y su
estado. Con esta herramienta podemos saber la línea en que se encuentran, si están ac-
tivos o no, si les aplican condiciones y en qué casos detendrán la depuración. En nues-
tro caso aparece el único punto de interrupción que agregamos.

19. Seleccione Immediate Window, que sirve para evaluar expresiones y variables de una
forma programática y a petición.
20. Para desplegar valores podemos utilizar el comando Print, con su alias ?
21. Escriba en Immediate Window la siguientes instrucciones:
? Texto1
Debug.StepInto
? Texto1

22. Lo que hicimos fue mostrar el contenido de Text1. Luego provocamos que la depuración
avanzara en modo Step Into, con lo cual la variable adquirió valor; se volvió a mostrar el
contenido de la variable Texto1 y pudimos comprobar el nuevo valor de la variable.
23. Detenga la depuración, elimine todos los puntos de interrupción y guarde su solución.
FIN DEL EJERCICIO*
170 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 5. Espacios de nombres y desarrollo de librerías 171

TERMINOLOGÍA

Alias de Ejecución línea por Locals, 166 Quick Watch, 166


importación, 151 línea, 158 Namespace, 141 References, 152
Aplicación, 141 Espacio de nom- Nombres Referencia, 151
Autos, 166 bres, 141 calificados, 148 Strong names, 152
Breakpoint, 158 Extensibilidad, 141 fuertes, 152 Variable windows,
Code steping, 158 Fully qualified Punto(s) de 166
Edit and continue, name, 148 interrupción, 158 Watch, 166
160 Imports, 148 condicionales, 160

PREGUNTAS
5.1 ¿Cuáles son los espacios de nombres principales de BCL?
5.2 ¿Qué función tiene el estatuto Import?
5.3 ¿Qué beneficio deriva de programar librerías?
5.4 Mencione los espacios de nombres que cree usted que contengan la funcionalidad ne-
cesaria para dar soporte a sus aplicaciones profesionales.

5
172 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:
Capítulo 5. Espacios de nombres y desarrollo de librerías 173

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.

1. Sistema lógico de organización de clases de .NET Framework, de acuerdo a su funcionalidad:


a) Global Assembly Cache
b) Biblioteca de Clases Base
c) Espacios de nombres

2. Es la especificación textual de la jerarquía de espacios de nombres que permite ubicar una clase o
type:
a) Nombres calificados
b) Espacios de nombres
c) Object Hierarchy

3. Es la instrucción a través de la cual se especifican los espacios de nombre que utilizará un programa:
a) Imports
b) Reference
c) Using

4. Es la equivalencia de nombre que le damos a un espacio de nombres:


a) Alias de importación
b) Reference
c) Nombre calificado

5. Es el fenómeno que se presenta cuando en un programa se refieren dos métodos, pertenecientes a es-
pacios de nombres diferentes, pero que tienen el mismo nombre: 5
a) Colisión de nombre
b) Contaminación de espacios de nombres
c) Concurrencia de nombres

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Los espacios de nombres reflejan la jerarquía lógica y física de las clases en .NET
Framework.
7. Las librerías de .NET Framework son totalmente independientes del Registro de Win-
dows.
8. Las principales jerarquías de espacios de nombres en .NET Framework son System y
Objects.
9. El explorador de objetos permite verificar los objetos que estamos utilizando y sus ca-
racterísticas.
10. En .NET, cada programa puede disponer de su propia versión de una librería, como
consecuencia de la información contenida en el metadatos.
CAPÍTULO 6
Manejo de operadores

Objetivos: Aprender el manejo de los operadores aritméticos, de asignación, de


comparación y lógicos, con todas sus variantes.

1. Reconocerá los operadores aritméticos y la forma en que se emplean.


2. Sabrá qué son los operadores de asignación y de asignación incluyente,
y cómo se manejan.
3. Se familiarizará con los operadores comparativos y cómo se manejan.
4. Aprenderá a manejar los operadores Is y Like, para llevar a cabo compa-
raciones complejas de datos String.
5. Entenderá qué son los operadores lógicos y los operadores lógicos de
circuito corto, y cómo se manejan.
6. Comprenderá cuál es la prioridad de ejecución de los operadores, y có-
mo se maneja ésta utilizando paréntesis.

175
176 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Expresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Operadores de asignación incluyente . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Operadores comparativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Consideraciones relativas al código ASCII . . . . . . . . . . . . . . . . . . . . . . . 181
Option Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Operadores Is, IsNot y TypeOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Operador Like . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Operadores lógicos de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Tabla de comportamiento de operadores lógicos . . . . . . . . . . . . . . . . . 188
Prioridad entre operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Uso de paréntesis para otorgar preferencia de ejecución . . . . . . . . . . 190
Utilización general de operadores de Visual Basic . . . . . . . . . . . 191
➤ Comentarios en bloques de código . . . . . . . . . . . . . . . . 192
➤ Uso de Clipboard Ring . . . . . . . . . . . . . . . . . . . . . . . . . . 193
➤ Selección basada en bloques de código
(Block Selection) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Uso de operadores de asignación incluyente y operadores
de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Capítulo 6. Manejo de operadores 177

Sabemos que el procesador constituye el corazón de un sistema de computación: ahí es


donde esencialmente se lleva a cabo el procesamiento de la información en forma de ope-
raciones aritméticas y lógicas.
Los operadores son los elementos de que se vale un lenguaje de programación para la
transformación de expresiones mediante cálculos o comparaciones; son elementales en el
sentido de que nada se calcula y nada se decide sin su presencia.
Ya sabemos qué tipos de datos admite .NET y cómo se definen; el presente capítulo expli-
ca que no sólo es importante declarar y almacenar datos, sino manipularlos de tal forma
que a partir de ellos se genere información nueva. Ésta es la esencia del cómputo.

Operadores aritméticos
¿Quién no conoce los operadores aritméticos? Debido a que forman parte de la educación
básica difícilmente podríamos agregar algo que no se sepa con respecto a ellos. Quizá lo
“nuevo” sea la forma en que Visual Basic utiliza los operadores aritméticos.
No obstante lo obvio del tema, para no ser omisos definiremos a los operadores aritméti-
cos como los símbolos que producen, a partir de dos expresiones numéricas conocidas, una
nueva expresión numérica, como resultado de la aplicación de un cálculo aritmético entre
aquéllas.
El lenguaje dispone de los siguientes operadores aritméticos básicos:

+ Suma Suma expresiones numéricas. Concatena expresiones


(concatenación) de tipo String.
– Resta Representa la diferencia entre dos números o
especifica la condición negativa de uno.
* Multiplicación Multiplica dos números.
/ División Divide un número entre otro. 6
\ División entera Divide un número entre otro, dando un resultado
necesariamente entero.
Mod Módulo Divide un número entre otro, dando como
resultado el residuo.
^ Exponenciación Sirve para elevar un número a una determinada
potencia; un número puede ser negativo si el
exponente es un entero.
178 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La forma en que se resuelven este tipo de operadores es la siguiente:

Resultado = Expresión1 Operador Expresión2

Donde Expresión1, Expresión2 y Resultado son siempre datos numéricos; Operador es el


operador aritmético utilizado.
Se debe tomar en cuenta que Resultado puede no ser del mismo tipo que las expresiones;
por ejemplo, la suma de dos Integer, 2,000,000,000 y 2,000,000,000, no es Integer, y la
división de un Integer 3, entre 2, no dará un número Integer.

NOTA
En el caso de los datos de tipo String, es posible utilizar el operador de suma, que se encar-
ga de concatenar o unir las expresiones.

Para evitar la ambigüedad del operador “+”, Visual Basic acepta el uso del símbolo “&” para
concatenación de expresiones String. En realidad, la concatenación no se considera una ope-
ración aritmética.

Operadores de asignación
Los operadores de asignación son los que permiten asignar un valor a una variable o pro-
piedad. El ejemplo clásico de este tipo de operadores es el signo de “igual” (=).

Variable = Valor
donde Variable es una variable o propiedad que puede recibir valores, y Valor, una expre-
sión válida para el tipo de dato de Variable.

Expresión
Aunque puede resultar obvio, una expresión es un valor, existente o derivado: es expresión
existente si corresponde a una literal válida para un determinado tipo de dato, o una varia-
ble que la contenga; es expresión derivada, cuando es el resultado de someter varios valo-
res existentes, sean éstos variables o literales, a la acción de operadores.
Vea los siguientes ejemplos de expresiones:

4 Existente. Valor numérico 4


“A” Existente. Valor String A
4+5 Derivado. Valor numérico 9
3=2 Derivado. Valor lógico False, pues 3 y 2 no son iguales
“A” & “B” Derivado. Valor de concatenación String AB
Capítulo 6. Manejo de operadores 179

Considere los siguientes ejemplos, después de definir la siguiente variable:


Dim Edad As Integer = 20

Expresiones que podemos utilizar:


Edad La variable misma
str(Edad) La transformación de la variable
“Edad:” & Str(Edad) La transformación de la variable y otras literales

Operadores de asignación incluyente

Son operadores de asignación incluyente aquellos que consideran el valor que posee la va-
riable o propiedad a la que se le asigna el valor como primera expresión de una operación,
asignando el resultado de la operación a la variable misma.
Los operadores de asignación incluyente existen para los siguientes operadores: ^, *, /, \,
+, –, &, y la forma de representarlos es el operador seguido inmediatamente por un signo
de igual. Veamos las siguientes asignaciones equivalentes:
x = x +1 Es lo mismo que x += 1
x = x-1 Es lo mismo que x –= 1
x = x * 4 Es lo mismo que x *= 4
x = x ^ 2 Es lo mismo que x ^= 2

Vea los siguientes ejemplos:

Hace que Var1


Si Var1 vale Y Var2 vale La operación valga
10 3 var1 ^= var2 1000
10 3 var1 *= var2 30
12 3 var1 /= var2 4
6
10 3 var1 \= var2 3
10 3 var1 += var2 13
“ABC” “DEF” var1 &= var2 “ABCDEF”
10 3 var1 -= var2 7
180 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Operadores comparativos
Los operadores comparativos permiten comparar expresiones, una en relación con otra,
para dar como resultado un valor de falso (False), verdadero (True) o nulo (Null), depen-
diendo de si la comparación es una verdad o no.
Hasta el momento no hemos tratado los valores nulos; los valores nulos son la ausencia
de valor alguno, y su utilidad es para aplicaciones específicas en donde la afectación de un
valor es importante.
La siguiente tabla presenta los operadores comparativos que Visual Basic maneja:

Operador Verdadero si Falso si Nulo si


<
(Menor que) expresión1 expresión1 >= expresión1 o expresión2
< expresión2 expresión2 = Null
<=
(Menor o igual que) expresión1 expresión1 expresión1 o expresión2
<= expresión2 > expresión2 = Null
>
(Mayor que) expresión1 expresión1 expresión1 o expresión2
> expresión2 <= expresión2 = Null
>=
(Mayor o igual que) expresión1 expresión1 expresión1 o expresión2
>= expresión2 < expresión2 = Null
=
(Igual a) expresión1 expresión1 expresión1 o expresión2
= expresión2 <> expresión2 = Null
<>
(Distinto de) expresión1 expresión1 expresión1 o expresión2
<> expresión2 = expresión2 = Null

La forma en que se resuelven este tipo de operadores es la siguiente:

Resultado = Expresión1 Operador Expresión2

Expresión1 y Expresión2 pueden ser cualquier tipo de expresiones comparables entre sí.
Resultado será siempre lógico (True, False), o nulo (Null). Operador es el operador uti-
lizado para la comparación.
Capítulo 6. Manejo de operadores 181

Algunos ejemplos del uso de estos operadores son:


“A” = “B” Retorna False
1 > 0.5 Retorna True
2 >= 2 Retorna True
“S” < “s” Retorna True
Tome en cuenta que las letras mayúsculas, para efectos de comparación, tienen un
valor en código ASCII menor a las minúsculas; por tanto, son menores. Adicional-
mente, la “A” es menor que la “Z”.

Consideraciones relativas al código ASCII

El juego de caracteres de siete bits denominado ASCII (American Standard Code In-
formation Interchange / Código Estándar Estadounidense para el Intercambio de
Información) es ampliamente utilizado para representar letras y símbolos de un te-
clado estándar de Estados Unidos. El juego de caracteres ASCII es igual que los pri-
meros 128 caracteres (0-127) del juego de caracteres ANSI, utilizado por las máqui-
nas antiguas. Es importante que conozca algunas referencias del código ASCII que
pueden serle de utilidad:

Código ASCII Representa

8 BackSpace (RETROCESO)
13 Enter (INTRO)
32 SpaceBar (BARRA ESPACIADORA)
64 “@”
92 “\”

Código ASCII Representa

48 al 57 “0” al “9”
6
65 al 90 “A” a la “Z”
97 al 122 “a” a la “z”
225, 233, 237, “á”, “é”, “í”,
243, 250, 241 “ó”, “ú”, “ñ”

Algunas personas, sobre todo aquellas que no tienen su teclado configurado ade-
cuadamente, saben que presionando la tecla ALT y las correspondientes del teclado
numérico a un código ASCII, éste aparecerá. Para ello es necesario que el teclado nu-
182 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mérico esté activado (teniendo el BLOQ NUM / NUM LOCK activado). Por
ejemplo:
Alt + 64 equivale a teclear “@”

Visual Basic, por otro lado, tiene funciones que permiten obtener la representación
simbólica de un código ASCII, así como el código ASCII a partir de una represen-
tación simbólica. Las funciones que lo permiten son Chr( ) y Asc( ), respectiva-
mente. Estas funciones emplean la siguiente sintaxis:
Chr(CódigoASCII )

Asc(“Caracter”)

Por ejemplo:
Chr(64) → “@”

Asc(“@”) → 64

Option Compare

Uno de los conceptos importantes relacionado con la comparación de datos (específi-


camente de los de tipo String), es su sensibilidad al uso de mayúsculas y minúsculas.
Se dice que un esquema de comparación es case-sensitive cuando una comparación
es sensible a la diferencia entre mayúsculas y minúsculas (“A” ≠ “a”). Se dice que
un esquema de comparación es non case-sensitive, cuando una comparación no lo es
(“A” = “a”).
En el caso de Visual Basic, podemos especificar de qué manera queremos que nues-
tros programas se comporten respecto de las comparaciones. Para ello, utilizamos
el estatuto Option Compare. Su sintaxis es la siguiente:

Option Compare [Text / Binary]

Si se especifica Option Compare Text, las comparaciones se realizarán bajo el es-


quema insensible al uso de mayúsculas y minúsculas; si se especifica Option Com-
pare Binary, las comparaciones se realizarán bajo el esquema sensible.

Option Compare debe especificarse al inicio de los programas, antes de cualquier lí-
nea de código. Si se omite la especificación, el esquema de comparación será sen-
sible (Binary).
Capítulo 6. Manejo de operadores 183

Operadores Is, IsNot y TypeOf

Además de los operadores comparativos comunes, Visual Basic proporciona dos operado-
res comparativos especiales: Is y Like.
El operador Is es un operador que determina si una variable hace referencia a la misma po-
sición de memoria que otra.
La forma en que se resuelve este operador es la siguiente:
Resultado = Expresión1 Is Expresión2
Expresión1 y Expresión2 deben ser variables reference type. Resultado siempre es lógico
(True, False).
Isdevolverá verdadero (True) si las variables comparadas refieren a la misma posición de
memoria, y falso (False) si refieren a posiciones distintas de memoria.
En ocasiones, lo que se desea saber es si un objeto no refiere la misma posición que otro.
Anteriormente, la tarea se debía realizar combinando los operadores Not e Is, de la siguien-
te forma:
If Not Objeto1 Is Objeto2 Then WriteLine(“Diferentes”)

Dado que esta expresión es poco natural en su lectura, Visual Basic incluye el operador
IsNot, que devuelve True en caso de que dos objetos no refieran a la misma posición de
memoria. La línea de código quedaría como sigue:
If Objeto1 IsNot Objeto2 Then WriteLine(“Diferentes”)

En ocasiones la comparación no se realiza entre un objeto y otro, sino entre un objeto y un


type. Visual Basic incluye un operador denominado TypeOf... Is, que devuelve verdade-
ro en caso de que un objeto sea de un tipo determinado. Por ejemplo, si deseamos saber si
la variable X es de tipo Integer, tendríamos que especificar lo siguiente:
If (TypeOf X Is Integer) Then WriteLine(“X es Integer”) 6

Operador Like

El operador Like compara dos expresiones String, no en términos de igualdad, sino en tér-
minos de cumplimiento de un patrón determinado.
Este operador es especialmente útil cuando se verifica si una cadena de caracteres com-
puesta obedece a un formato predefinido. Imagine un código de producto que siempre sea
de tres letras, un guión y cuatro números; en tal caso se tienen dos opciones: utilizar Like
184 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

o desarrollar una rutina que analice carácter por carácter la expresión y sus posiciones. Sobra
decir que utilizar Like es mucho más efectivo. La forma en que se resuelve este operador
es la siguiente:

Resultado = Expresión1 Like Expresión2

Expresión1 debe ser una expresión de tipo String; Expresión2 es un patrón String que se pre-
tende reconocer como existente en Expresión1. Resultado siempre es lógico (True, False).
Like retornará verdadero (True) si el patrón a buscar es reconocido dentro del dato String
base de la comparación, y falso (False) en caso de que no se reconozca.
El patrón a buscar, llamado patrón nominado, es una literal conformada por caracteres es-
peciales que representan el contenido de caracteres a buscar; a continuación una tabla que
muestra dichos caracteres y su significado.

Carácter de patrón Significado

? Cualquier carácter

* Varios caracteres o ninguno

# Cualquier dígito (0-9)

[lista] Cualquier carácter de la lista

[!lista] Cualquier carácter que no esté en la lista

Considere los siguientes ejemplos:

“F” Like “F” Devuelve True


“24/10/2002” Like “##/##/####” Devuelve True
“ABC” Like “AB*” Devuelve True
“MP3” Like “[A-Z][A-Z]#” Devuelve True
“MPG” Like “[A-Z][A-Z]#” Devuelve False
“MP3” Like “[A-Z][A-Z]?” Devuelve True
“MPG” Like “[A-Z][A-Z]?” Devuelve True
“AMERICA” Like “A*A” Devuelve True
“HP2992” Like “[!H]*” Devuelve False
“DP2992” Like “[!H]*” Devuelve True
“micorreo@mail.com” Like “*@*” Devuelve True
Capítulo 6. Manejo de operadores 185

Recomendamos utilizar los patrones para determinar la validez de formatos mixtos de da-
tos; por ejemplo, claves de cuatro letras y tres números.
Si lo que va a evaluar son formatos más estándar, como números o fechas, recomendamos
otras funciones más sofisticadas como IsNumeric() o IsDate().

Operadores lógicos
Los operadores lógicos son aquellos que sirven para unir o negar condiciones, producien-
do un valor lógico. Los operadores lógicos básicos son:
❑ Not Niega el resultado de una condición. Revierte el valor; si la condición que afecta es
True producirá False, y viceversa.
❑ And Cuando de entre dos condiciones las dos deben ser True para que en su conjunto
la expresión sea True. (Con todas las condiciones True, devolverá True).
❑ Or Cuando de entre dos condiciones, al menos una debe ser True para que en su con-
junto la expresión sea True. (Con al menos una condición True, devolverá True.)
❑ Xor Cuando entre dos condiciones, al menos una cumple por True, pero no las dos.

La forma en que se resuelven este tipo de operadores es la siguiente:


Resultado = [Expresión1] Operador Expresión2
Expresión1 y Expresión2 son expresiones de tipo lógico. En el caso de Not, Expresión1 no
se debe poner, ya que el operador actúa sobre una sola expresión. Resultado será siempre
lógico (True, False).
Cuando una expresión lógica se compone de una sola comparación, se dice que es una ex-
presión lógica simple debido a que se resolverá en sólo un tiempo; si involucra dos o más
comparaciones, o la utilización de un operador lógico, se dice que es una expresión lógica
compuesta, debido a que la expresión lógica deberá resolverse en dos o más tiempos (se re-
6
suelve la comparación y luego se resuelve dentro del contexto en que se encuentra). Una
expresión lógica compuesta siempre se compone de expresiones lógicas simples, afectadas
por operadores lógicos que las obligan a resolverse como una sola expresión lógica.
186 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejemplos:

Not True Es False, porque es lo contrario a True.


Not False Es True, porque es lo contrario a False.
Not “A” = “B” Es True, porque “A” = “B” es False, pero negado es True.
“A” = “B” And 1 > 0.5 Es False, porque no todas las condiciones son True.
“A” = “B” Or 1 > 0.5 Es True, porque al menos una condición es True.

En caso de tenerse más de dos condiciones conjuntas, entra en operación lo que se conoce
como preferencia, que consiste en determinar el orden en que las condiciones u operacio-
nes se han de resolver. Por ejemplo:
“A” = “B” OR 1 > 0.5 AND 2 >= 2 AND “S” > “s”

es False. Las condiciones se resuelven de izquierda a derecha. Vea la explicación en la fi-


gura 6.1:

FIGURA 6.1
Resolución de
una expresión
con múltiples
condiciones

❑ Primero se resuelven las condiciones de comparación.

❑ Una vez resueltas las condiciones de comparación, se sigue el orden de izquierda a de-
recha: se resuelve la primera condición de tipo lógico; el resultado de ésta forma parte
de la siguiente condición, y así hasta terminar.
❑ La expresión inicia siendo una expresión lógica compuesta, formada por cuatro expre-
siones lógicas simples, que con la ayuda de tres operadores lógicos se ven obligadas a
resolverse como una sola expresión lógica que termina con un valor False.
Capítulo 6. Manejo de operadores 187

Las condiciones se resuelven como si tuvieran paréntesis imaginarios:


( ( (“A” = “B” Or 1 > 0.5) And 2 >= 2) And “S” > “s”)

En donde las condiciones encerradas en los paréntesis de mayor profundidad se resuelven


primero.
Si usted agrega de manera explícita paréntesis en las condiciones, les asignará preferencia.
Por ejemplo, cambiemos un poco el orden del ejemplo anterior y veamos qué sucede:
“S” > “s” Or 2 >= 2 And 1 > 0.5 And “A” = “B”

De acuerdo a lo que vimos, se resolvería la primera condición con la segunda (False Or


True, se resuelve como True), el resultado se resolvería con la tercera (True And True, de-
vuelve True), y el resultado se resolvería con la cuarta (True And False, devuelve False).
El resultado de lo último que se resolvió fue False.
¿Cómo cambiaríamos la condición, mediante el uso de paréntesis, para que el resultado
fuera verdadero? A continuación una solución:
(“S” < “s” OR ( 2 >= 2 AND 1 > 0.5 And “A” = “B”))

De esta forma forzamos que en primera instancia se resuelva el paréntesis de mayor pro-
fundidad, que contiene la segunda, tercera y cuarta expresiones (True And True And Fal-
se, devuelve False), el resultado se resuelve con la primera condición, por ser el parénte-
sis de mayor profundidad que sigue (True Or False, devuelve True).
Una regla es que siempre debe cerrar los paréntesis que abra. Una inadecuada colocación
de condiciones puede arrojar resultados erróneos; le recomendamos que aunque de forma
predefinida existe una preferencia, usted determine claramente cuál desea, utilizando pa-
réntesis cuando tenga más de una condición por resolver.

Operadores lógicos de circuito corto


6
En programación es común que para que algo suceda, debe cumplirse más de una condi-
ción. Uno de los problemas que tenía la anterior versión de Visual Basic, es que no era lo
suficientemente inteligente para saber que ya no tenía caso resolver ciertas condiciones, en
el caso de And y Or.
Sabemos que en el caso de And, si una expresión lógica es False todo es False; si en una
comparación nos encontramos que la primera expresión lógica es False, ¿qué caso tiene
resolver la segunda expresión?
188 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se denominan operadores lógicos de circuito corto (short- circuiting), aquellos que son ca-
paces de determinar la necesidad de continuar evaluando condiciones posteriores a las pri-
meras. Son dos:
❑ AndAlso Procesa comparaciones lógicas de circuito corto, de tipo And; produce
False a la primera expresión False que se encuentra, y concluye con la resolución de
expresiones.
❑ OrElse Procesa comparaciones lógicas de circuito corto, de tipo Or; produce True a la
primera expresión True que se encuentra, y concluye con la resolución de expresiones.

Tabla de comportamiento de operadores lógicos

La siguiente tabla muestra el comportamiento de los operadores lógicos:

Operador Si Expresión1 es Y Expresión2 es Resultado


And True True True
And True False False
And False True False
And False False False
Or True True True
Or True False True
Or False True True
Or False False False
Xor True True False
Xor True False True
Xor False True True
Xor False False False
AndAlso True True True
AndAlso True False False
AndAlso False Ni siquiera se evalúa False
AndAlso False Ni siquiera se evalúa False
OrElse True Ni siquiera se evalúa True
OrElse True Ni siquiera se evalúa True
OrElse False True True
OrElse False False False
Capítulo 6. Manejo de operadores 189

Prioridad entre operadores


Cuando hay varias expresiones dentro de una expresión que las engloba, cada parte de ésta
se evalúa y resuelve en un orden predeterminado donde ciertos operadores han de resolver-
se antes que otros; a esto se le conoce como prioridad de los operadores. Tener esto en
mente es importante, pues algunos operadores requieren resolver expresiones derivadas an-
tes de ser resueltas.
Por ejemplo:
(2+5) > (3+1)

No podemos resolver la expresión que implica el operador comparativo (>), si antes no re-
solvemos las expresiones que involucran el operador de suma (+). El procesador no resuel-
ve operaciones a nivel abstracto.
Cuando hay expresiones que contienen operadores de más de una categoría (aritméticos, de
comparación y lógicos), se resuelven en este orden:
1. Las expresiones que tienen operadores aritméticos.
2. Las expresiones que tienen operadores de comparación.
3. Las expresiones que involucran operadores lógicos.
Esto tiene sentido si tomamos en cuenta que la materia prima para los operadores aritméti-
cos son generalmente expresiones numéricas o expresiones String, y con ellos se genera
una nueva expresión numérica o expresión String.
Los operadores de comparación, por su parte, tienen como materia prima dos expresiones
numéricas o expresiones String, y con ellos se determina un valor lógico.
Por último, los operadores lógicos permiten generar una expresión lógica de dos expresio-
nes lógicas.
Los operadores de comparación tienen la misma prioridad; es decir, se evalúan de izquier-
da a derecha en el orden en que aparecen. Los operadores se evalúan en el siguiente orden
6
de prioridad:

Aritméticos
Exponenciación (^)
Negatividad de expresión (–)
Multiplicación y división (*, /)
División de enteros (\)
Módulo aritmético (Mod)
Adición y sustracción (+, –)
190 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Comparación
Igualdad (=)
Desigualdad (<>)
Menor que (<)
Mayor que (>)
Menor o igual que (<=)
Mayor o igual que (>=)

Lógicos
Not
And
Or
Xor

Cuando hay multiplicación y división en la misma expresión, cada operación se evalúa a


medida que aparece, de izquierda a derecha. Del mismo modo, cuando se presentan adicio-
nes y sustracciones en una misma expresión, cada operación se evalúa tal como aparecen
de izquierda a derecha.

Uso de paréntesis para otorgar preferencia de ejecución

Es posible usar paréntesis para saltar el orden de preferencia y forzar que algunas partes de
una expresión se evalúen antes que otras. Las operaciones entre paréntesis se realizarán an-
tes que aquellas que se encuentren fuera. Sin embargo, dentro de los paréntesis, la priori-
dad de los operadores se mantiene según las reglas.
Cuando se emplean paréntesis para determinar un orden de resolución de expresiones, se
está especificando la preferencia de ejecución explícita. Cuando se deja que el lenguaje
proporcione el orden de izquierda a derecha, atendiendo a la prioridad de los operadores,
se habla de la preferencia de ejecución automática. Los programadores profesionales acos-
tumbran el uso de la preferencia de ejecución explícita, ya que es más fácil de analizar al
momento de depurar los programas y deja una idea clara de la forma en que se desea que
las cosas se resuelvan.
El operador de concatenación de cadenas (&) no es realmente un operador aritmético, pe-
ro en orden de prioridad se encuentra a continuación de todos los operadores aritméticos y
antes que todos los operadores de comparación.
Capítulo 6. Manejo de operadores 191

No olvide que por más larga que parezca una expresión, todos los operadores actúan sobre
dos expresiones, y de dos en dos, hasta dejar una sola expresión final que podrá ser asig-
nada a una variable o propiedad, o utilizada por algún estatuto o función.

Ejercicio 6.1
Utilización general de operadores de Visual Basic

En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso
de variables en un proceso.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado
Operadores.

3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Operadores - Module1.vb

1 Module Module1
2
3 Sub Main()
4 Dim Numero1 As Integer = 5
5 Dim Numero2 As Single = 2
6 Dim Texto1 As String = “Visual “
7 Dim Texto2 As String = “Basic.NET”
8 Console.WriteLine(Numero1)
9 Console.WriteLine(Numero2)
10 Console.WriteLine(Numero1 + Numero2)
11 Console.WriteLine(Numero1 – Numero2)
12
13
Console.WriteLine(Numero1 * Numero2)
Console.WriteLine(Numero1 / Numero2)
6
14 Console.WriteLine(Numero1 \ Numero2)
15 Console.WriteLine(Numero1 Mod Numero2)
16 Console.WriteLine(Texto1 Is Texto2)
17 Console.WriteLine(Texto1 IsNot Texto2)
18 Console.WriteLine(Texto1 + Texto2)
19 Console.WriteLine(Texto1.Trim() + Texto2.Trim())
20 Console.WriteLine(Texto1.Trim() + “ “ + Texto2.Trim())
21 Console.WriteLine(“Pulse INTRO para continuar”)
22 Console.ReadLine()
23 End Sub
24
25 End Module
192 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Operadores – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya reali-
zado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (tecla F5).
5. Los resultados son simples resoluciones de operadores que no requieren explicación. Lo
único novedoso es el uso del método Trim del objeto String, que se encarga de elimi-
nar los espacios adicionales en el texto. Los resultados deben ser los siguientes:

5
2
7
3
10
2.5
2
1
False
True
Visual Basic.NET
VisualBasic.NET
Visual Basic.NET
Pulse INTRO para continuar

➤ Comentarios en bloques de código

6. En ocasiones se requiere comentar una buena cantidad de líneas de código. La alterna-


tiva más laboriosa y demorada es colocar un apóstrofo al inicio de cada línea; la otra al-
ternativa es utilizar las herramientas de Visual Studio.
7. Seleccione de la línea 8 a la 20.
8. Seleccione Edit – Advanced – Comment Selection, o presione la las teclas Ctrl-K,
Ctrl-C. Esta secuencia de teclas se especifica presionando Ctrl-K, soltando, e inmedia-
tamente presionando Ctrl-C. Se debieron haber comentado todas las líneas que estaban
seleccionadas:
Capítulo 6. Manejo de operadores 193

9. Marque nuevamente las líneas de la 8 a la 20, que se encuentran comentadas.


10. Seleccione Edit – Advanced – Uncomment Selection, o presione la secuencia de
teclas Ctrl-K, Ctrl-U. Los apóstrofos debieron desaparecer.

➤ Uso de Clipboard Ring

11. Una de las tareas más comunes realizadas dentro de un editor de textos es copiar y
pegar código (copy and paste). Generalmente al seleccionar código se parte de una po-
sición determinada en una línea, se selecciona todo lo que resta de la línea hacia la de-
recha, se incluyen varias líneas y se llega a una posición determinada de una línea
de fin. En términos generales, el copiado se hace con base en líneas de código, a lo que
6
se conoce como line-based copy-paste.
194 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Se oprime la combinación de teclas Ctrl-C o Ctrl-X para copiar o mover el contenido
seleccionado al portapapeles del equipo, que es la memoria temporal de trabajo en el
ambiente Windows. Una vez que se tiene algo en el portapapeles, se puede pegar su
contenido en un lugar determinado, oprimiendo Ctrl-V. Existe la creencia generaliza-
da de que sólo se mantiene en el portapapeles lo último que se copia.
13. Realice, utilizando Ctrl-X y Ctrl-V, los siguientes cambios: mueva la línea 9 justo an-
tes de la línea 8, y ponga la línea 17 inmediatamente antes de la 16. Ponga atención a
cómo lo hace.
14. Seguramente seleccionó la línea 9 de manera completa, oprimió Ctrl-X, se colocó al inicio
de la línea 8 y oprimió Ctrl -V. Después seleccionó la línea 17 de manera completa,
oprimió Ctrl -X, se colocó al inicio de la línea 16 y oprimió Ctrl -V. ¿Es correcto?
15. El portapapeles realmente almacena hasta las últimas 20 cosas que haya copiado o co-
locado en él, y pueden ser extraídas utilizando Ctrl-Mayús-V. Al reunirse 20 conteni-
dos en portapapeles y tratar de agregar uno más, el contenido más antiguo se pierde y
el nuevo contenido toma la primera posición de recuperación. El portapapeles tiene una
organización de recuperación LIFO (Last In, First Out / Últimas entradas, primeras sa-
lidas), que da lugar a lo que se conoce como circuito del portapapeles o Clipboard
Ring.
16. Hay que deshacer los cambios que realizó, es decir, regresar las líneas 8 y 17 origina-
les a su lugar. Para ello utilizaremos el circuito del portapapeles.
17. Seleccione completamente la que ahora es la línea 16. Oprima Ctrl-X.
Con ello el portapapeles tiene almacenados los siguientes valores:
1: Console.WriteLine(Texto1 IsNot Texto2)

...

18. Seleccione completamente la que ahora es la línea 8. Oprima Ctrl-X.


Con ello el portapapeles tiene almacenados los siguientes valores:
1: Console.WriteLine(Numero2)

2: Console.WriteLine(Texto1 IsNot Texto2)

...

19. Vaya a la que ahora es la línea 9 y oprima Ctrl-Mayús-V una vez. Visual Studio retorna-
rá lo que se tenga en la posición 1, que es lo último que colocamos en el portapapeles.
20. Vaya a la que ahora es la línea 17 y oprima Ctrl-Mayús-V dos veces. Visual Studio re-
tornará en la primera ocasión la posición uno, y en la segunda la posición dos. Vea có-
mo se sustituye automáticamente lo que está retornándose del portapapeles.
Capítulo 6. Manejo de operadores 195

21. Imagine las posibilidades de almacenar en el portapapeles los nombres de las variables de
uso más común en un proceso, y estarlas invocando de manera rápida en nuestra edición.

➤ Selección basada en bloques de código (Block Selection)

22. Analizando el código podemos darnos cuenta de que Console se repite en múltiples
ocasiones. Se puede simplificar el código agregando un Import al inicio del programa,
eliminando el nombre de la clase Console en todo nuestro código. El problema es qui-
tar Console de las líneas, dado que tendríamos que hacerlo línea por línea.
23. Utilizando la selección basada en líneas no podemos seleccionar únicamente el nom-
bre del objeto Console de todas ellas sin marcar el resto de la línea.
24. Visual Studio permite lo que se conoce como selección basada en bloques (Block Se-
lection), que implica seleccionar un área rectangular del área de edición.
25. Trace un rectángulo que encierre los nombres de objeto Console en el área de edición.
Para hacerlo, arrastre el puntero del ratón desde la esquina superior izquierda de lo que
quiere marcar hasta la esquina inferior derecha mientras oprime la tecla Alt. No olvi-
de incluir el punto de Console.

6
196 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

26. Oprima las teclas Ctrl-X para enviar el contenido al portapapeles, con lo cual se elimi-
nan las referencias del código.
27. Vaya al inicio del programa, y antes de cualquier otra línea agregue la siguiente:
Imports System.Console

28. Construya la solución (teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como


proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la
solución (Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de
su programa (tecla F5).
FIN DEL EJERCICIO *

Ejercicio 6.2
Uso de operadores de asignación incluyente y operadores de circuito corto

En este ejercicio se utilizará una aplicación de consola para comprobar los operadores de
asignación incluyente, así como los operadores de circuito corto.
El programa solicita tres números entre 1 y 10. A través de asignación incluyente se acumu-
larán los valores capturados, y mediante los operadores de circuito corto se hará más efi-
ciente un proceso, detectándose de entre los números capturados alguno que sea primo. Re-
cuerde que un número primo es aquel que se divide sólo entre 1 y entre sí mismo; en el
rango de nuestro ejemplo, los únicos números primos son 1, 2, 3 y 7.
En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso
de variables en un proceso.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Primos.
3. Edite el programa de tal forma que aparezca como sigue:
Capítulo 6. Manejo de operadores 197

Codificación de Primos - Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7
8 Dim N1 As Integer
9 Dim N2 As Integer
10 Dim N3 As Integer
11 Dim Total As Integer = 0
12
13 Console.WriteLine(“— Suma de 3 números ———————-”)
14 Console.WriteLine(“— Sólo capture enteros del 1 al 10”)
15 Console.Write(“Número 1 de 3:”)
16 N1 = CInt(Console.ReadLine())
17 Console.Write(“Número 2 de 3:”)
18 N2 = CInt(Console.ReadLine())
19 Console.Write(“Número 3 de 3:”)
20 N3 = CInt(Console.ReadLine())
21
22 Total += N1
23 Total += N2
24 Total += N3
25
26 If ((N1 = 1 OrElse N1 = 2 OrElse N1 = 3 OrElse N1 = 7) OrElse _
27 (N2 = 1 OrElse N2 = 2 OrElse N2 = 3 OrElse N2 = 7) OrElse _
28 (N3 = 1 OrElse N3 = 2 OrElse N3 = 3 OrElse N3 = 7)) Then
29 Console.WriteLine(“Al menos uno de los números es primo”)
30 Else
31 Console.WriteLine(“Ninguno de los números es primo”)
32 End If
33
34
35
Console.WriteLine(“Total:” & CType(Total, String))
Console.WriteLine(“Pulse INTRO para continuar”)
6
36 Console.ReadLine()
37
38 End Sub
39
40 End Module
198 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Primos – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya reali-
zado en la solución (CTRL-MAYÚS-S). Inicie la depuración para comprobar el com-
portamiento de su programa (tecla F5).
5. El programa declara las variables de trabajo de la línea 5 a la 8.
6. Es importante que esté consciente de cómo estamos haciendo la conversión de datos,
tanto al momento de recibir los valores de consola, como al mostrarlos, dado que nues-
tro programa es type safe.
7. Capture como datos de entrada los números 4, 6, 8.
La línea 22 ejecuta una asignación incluyente basada en suma; Total += N1, es igual
que haber escrito Total = Total + N1. En este caso, N1 vale cero porque no se le es-
pecificó valor al momento de ser declarada. Después de la línea 22, Total vale 0 + 4;
es decir, 4; después de la línea 23, vale 4 + 6, es decir 10, y después de la línea 24, va-
le 10 + 8, es decir 18.
Las líneas 26, 27 y 28 realmente son una sola línea de código. Se estará evaluando si N1
es alguno de los números primos posibles del 1 al 10. Si N1 es igual a 1, o igual a 2, o
igual a 3, o si es igual a 7, la primera expresión es True. La misma comparación se rea-
liza con N2 y con N3.
Internamente, con los números que se proporcionaron, las operaciones se resolverían
de la siguiente manera:
if ((False OrElse False OrElse False OrElse False) OrElse _

(False OrElse False OrElse False OrElse False) OrElse _

(False OrElse False OrElse False OrElse False))

que sería lo mismo que:


if (False)

Por tanto, el programa tendría una salida falsa, reportando que ninguno de los números
tecleados es primo.
Si todo ocurrió como se esperaba, la salida será la siguiente:
–– Suma de 3 números ––––––––––––––
–– Sólo capture enteros del 1 al 10
Número 1 de 3:4
Capítulo 6. Manejo de operadores 199

Número 2 de 3:6
Número 3 de 3:8
Ninguno de los números es primo
Total:18
Pulse INTRO para continuar

8. Ahora ejecute el ensamblado, capturando los números 3, 6, 8.


Si N1 es igual a 1, o igual a 2, o igual a 3, o si es igual a 7, la primera expresión es True.
La misma comparación se realiza con N2 y con N3.
Internamente, con los números que se proporcionaron, las operaciones se resolverían de
la siguiente manera:
If ((False OrElse False OrElse True OrElse False) OrElse

(False OrElse False OrElse False OrElse False) OrElse

(False OrElse False OrElse False OrElse False))

que sería lo mismo que:


If (True)

Como puede observar, la forma en que se resuelve la condición es mucho más simple
debido a que los operadores de circuito corto. La primera condición se resuelve por
True, debido a que con Or, ante la presencia de al menos un True, todo es True. Ya no
se sigue evaluando más condiciones.
Si todo ocurrió como se esperaba, la salida será la siguiente:
–– Suma de 3 números ––––––––––––––
–– Sólo capture enteros del 1 al 10
Número 1 de 3:3
Número 2 de 3:6
Número 3 de 3:8
Al menos uno de los números es primo
Total:17
Pulse INTRO para continuar 6
200 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 6. Manejo de operadores 201

TERMINOLOGÍA

And, 185 Is, 183 Operadores, 177 Or, 185


AndAlso, 188 IsNot, 183 aritméticos, 177 OrElse, 188
Clipboard Ring, 193 Like, 183 comparativos, Resta (-), 177
Comment Selection, Mayor o igual que 180 Short-circuiting,
192 (>=), 180 de asignación, 188
Distinto de (<>), Mayor que (>), 180 178 Suma (+), 177
180 Menor o igual que incluyente, TypeOf, 183
División (/), 177 (<=), 180 179 Xor, 185
entera (\), 177 Menor que (<), 180 lógicos, 185
Exponenciación (^), Módulo, 177 de circuito
177 Multiplicación (*), corto, 188
Expresión, 178 177 Option compare,
Igual a (=), 178, 180 Not, 185 182

PREGUNTAS
6.1 ¿Cuáles son los operadores aritméticos, para qué sirven y cuál es su precedencia?
6.2 ¿Cuáles son los operadores de asignación, para qué sirven y cuál es su precedencia?
6.3 ¿Cuáles son los operadores comparativos, para qué sirven y cuál es su precedencia?
6.4 ¿Cuáles son los operadores lógicos, para qué sirven y cuál es su precedencia?
6.5 ¿Por qué son importantes las reglas de precedencia?
6.6 ¿Cuáles son las ventajas de los operadores de circuito corto con respecto a los opera-
dores lógicos?
6.7 ¿Cuáles son las ventajas de los operadores de asignación incluyente con respecto a los
operadores aritméticos? 6
202 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:
Capítulo 6. Manejo de operadores 203

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Si lo que quiero es generar un nuevo valor numérico a partir de otros dos valores numéricos, debo
utilizar un operador:
a) De asignación
b) Aritmético
c) Lógico

2. Si quiero comparar un valor en relación con otro valor, debo usar un operador:
a) Comparativo
b) Relacional
c) Aritmético

3. Son aquellas expresiones lógicas que involucran más de una comparación:


a) Complejas
b) Abiertas
c) Compuestas

4. Son lo adecuado cuando la variable a recibir un valor también es considerada como primer factor de
cálculo:
a) Operadores aritméticos implícitos
b) Operadores de asignación incluyente
c) Operadores comparativos

5. Indican que un determinado tipo de expresiones han de resolverse antes que otras:
a) Prioridad entre operadores
b) Preferencia de ejecución explícita
c) Preferencia de ejecución automática

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Una multiplicación se resuelve antes que una suma.

7. En una expresión lógica, al aplicar el operador Or, con una expresión que sea False,
todo es False.

8. Si se especificó Option Compare Text, “A” es igual que “a”. 6


9. Si x es igual a 1, x *= 2 es igual a x += 2.

10. Si una clave se compone de un número y una letra, el patrón a utilizar en una compa-
ración Like, para producir verdadero, sería “[0-9][A-Z]”.
CAPÍTULO 7
Estructuras de decisión
y control
Objetivos: Familiarizarse con las estructuras de decisión, para realizar procesos
condicionales, y con las estructuras de control para el manejo de procesos iterativos.

1. Reconocerá las estructuras de decisión.


2. Revisará la utilización de If para codificar procesos condicionales.
3. Entenderá cómo manejar los procesos condicionales con ejecución en el
sentido afirmativo y en el negativo.
4. Comprenderá cómo utilizar Select Case para ejecutar procesos mutua-
mente excluyentes, dependiendo de un valor.
5. Conocerá qué son las estructuras de control en Visual Basic.
6. Aprenderá a utilizar For Next para el control de procesos iterativos.
7. Aprenderá a utilizar While para el control de procesos iterativos.
8. Aprenderá a utilizar Do Loop para el control de procesos iterativos.
9. Aprenderá cómo anidar estructuras de decisión y control.

205
206 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Estructuras de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Estatuto If Then Else (condicional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Do Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Estructuras envolventes y anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Reglas para el anidado de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . 215
Uso de estructuras de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Uso de For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
➤ Adición de tareas a Task List . . . . . . . . . . . . . . . . . . . . . . 223
➤ Adición de comentarios de tarea a un programa . . . . . . 225
Identificación de errores en estructuras anidadas . . . . . . . . . . . . 226
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Capítulo 7. Estructuras de decisión y control 207

La industria de la computación ha prosperado enormemente desde sus inicios. La razón es


muy sencilla: las computadoras son útiles para las empresas y los individuos.
Todos sabemos que las organizaciones llevan a cabo actividades, y deben hacerlo en un
tiempo determinado, con una precisión determinada y utilizando una cantidad de recursos
determinados. Calcular lo que cuesta desarrollar las actividades —como procesar una or-
den de compra o mantener actualizado un inventario— implica calcular los costos de ope-
ración de la organización.
Para ser más precisos, podemos decir que una actividad está formada por procesos especí-
ficos, a los que llamamos transacciones, y que dichas transacciones tienen un costo que
puede reducirse mejorando los procesos implicados.
Una de las grandes ventajas de la computación es la automatización de procesos, que per-
mite desarrollar las actividades de las organizaciones de la manera más rápida y precisa
posible, realizando de manera automática aquellas partes de la actividad que pueden ser
programadas. La automatización reduce los costos de operación, pues las transacciones
pueden desarrollarse de manera más barata. ¿Imagina lo que costaría a las aerolíneas man-
tener el control de las reservaciones si no dispusieran de sistemas computarizados?
Automatizar una actividad es costoso, pero el ahorro que se tiene con la suma de los aho-
rros por cada transacción realizada nos lleva a recuperar la inversión aplicada al desarrollo
de sistemas. Del dinero que la automatización ayuda a ahorrar a las organizaciones recibi-
mos el sueldo muchos desarrolladores; la programación seria no es un pasatiempo: es un
trabajo que debemos mantener siempre rentable.
Actualmente, los programas de cómputo realizan las tareas repetitivas que antes hacíamos
manualmente, agregándoles rapidez y exactitud, y reduciendo los costos. Gracias a esto,
las personas disponen de tiempo para realizar otras tareas no automatizadas, lo que permi-
te un mejor aprovechamiento de los recursos humanos.
En materia de informática, las transacciones se ejecutan a través de secuencias de líneas de
código. Como desarrolladores debemos ser capaces de instruir a la computadora para que
realice las transacciones correctamente y decida correctamente el curso de las actividades
a partir de los datos de entrada. Además, debemos estructurar el código para la realización
de tareas repetitivas evitando duplicar código de manera innecesaria.

7
Estructuras de decisión
Las estructuras de decisión son estructuras del lenguaje que permiten decidir qué líneas de
código se han de ejecutar, dependiendo de una condición determinada.
208 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Estatuto If Then Else (condicional)

El estatuto condicional (If) ejecutará instrucciones dependiendo del valor de una condi-
ción que deriva en una expresión lógica (dato de tipo Boolean).
Como If tiene muchas variantes, examinaremos varias de las sintaxis que emplea.
He aquí la más sencilla:

If ExpresiónLógica Then Instrucción

Donde If es el inicio de la estructura de decisión, ExpresiónLógica es la expresión de ti-


po Boolean que determina la ejecución de Instrucción, que en este caso puede constar de
sólo una sola instrucción, por ejemplo:

If Precio < CreditoDisponible Then Cargo = “Aprobado”

Sólo en caso de que ExpresiónLógica derive en un valor de True, Instrucción será ejecu-
tada; es decir, esta sintaxis de If produce la ejecución sólo en el caso afirmativo de la con-
dición.
Esta forma de If es muy útil para asignar valores a las variables en caso de que una con-
dición se cumpla.
Un bloque de código es un conjunto de líneas de código que tienen su propio alcance
de ejecución y que está siempre delimitado. Si la ejecución de un bloque de código depende
del cumplimiento de una condición, es necesario que se delimite la estructura de decisión;
el bloque de código será entonces todo lo que se encuentre entre el estatuto If y el estatu-
to End If.

If ExpresiónLógica Then
Instrucciones
End If

Donde If es el inicio de la estructura de decisión, End If es el fin de la estructura de de-


cisión, y todas las Instrucciones que se encuentran entre el inicio y el fin constituyen el blo-
que de código que es controlado por la condicional. ExpresiónLógica es la expresión de ti-
po Boolean que determina la ejecución de Instrucciones, que en este caso puede constar
de una sola instrucción o de muchas.
Capítulo 7. Estructuras de decisión y control 209

Sólo en caso de que ExpresiónLógica derive en un valor de True, Instrucciones será ejecu-
tada; esta sintaxis de If controla sólo la ejecución en el sentido afirmativo de la condición.
Por ejemplo:

If Precio < CreditoDisponible Then


Cargo = “Aprobado”
CreditoDisponible -= Precio
End If

If es un estatuto de bloque, por lo que si inicia un bloque tendrá que concluirse apropia-
damente. Un error muy común es abrir estructuras de decisión pero no cerrarlas; para evi-
tarlo, es muy útil organizar el código dando a las líneas de inicio y fin de la estructura de
decisión una alineación tabulada distinta a la del bloque de código controlado por dicha es-
tructura. Vea los ejemplos: If y End If nunca tienen el mismo margen izquierdo que el
bloque de código que controlan. No trate de ser original al respecto, pues con ello sólo lo-
grará que la gente se dé cuenta que es un programador novato y poco organizado.
Es posible hacer que If controle al mismo tiempo la ejecución en el sentido afirmativo y
en el sentido negativo, a través de la especificación Else. Vea la sintaxis:

If ExpresiónLógica Then
InstruccionesAfirmativo
Else
InstruccionesNegativo
End If

Donde If es el inicio de la estructura de decisión, End If es el fin de la estructura de de-


cisión, y todas las Instrucciones que se encuentran entre el inicio y el fin constituyen el blo-
que de código controlado por la condicional. El bloque de código del estatuto está dividi-
do en dos bloques menores: uno que se ejecutará sólo si ExpresiónLógica es True
(InstruccionesAfirmativo) y otro que se ejecutará sólo si ExpresiónLógica es False (Ins-
truccionesNegativo). Por ejemplo:

If Precio < CreditoDisponible Then


Cargo = “Aprobado”
CreditoDisponible -= Precio
Else 7
Cargo = “Denegado”
End If
210 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Donde ExpresiónLógica es la expresión de tipo Boolean que determina ejecución de Ins-


truccionesAfirmativo o InstruccionesNegativo.
Esta sintaxis de If controla la ejecución en el sentido afirmativo o en el sentido negativo
de la condición. Como puede intuirlo, siempre se ejecutará algo.

Select Case

Select Case es una estructura de decisión que permite ejecutar procesos mutuamente ex-
cluyentes en función de comparaciones realizadas sobre un mismo valor de referencia. Su
sintaxis es la siguiente:

Select Case ExpresiónAEvaluar


Case {Condición | Else}
Instrucciones
End Select

Donde ExpresiónAEvaluar es una expresión de cualquier tipo que será tomada como refe-
rencia. Condición sirve para especificar una condición relacionada con ExpresiónAEvaluar
que, en caso de presentarse, disparará la ejecución de Instrucciones. Se va construyendo
un árbol de decisión basado en ExpresiónAEvaluar. Se pueden agregar tantas sentencias
Case como se deseen; incluso es posible anidar las estructuras Select Case.

Si al momento de evaluar Condición, un determinado valor de ExpresiónAEvaluar cumple


en dos casos, se ejecutará para el primero que se encuentre. Case Else se aplica cuando
el valor de ExpresiónAEvaluar no cumple para ninguno de los casos anteriores dentro de
la estructura.
Para entender cómo funciona este estatuto, imagínese la siguiente situación hipotética:
Una compañía tiene 35 categorías de empleados; cada categoría tiene un ingreso determi-
nado y las categorías de número más alto son las de mayor ingreso; existe una relación di-
rectamente proporcional entre categoría y sueldo.
Se acaba de autorizar un aumento de sueldo general en la compañía, de acuerdo con las
siguientes políticas: el personal de alto nivel (categoría superior a 19) no tendrá aumen-
to; las categorías 18, 17 y 14 recibirán el 15% de aumento; de la categoría 8 a la 13, re-
cibirán el 10% de aumento, a excepción de la categoría 10, que es la categoría más reza-
gada con respecto al salario: ésta recibirá el 25%. Al resto del personal se le dará un 5%
de aumento.
Capítulo 7. Estructuras de decisión y control 211

¿Cómo se codificaría una estructura Select Case que atendiera esta necesidad? Veamos:

Select Case Categoria


Case Is > 19
Aumento = 0
Case 18, 17, 14
Aumento = 0.15
Case 10
Aumento = 0.25
Case 8 To 13
Aumento = 0.1
Case Else
Aumento = 0.5
End Select

Es importante notar que todas las condiciones giran alrededor de la expresión a eva-
luar (en nuestro ejemplo, Categoria): si no hacen uso de dicha expresión, no son
consideradas. Usted podría agregar como instrucción una condición Case que se re-
suelva True, pero que no involucre a Categoria; en ese caso, el código dependiente
de dicho Case nunca se ejecutará.

Estructuras de control
Son estructuras de control, llamadas también bucles, aquellos elementos del lengua-
je que permiten la ejecución de una o más líneas de código de manera repetida.
Mediante las estructuras de control se puede repetir la ejecución de líneas de código:
❑ Un determinado número de veces
❑ Hasta que una condición sea verdadera (True)

❑ Mientras que una condición sea falsa (False)

❑ Una vez por cada elemento de una colección


A continuación, podrá analizar los elementos del lenguaje que permiten codificar ca-
da una de estas variantes.

For Next 7
For Next repite la ejecución de un bloque de código un número determinado y
conocido de veces. For Next se apoya en una variable que recibe el nombre de con-
tador, que se incrementa o reduce de valor, en intervalos también regulares y cono-
cidos. Su sintaxis es la siguiente:
212 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

For Variable = ValorInicial To ValorMáximo [Step Incremento]


Instrucciones
Next [Variable]

Donde Variable es una variable de memoria de tipo entero que permitirá controlar
las repeticiones del proceso. ValorInicial es el valor inicial a partir del cual el incre-
mento o decremento se llevará a cabo. ValorMáximo es el valor al cual el contador
podrá llegar. Incremento es la constante entera que marcará la cantidad de incremen-
to o decremento que sufrirá Variable en cada repetición del proceso. Vea los siguien-
tes ejemplos:

‘ Cuenta del 1 al 10
For i = 1 To 10
Console.WriteLine(i)
Next i

‘ Serie del 5
For i = 0 To 50 Step 5
Console.WriteLine(i)
Next i

‘ Decremento del 10 al 1
For i = 10 To 1 Step –1
Console.WriteLine(i)
Next i

Si se omite la especificación Step, se da a Incremento el valor de 1 positivo; si In-


cremento es negativo, se habla de un decremento en términos reales.
Una instrucción que puede ser útil en el caso de utilizar For Next es Exit For, que
interrumpe la ejecución del For como si ya hubiese cumplido todas las repeticiones
exigidas.

While

While ejecuta un bloque de código un número infinito de veces mientras una con-
dición al inicio del bloque se cumpla (True). Su sintaxis es la siguiente:

While ExpresiónLógica
Instrucciones
End While
Capítulo 7. Estructuras de decisión y control 213

Por ejemplo:

Dim Prueba As Byte = 0


While Prueba < 255
Console.WriteLine(Prueba)
Prueba += 1
End While

Donde ExpresiónLógica es un valor de tipo Boolean (True/False), casi siempre una com-
paración que de ser verdadera al inicio del ciclo de ejecución provoca la ejecución de Ins-
trucciones.
Como recordará, el tipo de datos Byte puede almacenar valores desde 0 a 255, exclusiva-
mente; en nuestro ejemplo, While ejecutará un incremento de 1 para la variable Prueba
mientras sea menor a 255. Si dejáramos que el ciclo fuera más allá de 255, el programa ge-
neraría un error, pues es imposible que una variable de tipo Byte asuma un valor fuera de
su rango.
Al igual que For Next, While tiene una sentencia para interrumpir en cualquier momen-
to el proceso: Exit While.
Una de las formas más útiles de While es el ciclo infinito, en donde ninguna operación o
variable dentro del proceso influye en la condición que gobierna la estructura. Simple y lla-
namente, se proporciona el valor de True como ExpresiónLógica y no hay forma que deje
de ejecutarse el ciclo.

While True
Instrucciones
End While

Por ejemplo:

While True
Console.WriteLine(“Qué número estoy pensando”)
If Console.ReadLine() = 8 Then
Console.WriteLine(“Efectivamente: 8”)
Exit While
7
End If
End While
214 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En este caso, es indispensable que especifique en su programa alguna condición para eje-
cutar Exit While ya que, de otra manera, nunca concluirá su ejecución. En el ejemplo que
pusimos, mientras no teclee 8, el programa seguirá pidiendo números.

NOTA
Puede ser que su programa tenga un detalle que impida ejecutar Exit While en un ciclo infi-
nito; recuerde que siempre puede detener la ejecución de un proceso presionando la combi-
nación de teclas Ctrl-Intro o Esc.

Do Loop

Do Loop ejecuta un bloque de código un número infinito de veces, hasta que una condi-
ción se cumpla (True). Esta instrucción brinda más flexibilidad que While, en el sentido de
que se puede controlar la evaluación de las condiciones al inicio o al final de la estructura.
Usando Do Loop se pueden crear estructuras que se ejecuten al menos una vez, de una for-
ma más sencilla que utilizando While.
Su sintaxis es la siguiente:

‘ Evaluación al inicio

Do {While/Until} ExpresiónLógica
Instrucciones
Loop

‘ Evaluación al final

Do
Instrucciones
Loop {While/Until} ExpresiónLógica

donde ExpresiónLógica es un valor de tipo Boolean (True/False), que casi siempre es


una comparación. Instrucciones son las instrucciones que se controlan en el bucle.
Si se utiliza Do con While (mientras), el ciclo se repite hasta que ExpresiónLógica sea falsa.
Si se utiliza Do con Until (hasta), el ciclo se repite hasta que la condición sea verdadera.
Sólo se puede implementar While o Until, pero no ambas. También tiene que decidir si la
evaluación de las condiciones es al inicio o al final de la estructura, pero no ambas. Por
ejemplo:
Capítulo 7. Estructuras de decisión y control 215

i = 0
Do While i <= LimiteMaximo
WriteLine(i)
i += 1
Loop

i = 0
Do Until i > LimiteMaximo
WriteLine(i)
i += 1
Loop

i = 0
Do
WriteLine(i)
i += 1
Loop While i <= LimiteMaximo

i = 0
Do
WriteLine(i)
i += 1
Loop Until i > LimiteMaximo

Do tiene una sentencia para interrumpir en cualquier momento el proceso: Exit Do.

Estructuras envolventes y anidadas


Las estructuras, sean de decisión o de control, pueden contener otras estructuras. A una es-
tructura que contiene a otras estructuras se le llama estructura envolvente; la estructura que
está dentro de otra se llama estructura anidada. Todas las estructuras que se han visto en el
capítulo, sin importar su tipo, pueden anidarse o ser envolventes; es decir, resolverse una
dentro de otra.

Reglas para el anidado de estructuras

Las únicas reglas que debe tomar en cuenta son:


❑ Las estructuras tienen un inicio y un fin; asegúrese de cerrar todas las estructuras que 7
abra.
❑ Se recomienda programar de tal manera que las estructuras que se abran se cierren lo
más pronto posible.
216 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ La última estructura en abrirse debe ser la primera en cerrarse.

❑ En el caso de estructuras, las variables de tipo entero se resuelven de manera más rápi-
da que cualquier otro tipo de dato.
Los problemas más comunes relacionados con las estructuras anidadas (y su solución) son:
❑ No terminar lo que se inicia.

Problema Solución
If Condición Then If Condición Then
Instrucciones Instrucciones
End If

❑ No iniciar lo que se termina.

Problema Solución
For Variable = 0 to 10
Instrucciones Instrucciones
Next Variable Next Variable

❑ Utilizar las mismas variables que controlan el proceso.

Problema Solución
For Variable = 0 to 10 For Variable = 0 to 10
For Variable = 0 to 5 For Variable_1 = 0 to 5
Instrucciones Instrucciones
Next Variable Next Variable_1
Next Variable Next Variable

❑ No terminar primero la última estructura que se inició.

Problema Solución
For Variable = 0 to 10 For Variable = 0 to 10
If Condición Then If Condición Then
Instrucciones Instrucciones
Next Variable End If
End If Next Variable
Capítulo 7. Estructuras de decisión y control 217

Ejercicio 7.1
Uso de estructuras de decisión

En este ejercicio se utilizará una aplicación de consola para comprobar las estructuras de deci-
sión. Se parte del supuesto que usted indicará al programa cuánto cuesta un producto que desea
comprar, así como el tipo de membresía que tiene en la tienda donde desea comprarlo. A cada
tipo de membresía se le aplica un determinado descuento que será informado por el programa.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Descuento.
3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Descuento - Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9
10 Dim Precio As Double
11 Dim FactorDesc As Decimal
12
13 Write (“Precio del producto:”)
14 Precio = CDbl(ReadLine())
15
16 If Precio = 0 Then
17 WriteLine(“Nada que calcular”)
18 Else
19 WriteLine(“Membresía:”)
20 WriteLine(“1.- Diamante”)
21 WriteLine(“2.- Premium”)
22 WriteLine(“3.- Clásica”)
23 Write(“¿Qué membresía tiene?:”)
24 FactorDesc = CDec(ReadLine())
25
26
Select Case FactorDesc
Case Is = 1
7
27 FactorDesc = 0.2D
28 Case Is = 2
29 FactorDesc = 0.16D
30 Case Is = 3
31 FactorDesc = 0.1D
218 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

32 Case Else
33 FactorDesc = 0
34 End Select
35 Write(“Precio para usted:”)
36 WriteLine(Precio - (Precio * FactorDesc))
37 End If
38
39 Write(“Presione INTRO para continuar”)
40 ReadLine()
41
42 End Sub
43
44 End Module

Ejecución guiada de Descuento – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realiza-
do en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (tecla F5).
5. Las líneas 1 y 2 hacen de este programa un programa type safe. En las líneas 10 y 11 se
declaran las variables de trabajo.
6. Cuando el programa solicite el precio (líneas 13 y 14), proporcione el valor 0. Vea en el
código cómo se utiliza CDbl(), para hacer de lo capturado un dato Double, y evitar erro-
res, dado que el programa es type safe y no permite conversiones tipo cast (línea 14).
En la línea 16 vemos la primera estructura de decisión del programa, que controla la eje-
cución del programa en el sentido afirmativo y en el sentido negativo.
En el sentido afirmativo, se ejecutará el bloque de código que va de la línea posterior al
inicio de la estructura (línea 9), hasta la línea anterior al Else o End If (línea 17), que
dan por concluido el bloque.
En el sentido negativo, se ejecutará el bloque de código que va de la línea posterior al El-
se (línea 19), hasta la línea anterior al End If (línea36), que da por concluido el bloque.

Como se proporcionó el valor de cero, la condición que gobierna la ejecución del If se


cumple en el sentido afirmativo (Precio = 0 es True), y al encontrar el Else, pasa a
ejecutar la línea 30; vea que el bloque en el sentido negativo es ignorado completamente.
Capítulo 7. Estructuras de decisión y control 219

Si todo ocurrió como se esperaba, la salida será la siguiente.

Precio del producto: 0


Nada que calcular
Presione INTRO para continuar

7. Ejecute la aplicación nuevamente. Cuando le solicite el precio, proporcione el valor


2000. Cuando le solicite el tipo de membresía, proporcione el valor 2.
Como se proporcionó el valor 2000, la condición que gobierna la ejecución del If se
cumple en el sentido negativo (Precio = 0 es False), y se procede a ejecutar el blo-
que en el sentido negativo.
En la línea 24 se recibe el valor 2, que es asignado a FactorDesc; en la línea 25 se es-
pecifica FactorDesc como valor de referencia para las comparaciones Select Case que
se encuentran en las líneas 26, 28 y 30; en caso de que no se cumpla ninguna de las an-
teriores, se ejecuta la línea 32.
Como el valor de FactorDesc es 2 (Is = 2), se procede a ejecutar el bloque de có-
digo correspondiente al cumplimiento de esa condición; en otras palabras, se ejecuta la
línea 29. Vea cómo se agrega la literal D al valor para indicarle al programa que el valor
es Decimal (de lo contrario podría asumirse otro tipo de dato, y ante la imposibilidad de
conversiones cast, se produciría un error). También se podría haber resuelto el proble-
ma utilizando la función CDec(). Concluida la ejecución del bloque de código corres-
pondiente a la condición que se cumplió, se envía el control del programa a la línea pos-
terior a la terminación de la estructura (End Select); es decir, se ejecuta la línea 35 y
hacia adelante, para desplegar el precio después de aplicar el factor de descuento que co-
rresponde al tipo de membresía seleccionada.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Precio del producto: 2000


Membresía:
1.- Diamante
2.- Premium
3.- Clásica
¿Qué membresía tiene?: 2
Precio para usted:
1680
Presione INTRO para continuar
7
Si hubiéramos especificado un tipo de membresía que no fuera 1, 2 o 3, el programa hu-
biera ejecutado la línea 32, que corresponde a la condición Case Else; es decir, la que
corresponde a cuando ninguna de las otras condiciones se cumple.
220 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

8. Guarde todos los cambios en su solución.


FIN DEL EJERCICIO*

Ejercicio 7.2
Uso de For Next

En este ejercicio se utilizará una aplicación de consola para comprobar el funcionamiento


de For Next.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Repite.
3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Repite - Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Dim LimiteMaximo As Integer = 4
11 Dim LimiteMinimo As Integer = 0
12 Dim i As Integer
13
14 WriteLine(“Mostrando con For Next incremental”)
15 For i = LimiteMinimo To LimiteMaximo
16 WriteLine(i)
17 Next i
18
19 WriteLine(“Muestra usando For Next invertido”)
20 For i = LimiteMaximo To LimiteMinimo Step –1
21 WriteLine(i)
22 Next i
23
24 WriteLine(“Mostrando con While”)
25 i = 0
26 While i <= LimiteMaximo
Capítulo 7. Estructuras de decisión y control 221

27 WriteLine(i)
28 i += 1
29 End While
30
31 WriteLine(“Muestra usando Do Loop inicial While”)
32 i = 0
33 Do While i <= LimiteMaximo
34 WriteLine(i)
35 i += 1
36 Loop
37
38 WriteLine(“Muestra usando Do Loop inicial Until”)
39 i = 0
40 Do Until i > LimiteMaximo
41 WriteLine(i)
42 i += 1
43 Loop
44
45 WriteLine(“Muestra usando Do Loop final While”)
46 i = 0
47 Do
48 WriteLine(i)
49 i += 1
50 Loop While i <= LimiteMaximo
51
52 WriteLine(“Muestra usando Do Loop final Until”)
53 i = 0
54 Do
55 WriteLine(i)
56 i += 1
57 Loop Until i > LimiteMaximo
58
59 Write(“Presione INTRO para continuar”)
60 ReadLine()
61 End Sub
62
63 End Module

Ejecución guiada de Repite – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realiza-
7
do en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (F5).
222 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5. En las líneas 10 a la 12 se declaran variables de trabajo que ayudarán a visualizar de una


mejor forma el funcionamiento de los bucles. Todas las estructuras hacen lo mismo, con
las siguientes particularidades:
a) For Next se encarga de incrementar un contador de forma automática.
b) Todas las demás estructuras deben apoyarse en un contador implementado ma-
nualmente (i +=1), que en caso de olvidarse puede provocar un ciclo infinito.
c) Las estructuras Until se ejecutan hasta que se cumple por primera vez la condición.
d) Las estructuras While se ejecutan mientras la condición sigue siendo verdadera.
Si todo transcurrió bien, la pantalla mostrará lo siguiente:

Mostrando con For Next incremental


0
1
2
3
4
Muestra usando For Next invertido
4
3
2
1
0
Mostrando con While
0
1
2
3
4
Muestra usando Do Loop inicial While
0
1
2
3
4
Muestra usando Do Loop inicial Until
0
1
2
3
4
Muestra usando Do Loop final While
0
1
2
3
Capítulo 7. Estructuras de decisión y control 223

4
Muestra usando Do Loop final Until
0
1
2
3
4
Presione INTRO para continuar

6. Modifique las asignaciones de las líneas 25, 32, 39, 46 y 53. En lugar de asignar 0, asig-
ne 10. Se proporciona ese valor porque no es válido para las condicionales While y Un-
til del programa. Compruebe cómo las estructuras con evaluación al final se ejecutan
al menos una vez. Si todo transcurrió bien, la pantalla mostrará lo siguiente:

Mostrando con For Next incremental


0
1
2
3
4
Muestra usando For Next invertido
4
3
2
1
0
Mostrando con While
Muestra usando Do Loop inicial While
Muestra usando Do Loop inicial Until
Muestra usando Do Loop final While
10
Muestra usando Do Loop final Until
10
Presione INTRO para continuar

➤ Adición de tareas a Task List

7. Hay una herramienta en Visual Studio que permite crear y administrar tareas con el fin
de no olvidar pendientes relacionados con el desarrollo en el que participamos. Esta he-
rramienta tiene el nombre de Task List. 7
8. En Task List se pueden manejar dos categorías de registros: tareas de usuario y comen-
tarios de tarea. Las tareas de usuario son tareas que el usuario registra, estableciéndo-
les prioridad (alta, media, baja) y un indicador de estado, que marca si la tarea ya ha si-
do concluida (completed). Los comentarios de tarea son comentarios en el código que
224 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

tienen significado para Visual Studio, y que producen un registro en Task List. Estos
comentarios de tarea son: TODO, para señalar cosas por hacer; HACK, para anotar recor-
datorios de cosas relacionadas con el desarrollo; y UNDONE, para deshacer cosas que
temporalmente se colocaron pero que hay que eliminar antes de liberar el programa en
producción.
9. Para ver Task List es necesario seleccionar la opción View – Task List (oprima las te-
clas CTRL-\, CTRL-T). Con ello aparecerá la ventana Task List.

FIGURA 7.1
Task List

10. En Task List seleccione en el cuadro de lista Categories la categoría User Tasks.
Haga clic en el icono Create Task User. Se agregará una tarea de forma automática.
11. En descripción escriba Enviar por correo electrónico a un amigo. En la misma lí-
nea de la tarea, haga clic en la columna de prioridad, con lo que aparecerán las diferen-
tes prioridades que se pueden asignar a una tarea.
Capítulo 7. Estructuras de decisión y control 225

> Lo nuevo
En Visual Studio 2005 Task List permite desplegar varias líneas de texto en cada fila, el orde-
namiento basado en una o varias columnas, y cambiar la posición de las columnas de acuer-
do con los gustos del desarrollador.

➤ Adición de comentarios de tarea a un programa

12. En la línea anterior, en donde se inicia la comprobación de While (línea 24), agregue
el siguiente comentario:

‘TODO Cambiar los 10 por ceros, para que funcione normalmente.

13. Agregar un comentario reconocido por Visual Studio (TODO / HACK / UNDONE)
agrega un registro a Task List, en donde se especifica el archivo y la línea en la que
se realizó la anotación.

14. En Task List haga doble clic sobre el comentario que acaba de agregar y vea cómo el 7
control del programa se traslada a donde se encuentra el comentario.
15. Guarde todos los cambios en su solución.
226 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 5.1
Identificación de errores en estructuras anidadas

En este ejercicio analizará el código que se proporciona, y explicará cuáles son los erro-
res que se presentan (si los hay). Si no hay problemas, indíquelo en su respuesta.
1)

If Edad > 18 Then


If Registro = True Then
Autorizacion = True
End If

2)

If Edad > 18 Then


If Registro = True Then Autorizacion = True
End If

3)

For i = 1 to 10
x *= i
If x > 30 Then
Console.WriteLine(“Límite de treinta o más”)
Exit For
Next i
End If

FIN DEL EJERCICIO*


Capítulo 7. Estructuras de decisión y control 227

MAPA MENTAL DEL CAPÍTULO

7
228 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Bloque de código, 208 For, 212


Bucles, 211 While, 213
Case Else, 210 ExpresiónLógica, 208
Do Loop, 214 For Next, 211
Else, 209 If, 208
Estatuto condicional, 208 Instrucciones, 208
Estructura(s) Select Case, 210
anidada, 215 Step, 212
de control, 211 Task List, 223
de decisión, 207 While, 212
envolvente, 215
Exit
Do, 215

PREGUNTAS
7.1 ¿Cuáles son las estructuras de decisión más importantes y cuál es la sintaxis de ca-
da una de ellas?

7.2 ¿Cuáles son las estructuras de control más importantes y cuál es la sintaxis de cada
una de ellas?

7.3 ¿En qué casos es más recomendable utilizar Do Loop que While?

7.4 ¿Cuáles son las reglas que se aplican al anidado de estructuras?


Capítulo 7. Estructuras de decisión y control 229

Notas:

7
230 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Son estructuras que permiten decidir qué líneas de código se han de ejecutar:
a) Estructuras de decisión
b) Estructuras condicionales
c) Estructuras lógicas

2. Es un conjunto de líneas de código que tienen su propia identidad de ejecución:


a) Procedimiento
b) Bloque de código
c) Transacción

3. Es la estructura ideal para cuando se han de ejecutar procesos mutuamente excluyentes, dependien-
do de un valor determinado:
a) If
b) For
c) Select Case

4. Es la estructura óptima cuando se conoce con certeza el número de iteraciones de un proceso:


a) While
b) For Next
c) Select Case

5. Tipo de estructura que se presenta cuando una estructura se encuentra dentro de otra:
a) Estructuras anidadas
b) Grupo de estructuras
c) Jerarquía de estructuras

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. If utiliza una expresión lógica para decidir la ejecución de código en sentido afirma-
tivo o negativo.

7. Las estructuras de control son conocidas también como bucles.

8. Select Case es una estructura de control.

9. Con While se pueden generar ciclos infinitos.

10. La última estructura en abrirse debe ser la primera en cerrarse.


CAPÍTULO 8
Manejo estructurado
de excepciones
Objetivos: Aprenderá la forma de manejar errores y excepciones en .NET.

1. Aprenderá cuál es la diferencia entre errores y excepciones.


2. Aprenderá a manejar excepciones, utilizando el bloque Try Catch
Finally.
3. Aprenderá a filtrar de manera específica las excepciones, a fin de con-
trolar las respuestas de las aplicaciones frente a imprevistos.
4. Aprenderá a disparar excepciones generadas por el usuario

231
232 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Errores y Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Manejo estructurado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Try...Catch...Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Clase System.Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Uso de Try Catch Finally y de las propiedades de la clase
System. Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
➤ Despliegue de errores en tiempo de diseño usando
Error List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Calificadores de excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Objeto Err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Tipos de filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Lanzamiento de excepciones propias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Lanzamiento de excepciones definidas por el usuario . . . . . . . . 246
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Capítulo 8. Manejo estructurado de excepciones 233

Un buen programador no es el que conoce todas las estructuras y funciones del lenguaje,
sino aquel que garantiza la solución de los problemas a través de los programas que desa-
rrolla.
8
El desarrollo de aplicaciones, como toda actividad humana, es perfectible. Usted no debe
preocuparse si sus programas presentan problemas en la primera compilación: resulta to-
talmente normal que un programa falle. Lo que no es normal es que desconozcamos cómo
manejar las fallas de una manera lógica y estructurada que nos ayude a reducir el número de
problemas hasta límites aceptables.
La psicología indica que la madurez de una persona se mide por su capacidad de solucionar
por sí misma sus propios problemas. Esta afirmación general se aplica al caso particular del
desarrollo de programas: es un programador maduro el que sabe resolver problemas.

Errores y Excepciones
Los errores son acciones u omisiones relacionadas con el proceso de desarrollo que pro-
ducen comportamientos inesperados en el programa resultante.
Por otro lado, existe un concepto denominado excepción, que es una violación a las reglas
sintácticas o de alcance de un lenguaje de programación.
Las excepciones pueden ser excepciones de software, si están relacionadas con una mala
aplicación del lenguaje, o con la asignación de valores fuera de dominio a propiedades o
argumentos; también pueden ser excepciones de hardware, cuando su origen tiene que ver
con la falla o saturación de un dispositivo físico: el programa puede estar correcto, pero
¿cómo escribir información en un disco que está lleno, por ejemplo?
Una excepción siempre es un error, debido a que el resultado obtenido no es el deseado,
pero un error no siempre es una excepción; las excepciones por lo general interrumpen la
ejecución de un programa, mientras que los errores pueden pasar desapercibidos para el
compilador del lenguaje.
Si un desarrollador entendió mal las especificaciones de un programa —una fórmula arit-
mética, por ejemplo—, es probable que codifique correctamente una fórmula que no es co-
rrecta; el programa no reportará errores en tiempo de compilación o ejecución, pero sin du-
da alguna generará resultados equivocados. El programa se compilará sin problemas, no
tendrá excepciones, pero sí generará errores.
Se concluye entonces que los errores tienen un universo más amplio de manifestaciones;
las excepciones, en cambio, tienen un campo más reducido: el del uso inadecuado del len-
guaje, manejo inadecuado de dominios o problemas de hardware.
234 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En términos llanos, hay que temerle más a los errores que a las excepciones, ya que las ex-
cepciones son un aspecto totalmente manejable en Visual Basic.

NOTA
Visual Studio brinda una excelente asistencia durante el proceso de desarrollo para reducir el
número de fallas en los programas. Prácticamente se anticipa al programador en la detección
de las excepciones; las únicas excepciones que ocurren en tiempo de ejecución son aquellas
relacionadas con la asignación de valores inadecuados o fuera de rango a variables, argumen-
tos, o propiedades. Las demás son detectadas en el editor de código (excepto algunas excep-
ciones de hardware, que es posible detectar sólo hasta el momento de ejecución).

Manejo estructurado de excepciones


Desde sus inicios, Visual Basic había manejado los errores a través del objeto Err. El manejo
de errores era no estructurado: era difícil leer, depurar y mantener el código. Los saltos en
el código no eran lo más apropiado para el modelo de programación estructurada, ya que
la secuencia de los procesos se perdía.
El manejo estructurado de excepciones (SEH/Structured Exception Handling) es la capa-
cidad que tiene un lenguaje para permitir manejar excepciones a través de una estructura
de control que “protege” porciones localizadas de código, de manera lógica y consistente,
sin perder nunca la secuencia de los procesos.
Algunas de las ventajas del manejo estructurado de excepciones son las siguientes:
❑ El manejo estructurado de excepciones permite delimitar claramente los bloques de có-
digo a proteger y determinar qué errores se espera que se produzcan.
❑ El flujo de ejecución es más sencillo de seguir, ya que no existen saltos en la ejecución
del código.
❑ Las estructuras para el manejo de excepciones se pueden anidar, ofreciendo mayor con-
trol al manejo de excepciones.
Capítulo 8. Manejo estructurado de excepciones 235

Try...Catch...Finally
8
Se puede implementar el manejo estructurado de excepciones a través del estatuto Try-
...Catch...Finally.
Bloque para
el manejo
Su sintaxis es la siguiente:
estructurado de
excepciones Try
Código a ser protegido
Catch
Define el tipo de excepción a capturar y la acción
que deberá tomarse
[Finally
Define acciones que podrán ser ejecutadas de
manera opcional]
End Try

Bloque Try

Éstas son las particularidades del bloque Try ... End Try:

❑ Delimita el área de código en donde puede suceder una excepción.

❑ El código escrito dentro del bloque Try se considera código protegido.

❑ Si ocurre una excepción, el proceso se transfiere al bloque Catch, que contendrá el có-
digo que queremos ejecutar dado el caso.
❑ Se puede utilizar Exit Try para salir en cualquier instante del bloque de código prote-
gido, continuando el flujo del programa después del End Try.

Bloque Catch

Si una excepción sucede en el bloque Try, la ejecución de dicho programa se suspende y


continúa al principio del bloque Catch.
Estos bloques son una serie de estatutos que comienzan con la palabra reservada Catch, se-
guida de un tipo determinado y reconocido de excepción, así como la acción que deberá
realizarse en caso de que la excepción sea detectada. Estas son las particularidades del blo-
que Catch:
236 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ Se puede utilizar uno o varios bloques Catch para manejar las excepciones.

❑ Se recomienda manejar de manera separada las excepciones que provoquen acciones


distintas, a fin de mantener la secuencia lógica del programa.
❑ Es posible capturar excepciones predefinidas en .NET Framework, o bien crear nuestras
propias excepciones.
❑ Se puede utilizar el estatuto When para comparar una excepción que ocurre con aquellas
reconocidas por .NET Framework, utilizando para ello el número único de excepción.

Bloque Finally

El bloque Finally se ejecuta después del bloque Try, en caso de que no ocurran excepcio-
nes, o después del bloque Catch correspondiente, en caso de que sí haya sucedido una ex-
cepción.
Este bloque es opcional en su definición, pero no en su ejecución; si se define un bloque
Finally, éste se ejecutará siempre.
El uso más común de Finally es liberar objetos o cerrar archivos después de que una ex-
cepción ha sucedido. En cierta forma, es lo mismo declarar Finally que escribir código
fuera de Try.
Aunque Finally es opcional, recomendamos su utilización pues aclara el código y permi-
te la implantación de un manejo verdaderamente estructurado: primero a) se define qué se
hace, luego, b) se define qué hacer si hay excepciones, y finalmente, c) se define qué ocu-
rre después, hayan ocurrido o no excepciones.
Si en el código protegido por Try no ocurren excepciones, el control del programa hace ca-
so omiso del bloque Catch, para pasar directamente a la ejecución de Finally.

Clase System.Exception

Visual Basic maneja las excepciones a través de la clase System.Exception. Recuerde que
en Visual Basic todo es objeto, incluyendo una excepción que es capturada.
Una sintaxis común de Catch es la siguiente:

Catch VariableExcepción As System.Exception

En caso de que ocurra una excepción en el bloque de código protegido, el control del pro-
grama pasa a la línea Catch, se capturará la excepción y se almacenará en una instancia de
la clase System.Exception que se declara en la misma línea Catch.
Capítulo 8. Manejo estructurado de excepciones 237

En nuestro ejemplo, VariableExcepción sería la variable objeto en donde estaría almacena-


da la información del problema ocurrido.
8
En su calidad de objeto, VariableExcepción tendría las propiedades y los métodos de la cla-
se que le dio origen, es decir, System.Exception.
Algunas de las propiedades más relevantes de System.Exception son las siguientes:

Propiedad Descripción
Message Contiene la información de lo que causó la excepción.
StackTrace Antecedente de ejecución; muestra primeramente la línea que causó el
error (en su formato interno de ejecución), sigue con el procedimiento,
capítulo y otros datos si los hubiere. Esto permite ubicar, en el contexto
modular del programa, a la excepción.
Source Contiene el nombre de la aplicación u objeto que originó la excepción.
Puede tratarse incluso de la librería de .NET Framework que es llamada
a ejecución y que causa la excepción.
InnerException El hecho de que una excepción se presente puede dar lugar a
otras excepciones (por ejemplo, declarar mal una variable puede
provocar excepciones al utilizar dicha variable). En caso de que se
presenten excepciones anidadas, mostrará las excepciones que
se presentaron en orden de aparición.
ToString Muestra el nombre calificado de la excepción, el mensaje, el
anidamiento de excepciones y el antecedente de ejecución.

Todo esto le quedará claro al hacer el primer ejercicio.

Ejercicio 8.1
Uso de Try Catch Finally y de las propiedades de la clase System.Exception

En este ejercicio se protegerá un código determinado utilizando Try... Catch...


Finally... El programa solicita dos números (un dividendo y un divisor), y a partir de ahí
intentará una división. Deliberadamente se causará una excepción al tratar de dividir entre
cero (lo cual, como sabemos, es imposible).
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Excepcio-
nes1.

3. Edite el programa de tal forma que aparezca como sigue:


238 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Excepciones1 – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Decimal
13 Write(“Dame el dividendo:”)
14 N1 = CDec(ReadLine())
15 Write(“Dame el divisor:”)
16 N2 = CDec(ReadLine())
17 Resultado = N1 / N2
18 WriteLine(“Resultado:” & Resultado.ToString)
19 Catch eProblema As Exception
20 WriteLine(“> Origen:”)
21 WriteLine(eProblema.Source)
22 WriteLine(“> Mensaje:”)
23 WriteLine(eProblema.Message)
24 WriteLine(“> Antecedente de ejecución:”)
25 WriteLine(eProblema.StackTrace)
26 WriteLine(“> Texto completo:”)
27 WriteLine(eProblema.ToString)
28 Finally
29 Write(“Pulse INTRO para continuar”)
30 ReadLine()
31 End Try
32
33 End Sub
34
35 End Module

Ejecución guiada de Excepciones1 – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha reali-
zado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (F5).
Capítulo 8. Manejo estructurado de excepciones 239

5. Cuando se protege un bloque de código y éste no causa excepciones, se ejecutan los bloques
Try y Finally, pero no Catch (este último se ejecuta sólo en el caso de excepciones).
8
La línea 12 declara todas las variables que vamos a utilizar en nuestro programa. La lí-
nea 14 preguntará el número que actuará como dividendo (N1) y la línea 16 el que ac-
tuará como divisor (N2). La línea 17 es la que intenta la división (N1/N2), asignando
el resultado a la variable Resultado.
6. Proporcione el valor 10 como dividendo y 5 como divisor.
En nuestro ejemplo, dividir 10 entre 5 no causa ningún problema, y por tanto, el pro-
grama trasladará el control de la ejecución de la línea 18 (bloque Try) a la 28 (bloque
Finally); las líneas intermedias, que corresponden al bloque Catch, son ignoradas.

7. Ejecute la aplicación nuevamente, pero proporcione el valor 10 como dividendo y 0 co-


mo divisor. Cuando intenta resolver la línea 14, el programa determina que eso no es po-
sible, y genera una excepción. Al detectar que una excepción ha ocurrido, el control del
programa se trasladará al bloque Catch, en la línea 19.
La excepción que es capturada se almacenará como un objeto basado en System.Excep-
tion (declarada en la misma línea Catch). En nuestro caso, el objeto se llama eProblema.

Las líneas 21, 23, 25 y 27 muestran algunas propiedades importantes del objeto ePro-
blema que nos ayudarán a entender qué excepción está ocurriendo y dónde.

Después de ejecutar el código del bloque Catch, el programa ejecutará el bloque de có-
digo Finally.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Prueba de manejo de Excepciones


Dame el dividendo:10
Dame el divisor:0
> Origen:
mscorlib
> Mensaje:
Attempted to divide by zero.
> Antecedente de ejecución:
at System.Decimal.FCallDivide(Decimal& result, Decimal d1,
Decimal d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\
Excepciones1\Module 1.vb:line 17
> Texto completo:
System.DivideByZeroException: Attempted to divide by zero.
at System.Decimal.FCallDivide(Decimal& result, Decimal d1,
Decimal d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\
Excepciones1\Module 1.vb:line 17
Pulse INTRO para continuar
240 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Despliegue de errores en tiempo de diseño


usando Error List

8. Ya vimos la forma en que se pueden detectar excepciones en tiempo de depuración; lo


ideal, sin embargo, es percatarnos de las excepciones antes de ejecutar los programas.
En el caso de nuestro ejemplo el programa es correcto, pero los datos que el usuario
introduce son los que pueden causar las excepciones. Hay otros tipos de excepciones:
los errores de sintaxis —violaciones a las reglas de escritura en un lenguaje de pro-
gramación determinado—, junto con las referencias erróneas —el uso de elementos
(variables, estructuras, clases, etcétera) que no han sido declarados o que no están dis-
ponibles dentro del alcance en el cual queremos utilizarlas— son el pan de cada día
en las labores de desarrollo.
9. Hay una herramienta en Visual Studio, Error List, que permite ver los errores de sin-
taxis y las referencias erróneas en tiempo de diseño, es decir, durante la edición.
10. En Error List se muestran los errores (errors), alertas (warnings) y mensajes (messa-
ges) que se presentan en el código que estamos editando. Los errores son aquellas co-
sas que generarán la interrupción del programa en tiempo de depuración, las alertas
son aquellos detalles que si bien no interrumpen la depuración, si son prácticas inade-
cuadas de programación. Los mensajes son los mensajes informativos proporcionados
por Visual Studio, aplicables a lo que estemos editando.
11. Modifique la línea 12 de su código, cambiando el nombre de la variable N1 por N3. Al
hacer esto se generarán múltiples problemas, dado que la variable N1 es utilizada en
varias partes del programa y habrá quedado sin declararse.
12. Seleccione View – Error List (Ctrl-\, Ctrl-E) para ver la herramienta Error List.
Capítulo 8. Manejo estructurado de excepciones 241

13. En Error List se muestran los errores que contiene el programa, el archivo físico don-
de se encuentran los problemas y la línea de código en se encuentra (la línea, la colum- 8
na y el proyecto al que pertenece). En la parte superior aparecen fichas en las que se
puede seleccionar lo que queremos ver, sean errores (errors), alertas (warnings) o
mensajes (messages). En nuestro caso sólo tenemos dos errores, que son reportados en
Error List.
14. Error List mostrará los errores de toda la solución, por lo que es especialmente útil
cuando modificamos librerías. De esta forma podemos percibir los efectos que tendrán
nuestras modificaciones en otros programas que las consumen.
15. Si se hace doble clic en un error, Visual Studio trasladará el control a la posición en
donde se encontró el mismo, lo que facilita enormemente la navegación en el código.
16. Haga doble clic en el error 2. Compruebe que se ha trasladado a la línea y la posición
en donde se encontró el error.
17. Modifique la línea 12 de su código, y corrija el nombre de la variable que está ocasio-
nando el problema. Cambie N3 por N1.
18. Guarde los cambios realizados en su solución.
FIN DEL EJERCICIO*

Filtrado de excepciones
Visual Basic proporciona mucha flexibilidad en el manejo de excepciones: posibilita tener
rutinas genéricas, o bien, atender las excepciones de manera particular. También es posible
seguir utilizando el objeto Err, que se utilizaba en versiones anteriores de Visual Basic.

Calificadores de excepción

Los calificadores de excepción son los nombres reconocidos internamente por .NET para
cada una de las excepciones que pueden ocurrir. Generalmente, el calificador de excepción
proporciona una muy clara idea de lo que está sucediendo. En el caso del ejercicio 08.01,
el calificador fue el siguiente: System.DivideByZeroException. ¿A alguien le queda duda
de que se trata de una excepción determinada por la clase System, que tiene que ver con
una división entre cero?
Las excepciones que existen pueden ser muchas; hay dos formas de conocerlas: que suce-
dan (lo que no es muy recomendable), o bien, revisando la ayuda de Visual Basic, en don-
de cada clase lista las excepciones que pueden ocurrir en el uso de los objetos basados en
ellas. Por ejemplo, la clase System tiene las siguientes excepciones importantes, entre otras:
242 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ DivideByZeroException
❑ DLLNotFoundException
❑ IndexOutOfRangeException
❑ InvalidCastException
❑ OutOfMemoryException
❑ OverFlowException
❑ PlataformNotSupportedException
❑ UnauthorizedException

Cada clase tendrá las suyas y habrá que investigarlas de manera particular.

NOTA
El editor de código de Visual Studio, al realizar la declaración Catch, sugiere a través de Inte-
lliSense las excepciones válidas para lo que está desarrollando.

Objeto Err

Visual Basic sigue proporcionando el objeto Err, utilizado en versiones pasadas de Visual
Basic, con la limitación de que no se puede implementar el manejo estructurado de excep-
ciones (Structured Exception Handling) usando Try... Catch... Finally..., y el ma-
nejo de errores (Error Handling) usando On Error, de manera simultánea.
El objeto Err sí puede utilizarse en el manejo estructurado de excepciones. Esto es muy
útil cuando se desea trabajar con números de error en lugar de calificadores de excepción,
utilizando la propiedad Number.

Tipos de filtrado de excepciones

Cuando al definir un bloque Catch utilizamos un calificador de excepción para capturar el


problema, estamos creando un manejador de excepciones basado en tipos (Type-Filtered
Exception Handler).
Cuando al definir un bloque Catch no utilizamos un calificador de excepción, sino una
condición diversa, estamos creando un manejador de excepciones del usuario (User-Filte-
red Exception Handler), utilizando el estatuto When.
En un bloque Try se pueden especificar tantos bloques Catch como se desee. Entre más
bloques Catch se tengan, más particular será el manejo de excepciones.
Capítulo 8. Manejo estructurado de excepciones 243

Ejercicio 8.2
8
Filtrado de excepciones

En este ejercicio se protegerá un código determinado, utilizando Try... Catch... Fi-


nally.... El programa solicita dos números (un dividendo y un divisor) y a partir de ahí
se intentará una división. Como sabemos, no se puede dividir un número entre cero. Difie-
re del ejercicio anterior en que en éste no se manejarán las excepciones de manera genéri-
ca, sino particularmente, a través del filtrado de excepciones.
Deliberadamente se causará una excepción al tratar de dividir entre cero, o proporcionan-
do un valor que no es numérico.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Excep-
ciones2.

3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Excepciones2 – Module1.vb

1 Option Explicit On
2 Option Strict Off
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9 Dim Satisfactorio As Boolean = True
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Byte
13 Write(“Dame el dividendo:”)
14 N1 = ReadLine()
15 Write(“Dame el divisor:”)
16 N2 = ReadLine()
17 Resultado = N1 / N2
18 WriteLine(“Resultado:” & Resultado.ToString)
19 Catch eProblema As System.DivideByZeroException
20 WriteLine(“>>>>>>> Se trató de dividir entre cero”)
244 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

21 WriteLine(“Error:” & Err.Number.ToString)


22 Satisfactorio = False
23 Catch eProblema As System.InvalidCastException
24 WriteLine(“>>>>>>> La conversión cast no es posible”)
25 WriteLine(“Error:” & Err.Number.ToString)
26 Satisfactorio = False
27 Catch When Err.Number = 6
28 WriteLine(“>>>>>>> Manejo fuera de límite (Overflow)”)
29 Satisfactorio = False
30 Finally
31 If Satisfactorio Then
32 WriteLine(“Programa sin problemas”)
33 Else
34 WriteLine(“Programa con problemas.”)
35 End If
36 End Try
37 Write(“Pulse INTRO para continuar”)
38 ReadLine()
39 End Sub
40
41 End Module

Ejecución guiada de Excepciones2 – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realiza-
do en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (F5).
5. Es importante tomar en cuenta que este programa no es type safe dado que tiene la in-
dicación Option Strict Off (línea 2); esto porque intentaremos conversiones tipo cast.
También es importante ver que las variables de trabajo son de tipo Byte (línea 12) y, por
tanto, admiten sólo un dominio 0 a 255 sin signo.
6. Proporcione el valor 10 como dividendo y 0 como divisor.
7. Si colocamos el cero como divisor, al querer resolver la línea 17, el programa determi-
na que eso no es posible y genera una excepción. La excepción es de tipo DivideByZe-
roException, por lo que el control del programa se trasladará al bloque Catch que, de
manera particular, hace referencia a dicho tipo de excepción.
El control del programa irá al bloque Catch que refiere el tipo de excepción DivideBy-
ZeroException en la línea 19. Se ejecutarán las líneas 20, 21 y 22, y luego se procede-
rá a ejecutar el bloque Finally. Se ejecuta el bloque Catch que corresponde.
Capítulo 8. Manejo estructurado de excepciones 245

La línea 21 muestra el número de error del que se trata, utilizando para ello la propie-
dad Number del objeto Err, que también funciona en Visual Basic (en forma mejorada).
8
La línea 20 muestra un mensaje particular para la excepción de la que se trata; éste es el
mayor beneficio de filtrar los errores, ya que si se tienen excepciones diferentes, es ló-
gico que se necesiten acciones diferentes para manejarlas. El manejo genérico de excep-
ciones trata a todas por igual, lo que resta precisión a la función de depuración de pro-
gramas. El control del programa, agotado el bloque Catch particular para la excepción
que se provocó, seguirá en el bloque Finally.
Es importante ver cómo la línea 9 declara una variable de tipo Boolean (Satisfacto-
rio), que nos servirá para saber si el proceso fue satisfactorio (True) o si presentó ex-
cepciones (False). Inicialmente se considera que el proceso es satisfactorio (True). En
caso de que suceda alguna excepción, se cambiará el valor de Satisfactorio a False;
con dicho valor le daremos flexibilidad al código del bloque Finally; anteriormente,
Finally no diferenciaba si el programa había causado excepción o no. Nosotros le da-
mos esa funcionalidad con la variable de apoyo, colocando un condicional que ejecute
cierto código si presentó excepciones, y otro bloque de código distinto si no las causó.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Prueba de manejo de Excepciones


Dame el dividendo:10
Dame el divisor:0
>>>>>>> Manejo fuera de límite (Overflow)
Programa con problemas.
Pulse INTRO para continuar

8. Ejecute la aplicación nuevamente (tecla F5), proporcione el valor 10 como dividendo y


A como divisor.

Vea cómo el programa diferencia entre los tipos de excepciones que pueden ser causa-
das en un proceso. Al detectar que no es posible hacer la conversión tipo cast del valor
“A” a su equivalente Byte, se causa el error.

Si todo ocurrió como se esperaba, la salida será la siguiente:

Prueba de manejo de Excepciones


Dame el dividendo:10
Dame el divisor:A
>>>>>>> La conversión cast no es posible
Error:13
Programa con problemas.
Pulse INTRO para continuar
246 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. Ejecute la aplicación nuevamente (tecla F5) y proporcione el valor 1000.


Vea cómo el programa diferencia entre los tipos de excepciones que pueden ser causa-
das en un proceso. Al detectar que 1000 excede el límite de tipo Byte, se genera la ex-
cepción.
Si todo ocurrió como se esperaba, la salida será la siguiente.

Prueba de manejo de Excepciones


Dame el dividendo:1000
>>>>>>> Manejo fuera de límite (Overflow)
Programa con problemas.
Pulse INTRO para continuar

FIN DEL EJERCICIO *

Lanzamiento de excepciones propias


Ciertos casos requieren considerar que un proceso, no violatorio de ninguna de las reglas
del lenguaje, tiene un comportamiento equivocado, susceptible de ser considerado un error.
En ese caso, es recomendable tener elementos suficientes para provocar excepciones cuan-
do se detecta algo indeseable, como si se tratara de una excepción reconocida por el len-
guaje.
En términos generales, sabemos que cuando se produce una excepción, el CLR genera una
instancia de la clase System.Exception automáticamente. La instanciación, en ese caso, es
realizada en tiempo de ejecución por el mismo sistema.
Nada nos impide instanciar nosotros: la forma en que podemos hacerlo es a través del uso
de Throw New Exception, con la siguiente sintaxis:
Throw New Exception(“Mensaje de error”)

Ejercicio 8.3
Lanzamiento de excepciones definidas por el usuario

En este ejercicio se protegerá un código determinado, utilizando Try... Catch... Fi-


nally.... El programa solicita dos números (un dividendo y un divisor) y a partir de ahí
se intentará una división. Como sabemos, no se puede dividir un número entre cero. Este
ejemplo se diferencia de los anteriores en que nos anticiparemos para lanzar una excepción
antes de que el programa lo haga.
Capítulo 8. Manejo estructurado de excepciones 247

Deliberadamente se causará una excepción al tratar de dividir entre cero, y se capturará la


excepción antes de que se realice la división (cuando anteriormente se manifestaba la ex-
8
cepción).
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Excep-
ciones3.

3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Excepciones3 – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Decimal
13 Write(“Dame el dividendo:”)
14 N1 = CDec(ReadLine())
15 Write(“Dame el divisor:”)
16 N2 = CDec(ReadLine())
17 If N2 = 0 Then
18 Throw New Exception(“Divisor no puede ser cero”)
19 End If
20 Resultado = N1 / N2
21 WriteLine(“Resultado:” & Resultado.ToString)
22 Catch eProblema As Exception
23 WriteLine(“> Problema: “ & eProblema.Message)
24 Finally
25 Write(“Pulse INTRO para continuar”)
26 ReadLine()
27 End Try
28
29 End Sub
30
31 End Module
248 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Excepciones3 – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto


como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realiza-
do en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (tecla F5).
5. Proporcione el valor 10 como dividendo y 0 como divisor. Al intentar resolver la línea
20, el programa determinaría que eso no es posible, y generaría una excepción.
No esperamos a que el programa señale la excepción: sabemos que si el divisor es cero
la operación no puede ser correcta. Con eso en mente, decidimos anticiparnos,y en la lí-
nea 17 evaluamos si N2 (el divisor) es cero, en cuyo caso, lanzaremos una excepción
nueva, creada por nosotros (instanciamos System.Exception), tal como lo muestra la
línea 18.
El control del programa se traslada al bloque Catch, y es manejada como cualquier otra
excepción.
Si todo ocurrió como se esperaba, la salida será la siguiente.

Prueba de manejo de Excepciones


Dame el dividendo:10
Dame el divisor:0
> Problema: Divisor no puede ser cero
Pulse INTRO para continuar

FIN DEL EJERCICIO*


Capítulo 8. Manejo estructurado de excepciones 249

MAPA MENTAL DEL CAPÍTULO


8
250 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Calificadores de de software, Manejo estruc- System.Exception,


excepción, 241 233 turado de excep- 236
Catch, 235 Excepciones, 233 ciones, 234 Throw, 246
Código protegido, Exit, 235 Message, 237 ToString, 237
235 Finally, 235-6 SHE, 234 Try, 235
Err, 234, 242 InnerException, 237 Source, 237 Try…Catch…Finally,
Error List, 240 Manejador de StackTrace, 237 235
Errores, 233 excepciones Structured
Excepciones basado en tipos, Exception
de hardware, 242 Handling,
233 del usuario, 242 234

PREGUNTAS
8.1 ¿Para qué sirven los bloques Try Catch Finally?

8.2 ¿En qué consiste el filtrado de excepciones?


8.3 ¿Qué son los calificadores de excepción y para qué sirven?
8.4 ¿De qué manera es posible lanzar excepciones personalizadas?
Capítulo 8. Manejo estructurado de excepciones 251

Notas: 8
252 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Son violaciones a las reglas sintácticas o de alcance de un lenguaje de programación:
a) Errores
b) Excepciones
c) Bugs

2. Es la capacidad que tiene un lenguaje para permitir manejar excepciones a través de una estructura
de control que protege bloques de código:
a) Manejo estructurado de excepciones
b) Control de errores
c) Depuración

3. Es la clase de .NET a través de la cual se manejan las excepciones:


a) Object.Exception
b) e.Exception
c) System.Exception

4. Son los nombres de excepciones reconocidos internamente por .NET:


a) Calificadores de excepción
b) Excepciones nominadas
c) Excepciones basadas en tipo

5. Filtrado de errores en el que, utilizando Catch, se especifica una condición usando where:
a) Filtrado de excepciones basado en tipos
b) Filtrado de excepciones del usuario
c) Filtrado condicional

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Las excepciones tienen mayor alcance que los errores.

7. La ejecución del código Finally se llevará a cabo sólo si se produce una excep-
ción.

8. Visual Basic es compatible con Err, utilizado en versiones anteriores.

9. Throw sirve para provocar excepciones.

10. Try y On Error pueden convivir en un mismo procedimiento o método.


Capítulos:
9 Fundamentos de la
programación orientada
Parte 3
a objetos
10 Clases, métodos y Programación orientada
propiedades a objetos
11 Herencia y polimorfismo
En esta parte del libro se presentan los conceptos
de la programación orientada a objetos (POO)
Herramientas de Visual utilizando Visual Basic.
Studio revisadas:
1. Form Designer. Aprovecharemos las capacidades de este lenguaje y
2. Selector de documentos las herramientas de Visual Studio para la creación
activos. de objetos de negocios y clases, que
3. Class Designer. posteriormente podrán ser utilizados desde
4. Class Diagram. cualquier aplicación, haciendo realidad el esquema
5. Class View. de desarrollo reutilizando el código.

Aprenderá a encapsular clases, utilizar la herencia


de funcionalidad y el manejo contextualizado de
procedimientos por medio del polimorfismo.

Nuestra reflexión es la siguiente: la búsqueda de


tiempo libre lleva a las personas a ser creativas,
para hacer más cosas con el mínimo esfuerzo.

Sin embargo, no todas las personas con estas


características son creativas; sólo aquellas con la
curiosidad y los conocimientos suficientes podrán
utilizar esa creatividad para realizar cosas que
trabajen para facilitarles la existencia.
El enfoque orientado a objetos nos lleva a
identificar algo que ya hemos hecho y reutilizarlo
para hacer nuestros desarrollos menos
extenuantes.
CAPÍTULO 9
Fundamentos de la
programación orientada
a objetos
Objetivos: Aprender los conceptos fundamentales de la programación orientada
a objetos, así como las ventajas de dicha orientación.

1. Conocerá los términos fundamentales de la programación orientada a


objetos: clases, objetos, campos, propiedades, métodos y eventos.
2. Entenderá en qué consiste el encapsulamiento, la herencia y el polimor-
fismo.
3. Aprenderá las capacidades de adaptación de los objetos: Overloading,
Overriding y Shadowing.

255
256 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Términos básicos de POO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Clases y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Campos, propiedades, métodos y eventos . . . . . . . . . . . . . . . . . . . . . . 258
Encapsulamiento (encapsulation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Herencia (inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Polimorfismo (polymorphism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Overloading, Overriding y Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . 264
Elementos esenciales de los objetos que permiten su programación . . . . . . 265
Identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Comportamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Comprobación de la identidad, el estado y el
comportamiento de objetos . . . . . . . . . . . . . . . . . . . . . . . . 269
➤ Instanciación de objetos en Visual Studio . . . . . . . . . . . 269
➤ Modificación de la identidad de los objetos en
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
➤ Programación de comportamientos desde
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Capítulo 9. Fundamentos de la programación orientada a objetos 257

El presente capítulo expone los conceptos generales de la programación orientada a ob-


jetos (POO). Estos conceptos están relacionados con los objetos en sí y con su relación
Clases y con otros objetos.
objetos

Todavía se habla de la POO con entusiasmo, sobre todo cuando quien lo hace no ha pro-
gramado con lenguajes como C++ o Java. Es necesario destacar que hace mucho tiem-
po el tema dejó de ser una novedad, y, sin embargo, por alguna extraña razón, se sigue 9
viendo a dicho modelo de programación como “lo nuevo” (sobre todo entre aquellos
que nunca han desarrollado en POO).

Quizá tenga mucho que ver que el lenguaje más utilizado en el mundo, Visual Basic en su
versión 6, no estaba orientado a objetos; cualquiera que programara en POO formaba par-
te de un grupo más reducido y diferente, lo que confiere siempre un cierto grado de espe-
cialidad.

Hasta hace poco, un programador en C++ era más elogiado que un programador de Visual
Basic, en gran medida porque había menos programadores de C++ que de Visual Basic
(simple economía: a menor oferta, mayor el precio). Ahora las cosas están cambiando, ya
que Visual Basic se integra al mundo POO, toma de sí mismo la simplicidad de su código,
y adopta de la plataforma .NET capacidades que eliminan las limitaciones que anterior-
mente tenía, ganando flexibilidad y potencia, y cubriendo aspectos que antes eran más sen-
cillos en otros lenguajes como C++.

Si se pregunta qué es mejor, el enfoque de procedimientos, el de eventos o el orientado a


objetos, la respuesta es contundente: depende de lo que se quiera hacer. Hay cosas más sen-
cillas de implementar en una orientación que en otra, así que no se sienta mal por no ha-
ber aprendido a programar en POO con anterioridad. Quizá no lo haya necesitado.

Aunque la experiencia previa en programación es muy útil al aprender POO, no todo el que
programa Visual Basic 6.0 podrá programar en Visual Basic sin modificar algunos paradig-
mas. Es importante, por no decir que indispensable, comprender el marco teórico del mo-
delo orientado a objetos para ser un buen programador en POO.

Términos básicos de POO


Ya hemos dicho que en Visual Basic casi todo es un objeto. Por ese motivo, es importante
tener los conceptos relacionados con la programación orientada a objetos muy bien domi-
nados. Los conceptos que vea en este capítulo son fundamentales para entender la progra-
258 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mación orientada a objetos en Visual Basic; léalos cuantas veces sea necesario hasta que
los comprenda plenamente.

Clases y objetos
Una clase es una definición formal de un tipo de objeto. La clase define qué datos forma-
rán parte de un objeto, qué tareas desarrollará el objeto, y de qué manera interactuará el
objeto con el usuario y con otros objetos.
Los objetos son instancias de una clase. Por instancia podemos entender una copia funcio-
nal de la clase. A la acción de generar un objeto a partir de una clase, se le denomina ins-
tanciación.
Al procedimiento o código que realiza la instanciación se le denomina constructor. Al pro-
cedimiento o código que destruye a un objeto, liberando los recursos que éste consumía,
se le llama destructor. En los lenguajes .NET no es necesario codificar destructores (como
era necesario hacer, por ejemplo, en C++), debido a la existencia del garbage collector,
que es el elemento de CLR que se encarga de eliminar objetos no utilizados a fin de libe-
rar los recursos que utilizan.

Campos, propiedades, métodos y eventos


Las clases, y por tanto los objetos que se derivan de ellas, son un conjunto de datos y com-
portamientos; tanto las clases como los objetos están formadas por campos, propiedades y
métodos.
Los campos y las propiedades representan la información que un objeto contiene.
Los campos (fields) son elementos de una estructura que actúan como valores equivalen-
tes, nominados.
Las propiedades (properties) son muy parecidas a los campos en el sentido de que alma-
cenan valores; su implementación, sin embargo, es más formal, ya que para leer y asignar
valores a las propiedades es necesario el uso de las instrucciones Property Get y Property
Set, las cuales proporcionan un mayor control con respecto a la forma en la que los valo-
res pueden ser asignados o leídos.
Cuando se utilizan propiedades, la lectura y la asignación de valores son directas, lo que
implica que entre el programa que usa las propiedades y el valor almacenado existe una ca-
pa intermedia de control, que ayuda a aislar (isolate) a la aplicación de los valores que uti-
lizará, permitiendo que dichos valores puedan ser validados antes de que se lean o asignen.
Capítulo 9. Fundamentos de la programación orientada a objetos 259

Los métodos son los comportamientos predefinidos que puede presentar un objeto. En cier-
ta forma, los métodos representan las acciones que el objeto podrá realizar. La manera en
que se pueden definir los métodos es agregando procedimientos y funciones a una clase;
al momento de generar una instancia de dicha clase, los procedimientos y funciones que le
codificamos a la clase formarán los métodos disponibles para el objeto.
Un evento es el resultado de la interacción que un usuario o programa tiene con un objeto,
en una circunstancia dada, que desencadena la ejecución de un procedimiento o método.
9

FIGURA 9.1
Estructura de un
objeto

La interacción que tiene el usuario o programa con un objeto provoca internamente una in-
teracción de dicho objeto con otros, que puede ser bidireccional, ya sea que el objeto reci-
ba una petición de un objeto o aplicación, o bien que realice una petición a otro objeto o
aplicación.
A las propiedades, métodos y eventos también suele llamárseles miembros (members), que
son el conjunto de elementos declarados por una clase.

Encapsulamiento (encapsulation)
Para que una aplicación realmente esté orientada a objetos debe admitir las cualidades de en-
capsulamiento, herencia y polimorfismo. Estas tres cualidades son representativas de POO.
260 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El encapsulamiento es la capacidad que tiene un objeto para almacenar datos y procedi-


mientos, como una unidad funcional, y permitir el acceso a ellos sin que los demás obje-
tos tengan la necesidad de conocer cómo se integran dichos datos y dicho comportamien-
to dentro del objeto.
Usted ya sabe que los objetos se hacen peticiones entre sí a través de mensajes, y que un
objeto puede hacer uso de otros objetos. Imagine que un objeto (objeto A) realiza un cálcu-
lo financiero complejo. Imagine que otro objeto (objeto B) realiza un cálculo que determi-
na el monto de los gastos de la compañía en un periodo determinado.
Resulta que el objeto A, para desarrollar sus operaciones, necesita la información que pro-
duce el objeto B, y para obtener dicha información se comunica con B enviando un men-
saje (mensaje X).
Como respuesta, el objeto B le envía al objeto A la contestación a través de un mensaje
(mensaje Y).
La persona que desarrolló el objeto B se da cuenta de que el cálculo que realiza el objeto
puede mejorarse. Procede a cambiar el código (comportamiento), haciéndolo más eficien-
te, reduciendo el tiempo de respuesta a la mitad.
Como consecuencia del encapsulamiento, el objeto A no necesita saber qué hace el objeto
B para proporcionar la información que se le pide. El encapsulamiento permite que el es-
tado o el comportamiento de un objeto pueda modificarse para darle mayor o mejor fun-
cionalidad al objeto, sin afectar a otros objetos asociados. El objeto A sigue enviando el
mensaje X al objeto B, y el objeto B le sigue respondiendo con el mensaje Y, sólo que en
la mitad del tiempo que antes.
El encapsulamiento sólo debe respetar una regla: al modificar un objeto, éste debe seguir
aceptando los mismos mensajes de petición, y enviando los mismos mensajes de respues-
ta. Fuera de eso, el objeto puede ser una caja negra para los demás desarrolladores, sin que
ello perjudique la funcionalidad de la aplicación.
Las ventajas que proporciona el encapsulamiento a los programadores son las siguientes:

❑ Facilita la modularidad. Un módulo es un bloque de código que desarrolla un pro-


ceso específico. La modularidad es la capacidad que se tiene de dividir los procesos en
múltiples procesos más pequeños.

Cuando se inicia un proyecto de programación orientada a objetos, cada objeto actúa


como un módulo; a cada desarrollador se le pide que desarrolle ciertos objetos, que obe-
deciendo a determinados mensajes de petición, proporcionen determinados mensajes de
respuesta. Al final del proyecto se integran todos los objetos, que de forma complemen-
Capítulo 9. Fundamentos de la programación orientada a objetos 261

taria se dan servicio entre sí; en un momento dado, si a una persona se le ocurre modi-
ficar un objeto que otra persona está utilizando, esto no impacta negativamente, porque
los mensajes que se comunican los objetos no deben de sufrir variación.
❑ Mantiene la información oculta. El objeto puede por sí solo encargarse de modi-
ficar los valores de sus propiedades; además, para hacer uso del objeto no es necesario
conocer cómo realiza las operaciones (comportamiento). Sólo el objeto se encarga de
manejar su estado y comportamiento.
9
Hay procesos tan complejos, importantes y confidenciales que sólo el desarrollador del
objeto está autorizado para conocerlos. Imagine que tiene un objeto que se encarga de
codificar y decodificar información confidencial en la organización; por ejemplo, si to-
dos los programadores que utilizaran el objeto pudieran conocer los pormenores del al-
goritmo de codificación y decodificación, no estaríamos seguros en qué momento podría
ser conocido por todos, y, por tanto, copiado y vulnerado. El encapsulamiento elimina
la necesidad de que otros conozcan cómo está codificado un objeto y, por tanto, favore-
ce la confidencialidad de la implantación de los procesos.

Herencia (inheritance)
La herencia describe la capacidad de crear una nueva clase basada en una existente.
La clase a partir de la cual se generará la nueva recibe el nombre de clase base (base class);
la nueva clase, llamada clase derivada (derived class), hereda todas las propiedades, méto-
dos y eventos de la clase base y a partir de ahí, es posible agregarle las propiedades y mé-
todos particulares que la hacen especial.
Un ejemplo puede aclararnos las cosas. Imagine que crea una clase llamada Vehículo
AutoMotor. Esta clase contendrá propiedades que todos los vehículos automotores tienen
como son color, tipo de transmisión, tipo de combustible, etcétera. Además, tendrá defini-
dos los métodos aplicables para todos los vehículos automotores; por ejemplo, encender o
apagar el motor.
Hay un tipo de vehículos automotores que sirven para carga de materiales (vehículo de car-
ga); en ellos, la capacidad de carga en toneladas, las dimensiones máximas de la carga y la
necesidad de refrigeración de la carga son importantes, pero, ¿son esos datos importantes
para un vehículo que sólo es utilizado para transportar personas? La respuesta es que no.
Tenemos las siguientes alternativas de solución para manejar la información del ejemplo:

❑ Definir la clase VehículoAutoMotor con todas las características posibles para todos los
vehículos automotores posibles; eso sobrecargaría a la clase de muchas propiedades no
aplicables para todos los vehículos, complicando el trabajo de afirmar o negar las carac-
262 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

terísticas aplicables a un vehículo en particular. En realidad, todo está siendo manejado


en un mismo objeto, tal y como sería en una programación procedural.
❑ Definir una clase independiente de VehículoAutoMotor; por ejemplo, VehículoAuto-
MotorCarga, que contenga todas las propiedades y los métodos que requieren ser espe-
cificadas para un vehículo automotor de carga. Obviamente, muchas de las característi-
cas de los vehículos automotores de carga son comunes para todos los vehículos
automotores. Eso implicaría una doble codificación (codificación redundante), que re-
vela que, no obstante que ya teníamos codificados los pormenores de los vehículos au-
tomotores, no reutilizamos dicho código, pues creamos uno enteramente nuevo. En es-
ta alternativa tampoco funciona la herencia.
❑ Definir una clase independiente, por ejemplo VehículoAutoMotorCarga, que contenga
sólo aquellas propiedades y métodos no definidos en VehículoAutoMotor. La nueva
clase (VehículoAutoMotorCarga) se generaría a partir de una clase base (Vehículo
AutoMotor), aprovechando toda su codificación. Esta alternativa implica un uso funcio-
nal de la herencia, en donde se tiene una clase base y una clase derivada.

FIGURA 9.2
Herencia

Clase Base
Clases derivadas

Las ventajas que proporciona la herencia para los programadores de software son las si-
guientes:
Capítulo 9. Fundamentos de la programación orientada a objetos 263

❑ Reuso de código. La mayor ventaja de la herencia es que el código se reutiliza de


una forma más eficiente, pues las clases parten de otras clases más generales; esto ga-
rantiza que de inicio las clases ya tienen la funcionalidad de otras anteriormente crea-
das. Sólo se estará desarrollando nueva funcionalidad, evitándose el código redundante.
❑ Jerarquía de clases. Es posible realizar una jerarquía que distinga procesos genera-
les y específicos.

La figura 9.2 muestra de manera conceptual cómo, a partir de una clase base, surgen clases
9
derivadas que pueden disponer de todas las propiedades, métodos y eventos de la clase ba-
se, y que además incluyen las características particulares de aquello que no es posible re-
presentar usando solamente lo definido en la clase base. En la jerarquía de clases, la clase
base no requiere de las clases derivadas, pero las clases derivadas sí requieren de lo defini-
do en la clase base.

Polimorfismo (polymorphism)
El polimorfismo es la capacidad de manejar múltiples clases que pueden ser utilizadas de
manera intercambiable a través de una misma implementación (nombre de clase). El poli-
morfismo es esencial para la programación orientada a objetos, ya que permite, a través de
un mismo nombre de clase, agrupar diferentes funcionalidades, dependiendo de las propie-
dades y métodos que se utilicen al momento de invocarlas.

NOTA
En Visual Studio puede verse claramente esta capacidad. Si en alguno de sus programas utili-
za, por citar un ejemplo, la función Val, que convierte a número una expresión, aparecerá una
referencia como sigue:

La misma implementación (Val) puede comportarse de tres maneras, dependiendo del argu-
mento que reciba. Si la función recibe un argumento String, realizará la conversión y devol-
verá un valor de tipo Double; si recibe un argumento de tipo Char, devolverá un valor de tipo
Integer; y si recibe un argumento Object, devolverá un valor de tipo Double. El programador
no tendrá que preocuparse por saber qué clase ha de utilizar en caso de proporcionar un ar-
gumento String, Char u Object. El polimorfismo se encarga de realizar la selección adecuada.
264 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Imagine que tiene una aplicación que controla las ventas de un negocio. Puede ser que tenga
un objeto llamado RegistraVenta, que se encargue de almacenar en una base de datos los por-
menores de la venta. Suponga que hay un objeto llamado ActualizaLíneaCrédito que se en-
carga de actualizar la línea de crédito de los clientes que compran en el establecimiento; co-
mo ha de suponer, las acciones que realizará ActualizaLíneaCrédito tienen que ver si la
compra se realiza a crédito o de contado. En enfoque procedural, sería necesario hacer dos pro-
cedimientos distintos, de diferente nombre, para controlar cada una de las alternativas.
En POO se pueden generar dos clases distintas, que contengan cada una de las alternativas
de la actualización de la línea de crédito; la diferencia estriba en que para el programa só-
lo existirá una. Será la misma plataforma de ejecución la que determine, con base en los
datos proporcionados, qué clase es la que se empleará.

Overloading, Overriding y Shadowing


Para implementar el polimorfismo, hay que conocer tres conceptos básicos: Overloading,
Overriding y Shadowing. Al explicar el polimorfismo, concluimos que un mismo nombre
de método puede tener funcionalidad distinta dependiendo de los argumentos que le son
proporcionados.
Como sabe, los argumentos van entre paréntesis y separados por comas, después del nom-
bre del método o función; por tratarse de una lista de valores, estamos ante la presencia de
una serie de valores.

NOTA
La implementación en programación de la terminología descrita en este capítulo se demos-
trará en el capítulo siguiente.

Los miembros con característica Overloaded son utilizados para proporcionar diferentes
versiones de una propiedad o método que tiene el mismo nombre, pero que acepta diferen-
te número de argumentos, o argumentos de diferente tipo de dato.
Las propiedades y métodos con característica Overriden son utilizados para reemplazar una
propiedad o método que, habiendo sido heredado de una clase base, no es lo apropiado pa-
ra la clase derivada. Esto permite sustituir elementos heredados de la clase base, con aque-
llos que la clase derivada realmente necesita.
Capítulo 9. Fundamentos de la programación orientada a objetos 265

La única restricción que se tiene es que los miembros Overriden deben aceptar el mismo
número de argumentos y devolver los mismos valores, respetando los tipos de datos de la
clase base, a efecto de que el encapsulamiento de los objetos sea posible.
Los miembros con característica Shadowed son aquellos que reemplazan localmente a otros
miembros existentes, dentro de un alcance diferente al original.

Elementos esenciales de los objetos 9


que permiten su programación
Al generar instancias de una clase, estamos generando un objeto. Una vez que los objetos
existen, es posible utilizarlos para obtener funcionalidad de la aplicación. Es importante
que nos hagamos a la idea de que un objeto, una vez que es creado, ya posee vida propia y
es independiente de todos los demás.
Los objetos tienen tres características principales:

❑ Identidad
❑ Estado
❑ Comportamiento

Identidad
La identidad del objeto es su capacidad de tener un nombre que lo identifica y diferencia de
los demás. No podemos crear ningún objeto sin asignarle un nombre para su identificación;
de ser así generaríamos un elemento al cual no podríamos invocar de ninguna manera.
Al momento de instanciarse, todos los objetos son exactamente iguales a la clase de la cual
derivan; sólo se diferenciarán por su identidad.
En Visual Basic los objetos poseen una propiedad llamada Name, a través de la cual se
manifiesta su identidad. A la propiedad Name también se le conoce como propiedad de iden-
tidad.
La propiedad Name puede ser utilizada en tiempo de ejecución para evaluar la identidad de
un objeto por su nombre, y no por su identificación en el programa (nombre de la variable
objeto, a lo que se conoce como nombre programático). El valor que posee la propiedad
Name es de tipo String, lo que facilita mucho su utilización en los procesos que estemos
codificando.
Los programadores de Visual Basic en su versión 6 tal vez no le dieran importancia al he-
cho de que todos los controles que se utilizaban en las aplicaciones debían ser referidos por
266 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

su nombre programático, pues era la única posibilidad que había para identificar los ele-
mentos de un programa. Una vez realizada la codificación, cambiar la identidad a un con-
trol (modificar la propiedad Name) era impensable, ya que sería necesario modificar el có-
digo para admitir el nuevo nombre asignado.
En Visual Basic queda claramente definido que se tiene un nombre programático (nombre
de los objetos) y una identidad de los objetos, en la propiedad Name.

Estado
El estado de un objeto es la situación de forma y comportamiento que tiene el objeto en un
momento determinado en tiempo de ejecución.
El estado está determinado por el juego de valores que tienen sus propiedades. Como
sabemos, las propiedades son las características particulares del objeto y especifican su
nombre, posición, apariencia y hasta sus capacidades de interacción con el usuario y otros
objetos.
Un objeto puede estar disponible o no para su uso en una interfaz (Enabled=True o Ena-
bled=False); puede tener un ancho de 10 o 20 píxeles (Width=10 o Width=20). Si cam-
biamos el valor de cualquiera de las propiedades, como podría ser incrementar el ancho del
objeto de 10 a 20 píxeles, ello representa una modificación de estado.
La figura 9.3 nos invita a imaginar el núcleo de un objeto como un conjunto de propieda-
des establecidas; vea cómo la identidad del objeto también forma parte del estado del mis-
mo, pues Name es una propiedad, al igual que las de posición, apariencia y otras.

Comportamiento
El comportamiento es la capacidad del objeto para funcionar de una determinada manera.
Como respuesta a la interacción del usuario, de otros objetos, o incluso del mismo sistema
operativo, el objeto podrá comportarse de diferente forma.
El comportamiento de un objeto se presenta por la posibilidad de mandar llamar a ejecu-
ción:

❑ Los métodos
❑ Los procedimientos de evento
❑ Los procedimientos y funciones definidas por el usuario

Los métodos, como sabe, son los comportamientos predefinidos que un objeto puede pre-
sentar, y que se encuentran definidos por la clase de la cual el objeto deriva.
Capítulo 9. Fundamentos de la programación orientada a objetos 267

Los procedimientos de evento son aquellos procedimientos que le suceden a un objeto co-
mo respuesta a la interacción que tienen con el usuario u otros objetos. El objeto tiene un
conjunto de eventos que reconoce, y usted como desarrollador lo único que hace es decir-
le a su programa a) que quiere que un objeto determinado sea sensible a los eventos que le
sucedan (especificación WithEvents al momento de la declaración), b) elaborar un proce-
dimiento y c) especificarle a dicho procedimiento que será ejecutado en caso de que le su-
ceda el evento a alguno de los objetos que maneje (handles).
9
En versiones anteriores de Visual Basic, un procedimiento de evento podía servir sólo pa-
ra manejar las acciones que deberían suceder cuando a un objeto determinado le sucedía
un evento determinado; de hecho, el nombre de los procedimientos de evento estaba for-
mado por el nombre del objeto y el nombre de evento, separados por un guión bajo. Había
controles para los cuales se aplicaban las mismas validaciones (por ejemplo, que los cua-
dros de texto no se dejaran vacíos); no obstante que el proceso a realizar era el mismo pa-
ra todos los cuadros de texto, a cada uno de ellos se le debía definir un procedimiento de
evento.

Algunas cosas cambiaron en Visual Basic. Un procedimiento de evento puede manejar un


mismo evento para uno o más objetos; por ese motivo, el nombre asociado a un solo obje-
to y un solo evento ya no tiene sentido. Ahora el nombre del procedimiento de evento pue-
de ser el que sea.

La única cosa que debemos respetar son los argumentos implícitos. Los procedimientos
pueden admitir argumentos; con base en ellos es posible modificar el resultado del proce-
samiento o el valor que devuelven (en el caso de las funciones). Los argumentos implíci-
tos son aquellos que son declarados por Visual Basic de manera automática; en la declara-
ción de este tipo de argumentos el programador no participa más que como espectador y
usuario.

Cada evento podrá exigir la presencia de los argumentos implícitos que necesita para tra-
bajar; cuando nosotros declaramos un objeto especificando que queremos que sea sensible
a eventos (WithEvents), también le estamos diciendo al programa que queremos que Vi-
sual Basic se encargue de actualizar, en tiempo de ejecución, los datos de los argumentos
implícitos de cada uno de los eventos aplicables al objeto. Nosotros no determinamos el
valor que tendrán los argumentos implícitos; es el CLR, en tiempo de ejecución, el que de-
termina qué valores tendrán.

Los procedimientos definidos por el usuario y las funciones definidas por el usuario, son
los procedimientos y funciones que usted codifica; no dependen de los eventos que pueden
sucederle al objeto, ni requieren estar predefinidos en ninguna clase: son la forma más pu-
ra de codificación. Hace muchos años, cuando nadie hablaba aún de objetos ni de eventos,
los procedimientos y funciones definidos por el usuario ya existían.
268 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA
Algunos desarrolladores, para no estar preocupándose respecto a qué objetos permitirán ma-
nejo de eventos y cuáles no, colocan la especificación WithEvents a todos los objetos. Aun-
que es una forma simple de quitarse problemas, no es lo más estructurado; deja ver que el
programador no conoce a profundidad el comportamiento que tendrá su interfaz. Sugerimos
colocar WithEvents sólo a los objetos que realmente manejarán procedimientos de eventos.

La figura 9.3 muestra un panorama completo de la composición de un objeto.


El círculo del centro es el estado del objeto. Dentro del estado se encuentra la identidad,
pues la propiedad de identidad forma parte del estado. Alrededor del estado del objeto es-
tán las formas de comportamiento, que mantienen un diálogo con dicho estado, pues los
métodos, procedimientos de evento y procedimientos de usuario pueden modificar el esta-
do, y éste puede determinar la disponibilidad de las formas de comportamiento.
Los procedimientos y funciones definidas por el usuario son la parte más especializada de
las aplicaciones, ya que contienen los bloques de código que han de realizar aquello que el
lenguaje por sí mismo no puede. En ocasiones se dice que los procedimientos y funciones
definidas por el usuario son las reglas de negocio, para la aplicación.

FIGURA 9.3
Estado y
comportamiento
Capítulo 9. Fundamentos de la programación orientada a objetos 269

Ejercicio 9.1
Comprobación de la identidad, el estado y el comportamiento de objetos

En este ejercicio se comprobará la identidad, el estado y el comportamiento de un objeto.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
9
2. Agregue a su solución un proyecto Windows – Windows Application, llamado
CambiaEstado.

Interfaz CambiaEstado - Form1.vb [Design]

➤ Instanciación de objetos en Visual Studio

3. Al indicar la creación de una aplicación Windows, Visual Studio se encarga de instan-


ciar objetos en tiempo de diseño. El primero de ellos es un objeto que tiene como ori-
gen la clase System.Windows.Forms.Form, de nombre predeterminado Form1; este ob-
jeto tiene la particularidad de ser un contenedor, es decir, un objeto que contiene otros
objetos, de ahí que sea el primero en instanciarse.
4. El nombre que Visual Studio le asigna a los objetos que genera se forma por el nom-
bre del type que le da origen, más un número consecutivo de todos los objetos del mis-
mo tipo encontrados en el proyecto.
5. Ya que se genera la instancia de System.Windows.Forms.Form, aparece la herramien-
ta Form Designer, que permitirá la modificación del estado del objeto Form1 en tiem-
po de diseño. Cuando tenemos la posibilidad de manipular objetos en Form Designer
se dice que trabajamos en tiempo de diseño.
270 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 9.4
Form Designer

Moderadores
de tamaño

6. El formulario, al igual que todos los objetos que son agregados a la interfaz en tiempo
de diseño, tienen valores por omisión en todas sus propiedades. El objeto Form1 posee
un aspecto que los valores por omisión le proporcionan.
7. Seleccione la opción View – Toolbox (oprima las teclas Ctrl-Alt-X) para que aparez-
ca Toolbox. Si Toolbox está en ocultación automática, fíjela en Document Window.
8. En Toolbox expanda el grupo de controles Common Controls.
Capítulo 9. Fundamentos de la programación orientada a objetos 271

9. Haga doble clic en el control Button. Con ello se agregará en modo de


inserción un botón en el área de diseño de Form Designer.
10. Su interfaz ahora debe aparecer como sigue. La pregunta interesante es ¿dónde se
guarda el código que genera esta interfaz?

FIGURA 9.5
Interfaz con con-
troles derivados
9
de clases

11. En Solution Explorer haga clic en Show All Files.


12. Seleccione el nodo CambiaEstado – Form1.vb. Vea cómo dicho nodo se compone de
dos programas: Form1.vb y Form1.Designer.vb. En Form1.vb se editan los compor-
tamientos de la aplicación, mientras que en Form1.Designer.vb se codifica la interfaz,
instanciando todos los objetos.
272 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

13. Haga doble clic sobre el nodo Form1.Designer.vb y vea el código que aparece. Es un
poco complejo, pero es el trabajo que Form Designer nos ha ahorrado. Con Visual Stu-
dio no nos preocupamos por instanciar los objetos de interfaz, ni por cambiar de forma
programática los valores por omisión de las propiedades. Al agregar un botón, por ejem-
plo, se agrega automáticamente el siguiente código en el programa Form1.Designer.vb:

Me.Button1 = New System.Windows.Forms.Button


...

‘Button1

Me.Button1.Location = New System.Drawing.Point(0, 0)
Me.Button1.Name = “Button1”
Me.Button1.Size = New System.Drawing.Size(75, 23)
Me.Button1.TabIndex = 0
Me.Button1.Text = “Button1”
Me.Button1.UseVisualStyleBackColor = True
...
Friend WithEvents Button1 As System.Windows.Forms.Button

14. Si pretende ser un desarrollador profesional, sin duda requiere Visual Studio. Como
podrá leer en comentarios del mismo programa, no se recomienda que modifique el
programa directamente. Deje a Visual Studio hacer su trabajo y dedíquese a desarro-
llar en modo de diseño lo más que pueda. Sólo edite el código si sabe lo que está ha-
ciendo, y no descarte la posibilidad que el programa deje de funcionar o que Visual
Studio deshaga los cambios que usted realice al programa sin notificarle nada.
15. En Solution Explorer haga doble clic en el nodo Form1.vb, para regresar al tiempo de
diseño del formulario.
16. Seleccione View – Properties (F4) para ver la herramienta Properties.
17. Seleccione el objeto Form1, haciendo un solo clic en el formulario que se ve en Form
Designer.
18. Busque la propiedad Size, y vea las dimensiones que tiene el formulario. Algunas pro-
piedades pueden expandirse, lo que indica que se forman por otras propiedades. La
propiedad Size se compone de dos propiedades: Width y Height.
Capítulo 9. Fundamentos de la programación orientada a objetos 273

Escriba los valores que encuentra.


Height: ________________
Width: ________________
19. Seleccione el modificador de tamaño que aparece en el borde inferior del formulario y
arrástrelo hacia arriba, de tal forma que el formulario quede a la mitad de su tamaño
original. Consulte nuevamente los valores que componen Size. Compruebe que las
modificaciones en tiempo de diseño afectan directamente las propiedades de los obje- 9
tos, modificando su estado.
Height: ________________
Width: ________________
20. Para mayor precisión, haga los siguientes cambios en Form1.

Height 150

Text Cambio de estado

21. Seleccione el objeto Button1, haciendo un solo clic en el botón que se ve en Form De-
signer.

Text Cambiar Color

22. Utilizando el modificador de tamaño que se encuentra en el borde derecho del botón,
amplíe el ancho del botón.

23. Arrastre el botón al centro del formulario, para que sea más estético.
24. Decida la forma en que prefiere cambiar las propiedades de sus objetos.

➤ Modificación de la identidad de los objetos en Visual Studio


25. Modificar la identidad de los objetos en Visual Studio es muy sencillo, basta con se-
leccionar el objeto al que se le desea cambiar la identidad y modificar el valor de su
propiedad Name desde Properties.
26. Seleccione el objeto Form1.
27. En Properties busque la propiedad Name y asigne el valor de Formulario. Por omisión
Visual Studio le asigna un nombre a cada objeto. Modifique el nombre por omisión só-
lo si cambiará el estado del objeto o si utilizará sus propiedades de forma programática.
274 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Cuando hacemos referencia a la forma programática de hacer las cosas, queremos de-
cir que a través de código hacemos cosas que es posible hacer en tiempo de diseño uti-
lizando las herramientas de Visual Studio.
28. Una recomendación general es que asigne los nombres de los objetos al inicio de los
trabajos de desarrollo, antes de codificar comportamientos; asignados los nombres pro-
cure no cambiarlos, dado que el tal caso tendría que actualizar cada línea de código en
donde los objetos eran utilizados, o de lo contrario se generará error.
29. Seleccione a Button1 haciendo un solo clic en el botón, y en Properties cambie el va-
lor de la propiedad Name a Cambiar.

➤ Programación de comportamientos desde Visual Studio


30. Haga doble clic en Button1. Con ello se podrá editar el procedimiento de evento Click;
en dicho procedimiento se codifica lo que queremos que pase cuando en tiempo de eje-
cución el usuario haga clic en el botón. El programa que se editará es Form1.vb.
31. Agregue el siguiente código al procedimiento:
Me.BackColor = Color.Coral
Cambiar.BackColor = Color.LightSkyBlue

El Text Editor presentará lo siguiente:

32. Vea cómo la clase tiene el mismo nombre del objeto Form y cómo el procedimiento es
igual al nombre del botón y del evento que se está codificando (Cambiar_Click). La
línea 4 cambia el color de fondo del formulario, mientras que en la línea 5 se cambia
el color de fondo del botón.
33. Es importante notar que los cambios de estado en forma programática se logran de la
siguiente forma:

Objeto.Propiedad = Valor

34. Vea cómo el formulario no se refiere con su nombre (Formulario) sino por la constante
Me; esto debe ser así por la forma en que Visual Studio maneja los formularios. Si no se
estuviera utilizando Visual Studio, tendría que referirse el formulario por su nombre.
Capítulo 9. Fundamentos de la programación orientada a objetos 275

Ejecución guiada de CambiaEstado - Form1.vb

35. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
36. Haga clic en el botón y vea los cambios de color que provocamos. 9
FIN DEL EJERCICIO *

MAPA MENTAL DEL CAPÍTULO


276 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Argumentos Fields, 258 Miembros, 259 objetos (POO),


implícitos, 267 Form Designer, 269 Objetos, 258 257
Campos, 258 Funciones definidas Overloaded, 264 Properties, 258
Clase, 258 por el usuario, Overloading, 264 Propiedades, 258
Codificación redun- 267 Overriden, 264 Reuso de código,
dante, 262 Handles, 267 Overriding, 264 263
Comportamiento, Herencia, 261 Polimorfismo, 263 Shadowed, 265
266 Identidad, 265 Polymorphism, 263 Shadowing, 264
Constructor, 258 Inheritance, 261 POO, 257 WithEvents, 267
Destructor, 258 Instancia, 258 Procedimientos
Encapsulamiento, Instanciación, 258 de evento, 267
259-60 Jerarquía de clases, definidos por el
Encapsulation, 259 263 usuario, 267
Estado, 266 Members, 259 Programación
Evento, 259 Métodos, 259, 266 orientada a

PREGUNTAS
9.1 ¿Cuáles son las tres características principales que identifican a la programación
orientada a objetos?
9.2 Defina clase, objeto, propiedad, método y evento.
9.3 Explique qué es el estado de un objeto.
9.4 Explique los conceptos Overloading, Overriding y Shadowing.
9.5 ¿Cuáles son las ventajas que aporta la herencia?
9.6 ¿Cuáles son las ventajas que aporta el encapsulamiento?
9.7 ¿Cuáles son las ventajas que aporta el polimorfismo?
Capítulo 9. Fundamentos de la programación orientada a objetos 277

Notas:

9
278 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.

1. A la acción de generar un objeto a partir de una clase se le llama:


a) Instanciación
b) Generación de objetos
c) Derivación

2. Es el procedimiento o código que libera recursos que ya no utilizará un objeto:


a) Constructor
b) Destructor
c) GarbageCollector

3. Es la habilidad de crear una nueva clase basada en una clase existente:


a) Polimorfismo
b) Herencia
c) Encapsulamiento

4. Es la capacidad que tiene un objeto de almacenar datos y procedimientos como una unidad funcional:
a) Polimorfismo
b) Herencia
c) Encapsulamiento

5. Son asociaciones formales de uno o más datos de un determinado tipo, que da lugar a un nuevo tipo
de dato compuesto:
a) Delegado
b) Estructura
c) Encapsulado

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso, y «V» si es verdadero.

6. La clase derivada hereda su funcionalidad a la clase base.

7. El estado de un objeto es su capacidad de tener un nombre que lo identifica y lo di-


ferencia de los demás objetos.

8. Los objetos que producirán la ejecución de procedimientos de evento requieren ser


creados con la cláusula WithEvents.

9. En programación POO, la codificación redundante es necesaria.

10. Los métodos son comportamientos predefinidos de un objeto.


CAPÍTULO 10
Clases, métodos
y propiedades
Objetivos: Aprender a definir de manera programática clases, métodos y
propiedades.

1. Aprenderá qué son las clases y cómo se definen de manera programática.


2. Conocerá las propiedades y cómo se definen de manera programática.
3. Conocerá los métodos y cómo se definen de manera programática.
4. Aprenderá a crear bibliotecas DLL e invocarlas desde programas exter-
nos.
5. Sabrá qué son los modificadores de acceso y cómo se utilizan en la pro-
gramación orientada a objetos.

279
280 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Definición de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Definición de propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Creación de bibliotecas de clases (librerías) . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Condiciones para la utilización de las bibliotecas de clases . . . . . . . . . . . . . . 284
Creación de una clase con propiedades y métodos . . . . . . . . . . . 284
➤ Uso de Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
➤ Creación de un diagrama de clases y modificación
del mismo con Class Designer . . . . . . . . . . . . . . . . . . . . . 289
➤ Uso del selector de documentos activos
(Active Documents) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
➤ Adición de métodos usando Class Designer . . . . . . . . . . 292
➤ Uso de Class View para examinar objetos . . . . . . . . . . . 296
Consumo una clase a través de instancias . . . . . . . . . . . . . . . . . . 298
Uso de Object Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Visualización de referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Uso de clases en soluciones diferentes . . . . . . . . . . . . . . . . . . . . 304
➤ Integración de proyectos existentes a una
nueva solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
➤ Distribución de copias locales de librerías DLL . . . . . . . . 305
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Capítulo 10. Clases, métodos y propiedades 281

En capítulos anteriores tuvimos la oportunidad de trabajar con objetos que, necesariamente,


fueron derivaciones de alguna clase definida en la biblioteca de clases de .NET Framework.
Lo importante en este punto es saber que no siempre la biblioteca de clases de .NET Fra-
mework es la solución a nuestros problemas; seguramente hay algún proceso o cálculo
muy específico que nosotros deberemos desarrollar. Por esa razón es indispensable apren-
der a desarrollar una biblioteca de clases propias.

Definición de una clase


Antes de proceder a desarrollar una clase determinada, asegúrese de que no está desarro-
llada ya y que forme parte de la biblioteca de clases de .NET Framework; sería lamentable
invertir tiempo y esfuerzo en el desarrollo de una clase existente, ¿no?
Si ya está seguro de que no existe una clase que se ajuste a lo que usted necesita, proceda
10
entonces a generar una clase en Visual Basic.
Para crear una clase debe utilizar la siguiente sintaxis:

Class NombreClase
CódigoClase
End Class

Donde NombreClase es el nombre a través del cual la clase puede ser invocada. La instan-
ciación de la clase se deberá llevar a cabo por medio de este nombre. CódigoClase es el
contenido de la clase; como sabemos, el contenido de la clase se compone de datos (pro-
piedades) y comportamiento (métodos y funciones).
Por esa razón debemos definir dentro de la clase los procedimientos (Sub - End Sub), fun-
ciones (Function - End Function), y propiedades (Property - End Property) que de-
be tener, entre otros atributos.
Una clase, como ya sabe, es la definición formal de un objeto. Las clases por sí mismas no
pueden ser utilizadas; es necesario crear unidades funcionales de las clases, es decir, obje-
tos. Para ello debemos recurrir a un constructor, que es el código que genera la instancia
de una clase. En Visual Basic, un constructor típico sería:

Dim Objeto As New NombreClase( )

Donde Objeto es el nombre de la instancia de la clase y NombreClase es el nombre de la


clase que se está instanciando. New es la instrucción constructora por excelencia.
Una vez generada la instancia de la clase, podemos utilizar todos sus elementos: métodos,
funciones y propiedades.
282 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Definición de propiedades
Para una clase se puede, además de definir su comportamiento a través de métodos y fun-
ciones, especificar qué propiedades han de conformar su estado.
Las propiedades son las características particulares de un objeto; la clase debe definir qué
propiedades tendrán los objetos que deriven de ella. Para su definición, es necesario defi-
nir las propiedades dentro del bloque de código que compone la clase.
Las propiedades almacenan valores de un determinado tipo de dato; las operaciones que se
pueden hacer con dicho valor es leerlo (GET) o asignarlo (SET).
Las propiedades, aunque también son valores almacenados, tienen un manejo más formal
que las variables de memoria y, de hecho, requieren de una variable de memoria que per-
mita la verificación de los valores antes de su lectura o asignación.
La siguiente es la sintaxis de la definición de propiedades:

Class NombreClase
Dim Variable As TipoDatoPropiedad
Property NombrePropiedad As TipoDatoPropiedad
Get
CódigoLecturaValor
End Get
Set (VariableArgumento As TipoDatoPropiedad)
CódigoAsignaciónValor
End Set
End Property
...
...
End Class

Donde NombreClase es el nombre de la clase a la que pertenece la propiedad. Antes


de declarar la propiedad se debe declarar una variable de trabajo (Variable) del mismo ti-
po de dato que el que pretende almacenar la propiedad (TipoDatoPropiedad).
Para recuperar el valor que tiene la propiedad se usa CódigoLecturaValor, que es el bloque
de código que se encarga de recuperar el valor de la variable de paso, para considerarlo co-
mo valor de la propiedad.
Para asignarle un valor a una propiedad se utiliza una variable de trabajo (VariableArgu-
mento) que recibe, a manera de argumento, el valor que se pretende asignar a la propiedad.
CódigoAsignaciónValor es el bloque de código que se encarga de validar el valor que se
pretende asignar a la propiedad; en caso de que sea válido, realiza la asignación.
Capítulo 10. Clases, métodos y propiedades 283

En una clase se pueden definir tantas propiedades como se requieran en el programa y, por
supuesto, además se pueden definir métodos y funciones que formen parte de la misma.
Estos métodos y funciones pueden hacer uso de las propiedades con sólo referirlas por su
nombre.

Creación de bibliotecas de clases


(librerías)
En nuestros ejemplos hemos experimentado la definición de clases en el mismo capítulo
en donde se instancian y utilizan.
Este comportamiento no es común en desarrollos grandes, pues generalmente se definen 10
las clases de manera independiente al programa que las utiliza. De hecho, la biblioteca de
clases de .NET Framework es independiente de todo programa; uno simplemente invoca
una librería y utiliza los métodos (types) y propiedades que tiene.
Dicho de otra forma, hasta donde hemos visto, la clase se encuentra dentro del mismo en-
samblado (EXE) que el programa; ahora requerimos saber cómo hacer para que las clases se
encuentren en un archivo de vínculos dinámicos (DLL), que es independiente del ejecutable.

NOTA
En este texto, como toda la documentación técnica relativa al tema, se utilizan los términos
“biblioteca de clases” y “librería de clases” indistintamente. Tienen el mismo significado.

Modificadores de acceso
La idea es generar una librería de clases independiente de los programas ejecutables; es
apropiado pensar que dicha biblioteca estará disponible para su utilización por uno, dos o
más ejecutables (de ahí la razón de independizarla). Ello no significa, sin embargo, que
cualquier ejecutable pueda hacer uso de la biblioteca de clases; es posible que no queramos
limitar el acceso a la biblioteca de clases. Para ello podemos utilizar los denominados mo-
dificadores de acceso.
Los modificadores de acceso son calificadores de declaración que determinan el grado de
encapsulamiento de una clase.
El acceso se aplica a las entidades (clases, propiedades, métodos).
A continuación se muestran a grandes rasgos los modificadores de acceso:
284 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Palabra clave Definición


Public Las entidades pueden ser llamadas desde cualquier parte; también
se le conoce como acceso público.
Private Las entidades se pueden llamar sólo desde el contexto mismo de
su declaración. También se le conoce como acceso privado.
Friend El acceso friend permite el acceso a las entidades desde el mismo
programa en donde se hace su declaración.
Protected El acceso protegido permite el acceso a las entidades sólo desde la
misma clase, así como sus clases derivadas.
Protected Es la mezcla del acceso friend y el acceso protegido.
Friend

La forma de especificar los modificadores de acceso es colocándolos al principio de la de-


finición de las clases, propiedades y métodos.

Condiciones para la utilización


de las bibliotecas de clases
Las condiciones necesarias para la definición y utilización de una biblioteca de clases son
las siguientes:
❑ Proporcionar el modificador de acceso requerido.
❑ Compilar la biblioteca de clases como librería (/target:library).
❑ Establecer la referencia del ejecutable con respecto a la librería (/r:librería.dll).
Si usted desarrolla utilizando Visual Studio, podrá despreocuparse de establecer la mayoría
de las referencias y especificar la salida a DLL al momento de compilar, dado que la herra-
mienta se encarga de dar las indicaciones correspondientes.

Ejercicio 10.1
Creación de una clase con propiedades y métodos

En este ejercicio se generará una clase que contiene propiedades y métodos para su consu-
mo desde otros programas.
Capítulo 10. Clases, métodos y propiedades 285

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Class Library llamado Clase.
3. En Text Editor desplegará lo siguiente:

10
4. Cambie el nombre de la clase, sustituyendo Class1 por Areas.

➤ Uso de Code Snippets


5. Una de las costumbres más arraigadas de los programadores es utilizar en programas
nuevos código que ya han escrito antes. Con una operación de copiar y pegar se aho-
rra mucho tiempo, dado que hay código que requiere de pocas modificaciones para
funcionar en casi todos los programas. Visual Studio incorpora muchas pequeñas ruti-
nas de uso común con el fin de que sean integradas y modificadas para su utilización
en programas; a estos patrones de código preestablecidos se les da el nombre de Code
Snippets.
6. Una de las operaciones más comunes al codificar clases es la incorporación de propie-
dades, para lo cual debe de existir un code snippet. Colóquese dentro de la clase, des-
pliegue el menú contextual y seleccione Insert snippet...
286 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7. Aparecerá una herramienta parecida a Intellisense, que permite seleccionar los patro-
nes de código preestablecidos de Visual Studio. Seleccione Common Code Patterns.

8. Seleccione Properties and Procedures.

9. Seleccione Define a Property.


Capítulo 10. Clases, métodos y propiedades 287

10. Aparecerá el patrón de código preestablecido buscado. Observe cómo algunas partes
del código están sombreadas: son los elementos variables del code snippet. Se puede
navegar entre ellos utilizando las teclas TAB para ir al siguiente y BACKTAB para ir
al anterior. Al modificar un elemento variable, se modifica en todas las partes donde se
utiliza; esto es una ventaja con respecto al uso de copiar y pegar, dado que era común
olvidar sustituir todas las referencias, generando errores. En el elemento variable que
dice newPropertyValue escriba pBase. Presione TAB, con lo que debe desplazarse al
segundo elemento variable, que por el momento tiene el valor de Integer; cámbielo
por Decimal. Presione TAB y sustituya NewProperty por Base.
11. Vea cómo, automáticamente, se actualizan las referencias posteriores.

10

12. Después de la propiedad que se definió, agregue otra propiedad utilizando code snip-
pets. En el elemento variable que dice newPropertyValue escriba pAltura. Presione
TAB, con lo que debe desplazarse al segundo elemento variable, que por el momento
tiene el valor de Integer; cambie Integer por Decimal. Presione TAB y sustituya New-
Property por Altura. Por el momento su código debe lucir de la siguiente manera:
288 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

13. Después de la segunda propiedad, desde el menú contextual seleccione Insert snip-
pet...., y utilice el code snippet Common Code Patterns – Properties and Procedures
– Define a function. En el elemento variable MyFunc coloque el valor Rectangulo, en
Integer coloque Decimal, y en los paréntesis que indican el valor de retorno escriba
(Base * Altura).
14. Después de la función anterior, escriba otra: desde el menú contextual seleccione In-
sert snippet...., y utilice el code snippet Common Code Patterns – Properties and
Procedures – Define a function. En el elemento variable MyFunc coloque el valor
TrianguloRectangulo, en Integer coloque Decimal y en los paréntesis que indican
el valor de retorno escriba ((Base * Altura)/2).
15. El código debe haber quedado como sigue.

Codificación de Clase – Class1.vb

1 Public Class Areas


2
3 Private pBase As Decimal
4 Public Property Base() As Decimal
5 Get
6 Return pBase
7 End Get
8 Set(ByVal value As Decimal)
9 pBase = value
10 End Set
11 End Property
12
13 Private pAltura As Decimal
14 Public Property Altura() As Decimal
15 Get
16 Return pAltura
17 End Get
18 Set(ByVal value As Decimal)
19 pAltura = value
20 End Set
21 End Property
22
23 Function Rectangulo() As Decimal
24 Return (Base * Altura)
25 End Function
26
27 Function TrianguloRectangulo() As Decimal
28 Return ((Base * Altura) / 2)
29 End Function
30
31 End Class
Capítulo 10. Clases, métodos y propiedades 289

> Lo nuevo
En Visual Studio 2005 los code snippets formalizan lo que los desarrolladores hacían todo el
tiempo: copiar y pegar.

➤ Creación de un diagrama de clases y modificación


del mismo con Class Designer

16. Desde la barra de herramientas de Solution Explorer, seleccione View Class Diagram

. Aparecerá el diagrama de la clase (class diagram).

10

17. Al visualizar un diagrama de clases, Document Window invoca una herramienta


llamada Class Designer, que permite diseñar de forma visual y dinámica clases de
usuario.
18. Si hace clic en el icono para ver detalles , Class Designer se dividirá en dos pane-
les; en el superior quedará el diagrama de la clase en modo extendido, mientras que en
el inferior aparecerá la ventana Class Details, que mostrará la relación de propiedades,
métodos y eventos de la clase, además de permitir agregar o eliminar elementos. En ca-
so de que Class Details no aparezca de manera predeterminada, es posible invocar el
menú de contexto desde el diagrama de la clase y seleccionar View Class Details.
290 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Con el modificador de tamaño que tiene el diagrama de la clase en el extremo


derecho, amplíe la dimensión del diagrama, de tal forma que quede con un ancho del
doble.

20. En la barra de herramientas de Class Designer aparecerán los siguientes iconos:

Utilícelos alternadamente y vea las variaciones que tiene el diagrama de clase. Finalmente
seleccione el modo Display Full signature.
Capítulo 10. Clases, métodos y propiedades 291

21. La parte baja de Class Designer muestra la herramienta Class Details. Busque el apar-
tado Properties y haga clic en <add property>. Automáticamente se agregará una
línea en donde podrá especificar los elementos básicos de la propiedad. En la colum-
na Name coloque el valor Radio, en Type coloque Decimal, deje el Modifier como
Public, y finalmente en Summary escriba Valor de medida del radio.

10
➤ Uso del selector de documentos activos (Active Documents)

22. Si presiona las teclas Ctrl-Tab aparecerá el selector de documentos activos. En dicha
herramienta se podrán seleccionar las herramientas activas, así como los documentos.
Para seleccionar alguno de los elementos, puede hacer clic sobre la herramienta o do-
cumento, utilizando las flechas de dirección, o mantenga oprimida la tecla Ctrl mien-
tras oprime repetidamente la tecla Tab hasta que se seleccione el documento deseado.

23. Presione Ctrl y mantenga presionada la tecla. Ahora presione Tab en repetidas ocasio-
nes hasta que el programa en que codificamos la clase, Class1.vb (C:\APVBNETVS\
Ejercicios\Clase\Class1.vb) aparezca; cuando se haya seleccionado el archivo de-
seado, simplemente suelte la tecla Ctrl y el archivo aparecerá en Document Window.
292 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

24. Vea cómo lo que agregamos en Class Designer se ha agregado a nuestro código:

25. ¿Qué diferencias encuentra entre las propiedades definidas usando code snippets y la
propiedad definida desde Class Designer?

26. Regrese al diagrama de clase (ClassDiagram1.cd) y modifique la información de


Summary para todos los elementos de la clase:

Miembro Summary Tipo

Rectangulo Muestra el área de un Method


rectángulo

TrianguloRectangulo Muestra el área de un Method


triángulo rectángulo

Altura Valor de medida de la Property


altura

Base Valor de medida de la base Property

pAltura Variable de paso para altura Field

pBase Variable de paso para base Field

➤ Adición de métodos usando Class Designer


27. Agregar métodos utilizando Class Designer es casi tan sencillo como agregar propie-
dades. En el panel Class Details de Class Designer puede agregarlo en el apartado de
Methods, haciendo clic en <add method>.
Capítulo 10. Clases, métodos y propiedades 293

28. Otra forma de hacerlo es utilizando el icono para agregar nuevos miembros a
la clase. Haga clic en el icono New Method; aparecerá un menú en el cual debe selec-
cionar New Method.

10

29. Automáticamente se agregará una línea en donde podremos especificar los elementos bá-
sicos del método. En la columna Name coloque el valor Circulo, en Type coloque el ti-
po del valor de retorno, que en este caso es Decimal; deje el Modifier como Public.
30. En Summary haga clic en el botón Description . En Summary escriba Muestra el
área de un círculo y en Returns escriba Área del círculo (Decimal).
294 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

31. Al lado de cada miembro en Class Details aparece un pequeño icono que indica el ti-
po de miembro del que se trata. Al hacer doble clic sobre el icono de miembro, Visual
Studio permitirá la edición del miembro del que se trate.

Icono Miembro

Property

Method

Events

Field

32. Haga doble clic sobre el icono de miembro del método Circulo. El programa de-
berá ir al código en donde se defina el método.
33. Complemente el código, de tal forma que quede de la siguiente manera:

Codificación de Clase – Class1.vb – Circulo()

1 ‘’’ <summary>
2 ‘’’ Muestra el área de un círculo
3 ‘’’ </summary>
4 ‘’’ <returns>Área del circulo (Decimal)</returns>
5 Public Function Círculo() As Decimal
6 Return (3.1416D * (Radio ^ 2))
7 End Function

34. El código completo debe haber quedado de la siguiente forma:

Codificación de Clase – Class1.vb

1 Public Class Areas


2 ‘’’ <summary>
3 ‘’’ Variable de paso para base
4 ‘’’ </summary>
5 Private pBase As Decimal
6 ‘’’ <summary>
7 ‘’’ Valor de medida de la base
8 ‘’’ </summary>
9 Public Property Base() As Decimal
10 Get
11 Return pBase
12 End Get
13 Set(ByVal value As Decimal)
14 pBase = value
15 End Set
16 End Property
Capítulo 10. Clases, métodos y propiedades 295

17 ‘’’ <summary>
18 ‘’’ Variable de paso para altura
19 ‘’’ </summary>
20 Private pAltura As Decimal
21 ‘’’ <summary>
22 ‘’’ Valor de medida de la altura
23 ‘’’ </summary>
24 Public Property Altura() As Decimal
25 Get
26 Return pAltura
27 End Get
28 Set(ByVal value As Decimal)
29 pAltura = value
30 End Set
31 End Property
32 ‘’’ <summary>
33 ‘’’ Muestra el área de un rectángulo 10
34 ‘’’ </summary>
35 Function Rectangulo() As Decimal
36
37 Return (Base * Altura)
38 End Function
39 ‘’’ <summary>
40 ‘’’ Muestra el área de un triángulo rectángulo
41 ‘’’ </summary>
42 Function TrianguloRectangulo() As Decimal
43
44 Return ((Base * Altura) / 2)
45 End Function
46
47 ‘’’ <summary>
48 ‘’’ Valor de medida del radio
49 ‘’’ </summary>
50 Public Property Radio() As Decimal
51 Get
52
53 End Get
54 Set(ByVal value As Decimal)
55
56 End Set
57 End Property
58
59 ‘’’ <summary>
60 ‘’’ Muestra el área de un círculo
61 ‘’’ </summary>
62 ‘’’ <returns>Área del círculo (Decimal)</returns>
63 Public Function Círculo() As Decimal
64 Return (3.1416D * (Radio ^ 2))
65 End Function
66
67
68 End Class
296 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

35. En este programa, ¿cuántas líneas de código ha escrito usted sin la asistencia de
Visual Studio?
_____________________________

➤ Uso de Class View para examinar objetos


36. La herramienta Class View permite examinar y acceder a los objetos pertenecientes a
una solución y sus miembros correspondientes. Para ver esta herramienta seleccione
View – Class View (oprima la combinación de teclas Ctrl-Mayús-C). Class View se
compone de una barra de herramientas, una barra de búsqueda, un árbol de archivos y
miembros, y un panel de objetos y miembros.

FIGURA 10.1
Class View

37. En la barra de búsqueda de Class View escriba Base y haga clic en el botón Search ,
que aparece en la misma barra de búsqueda.
Capítulo 10. Clases, métodos y propiedades 297

38. Aparecerán en el árbol de archivos y miembros todos aquellos que contengan la pala-
bra Base, empezando con la que más concuerde con el patrón a buscar (que es la pro-
piedad que definimos en nuestra clase). Haga clic en el botón Back que aparece en la
barra de herramientas de Class View.
39. En el árbol de archivos y miembros busque el nodo Clase y expanda el árbol hasta co-
locarse en el miembro Areas. Observe cómo al seleccionar el nodo, todos sus miem-
bros aparecen en el panel de objetos y miembros. De esa forma se pueden examinar los
miembros de una clase y seleccionarlos para diferentes operaciones.

10

40. En el panel de objetos y miembros seleccione el miembro Circulo(), despliegue el


menú contextual y seleccione Go To Definition. De esa forma Visual Studio localiza-
rá el archivo de la solución en la cual el miembro fue codificado, permitiendo su edi-
ción. De esta forma se evita estar navegando por el Solution Explorer tratando de en-
contrar una clase y luego navegar entre el código para encontrar el código que define
el miembro.
298 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

41. Guarde los cambios en su solución.


FIN DEL EJERCICIO*

Ejercicio 10.2
Consumo de una clase a través de instancias

En este ejercicio se consumirá una clase. Para ello se generará una instancia (objeto) y se
utilizarán los métodos declarados en la clase.
Capítulo 10. Clases, métodos y propiedades 299

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Utiliza-
Clase.
3. En Solution Explorer seleccione UtilizaClase y despliegue el menú contextual. Selec-
cione Add Reference. En la ventana Add Reference seleccione la pestaña Projects y
seleccione el proyecto Clase. Con ello habilitamos a nuestra nueva aplicación para con-
sumir la funcionalidad de la clase que definimos en el ejercicio anterior. Haga clic en Ok.
4. Agregue las líneas necesarias para hacer type safe a su programa; importe el espacio
de nombres System con la clase Console.
5. En Text Editor mostrará lo siguiente:

10

6. Importe un nuevo espacio de nombres que le permita tener acceso a los recursos de la clase
con la cual establecimos referencia. Escriba la siguiente línea antes del bloque de módulo:

Imports Clase

7. Vea cómo Intellisense ya reconoce la existencia de nuestra clase.


300 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

8. Dentro del módulo deberá generar una instancia de la clase Areas. Para ello deberá es-
cribir la siguiente línea de código, que declara una variable (X) de tipo Areas (con ello
se reserva en memoria un espacio para manejar una variable que alojará un objeto
construido a partir de nuestra clase, con toda la funcionalidad que le hayamos codifi-
cado):

Dim X As Areas

9. Declarar la variable no implica que ya tengamos un objeto. Simplemente tenemos re-


servado un lugar para guardar el objeto, pero el objeto aún no existe. Para generarlo
necesitamos hacer uso de un constructor, lo que implica utilizar la instrucción New. Pa-
ra generar un objeto a partir de Areas, y almacenar dicho objeto en el área que hemos
reservado, utilizamos la siguiente línea:

X = New Areas()

10. A través de la variable X ya podemos hacer uso de toda la funcionalidad programada


en la clase. El código de los puntos 8 y 9 puede simplificarse, instanciando al momen-
to en que declaremos, dando una línea como la que sigue:

Dim X As New Areas

11. Vea cómo Intellisense ya reconoce la existencia de nuestra clase y sus miembros. In-
cluso da la información que nosotros establecimos como comentario.
Capítulo 10. Clases, métodos y propiedades 301

12. El código completo debe haber quedado de la siguiente manera:

Codificación de UtilizaClase – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5 Imports Clase
6
7
8 Module Module1
9
10
11
Sub Main()
Dim X As New Areas
10
12
13 X.Altura = 10D
14 X.Base = 20D
15
16 WriteLine(“—- Áreas calculadas ———-”)
17 WriteLine(“Rectángulo: “ & CType(X.TrianguloRectangulo(), String))
18
19 Write(“Presione INTRO para continuar”)
20 ReadLine()
21 End Sub
22
23 End Module

Ejecución guiada de UtilizaClase – Module1.vb

13. Construya la solución (oprima la combinación de teclas Ctrl-Mayús-B). Establezca el


nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios
que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para com-
probar el comportamiento de su programa (oprima la tecla F5).
14. La línea 5 importa el espacio de nombres Clase, que está disponible gracias a que es-
tablecimos la referencia con la librería Clase. En la línea 11 se declara una variable
que tiene como origen nuestra clase Areas; en la misma línea de declaración se gene-
ra la instancia del objeto, utilizando el constructor New.
15. Se proporciona valor a las propiedades Altura y Base del objeto (líneas 13 y 14), y se
utiliza el método TrianguloRectangulo() para comprobar la funcionalidad de la cla-
se. Como TrianguloRectangulo() retorna un valor Decimal, se realiza la conversión
a String para evitar problemas en la concatenación.
302 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. Como proporcionamos un valor 10 para la altura y 20 para la base, el resultado es el


siguiente:
—- Áreas calculadas ———-
Rectángulo: 100
Presione INTRO para continuar

➤ Uso de Object Browser


17. Visual Studio provee una herramienta llamada Object Browser, que permite ver infor-
mación de las clases y sus comentarios.
18. Seleccione en Class View el miembro Circulo() de la clase Area de nuestro proyec-
to Clase. Despliegue el menú contextual y seleccione Browse Definition. Vea cómo
aparece, además de la información usual presentada por Class View, un apartado que
muestra la información de los comentarios que especificamos al crear el método. Es
muy importante colocar información valiosa en los comentarios, a fin de que sean de
utilidad al ser consultados en Object Browser. No está de más decir que si hacemos
doble clic sobre alguno de los miembros en Object Browser, Visual Studio nos trasla-
dará al código de definición.

➤ Visualización de referencias
19. Visual Studio mantiene un complejo sistema de referencias a recursos, de tal forma que
todos estén disponibles casi de cualquier parte. Para llegar al código de definición de un
Capítulo 10. Clases, métodos y propiedades 303

miembro de una clase, por ejemplo TrianguloRectangulo(), basta hacer doble clic
sobre TrianguloRectangulo () en Class View, o hacer doble clic sobre Triangulo-
Rectangulo () en Object Browser, e incluso en Text Editor, colocándonos sobre
TrianguloRectangulo() y seleccionando Go To Definition en el menú de contexto.

10

20. Internamente, Visual Studio conoce dónde se encuentra todo lo que utilizamos en un
programa. Vaya a Solution Explorer y, desde el nodo UtilizaClase, despliegue el me-
nú contextual y seleccione Build. Vea la ventana Output y percátese de que no sólo se
construyó el proyecto UtilizaClase, sino también Clase, dado que contiene clases
que son utilizadas por UtilizaClase.
304 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

21. Edite el código de Module1 de UtilizaClase. Coloque el puntero del ratón sobre
TrianguloRectangulo() y despliegue el menú contextual; seleccione Find All Refe-
rences. Aparecerá una ventana llamada Find Symbols Results, que mostrará todas las
referencias físicas que permiten a Visual Studio encontrar todos los recursos que su
programa necesita.

22. Por supuesto, al hacer doble clic en cualquiera de los elementos, Visual Studio nos tras-
ladará al código de definición correspondiente.
23. Guarde los cambios en su solución.
FIN DEL EJERCICIO *

Ejercicio 10.3
Uso de clases en soluciones diferentes

En este ejercicio realizará los trabajos necesarios para poner a disposición de todos los de-
sarrolladores la funcionalidad de una clase. Es común que un grupo de desarrolladores, en
ambientes profesionales, generen librerías comunes que de forma estandarizada son utili-
zadas en todas las soluciones que construyen. Usos comunes son clases para gobernar la se-
guridad de las aplicaciones, clases para el acceso eficiente a los datos, clases para interfa-
ces de usuario uniformes, etcétera. Sólo un grupo de desarrolladores son los encargados de
fabricar las librerías, mientras que todos los demás desarrolladores, en todos los demás pro-
yectos, las utilizan. Veamos cómo se logra esto usando Visual Studio.

➤ Integración de proyectos existentes a una nueva solución


1. Genere una nueva solución, llamada Calculos. Seleccione File – New – Project. Se-
leccione en Project types la opción Other Project types - Visual Studio Solutions, y
seleccione en Templates la opción Blank Solution. En Name coloque Calculos y en
Location especifique C:\APVBNETVS.
Capítulo 10. Clases, métodos y propiedades 305

2. Agregue a la solución un proyecto Windows – Console Application, llamado Prueba-


Libreria.
3. En Solution Explorer seleccione PruebaLibreria y despliegue el menú contextual.
Seleccione Add Reference. En la ventana Add Reference seleccione la ficha Projects.
Como puede ver, no aparece ningún proyecto, por lo cual no encontramos la librería
Clase que definimos en el proyecto anterior.
4. Seleccione la pestaña .NET y busque Clase. Como podrá comprobar, tampoco apare-
ce nuestra biblioteca dentro de las que se encuentran registradas en GAC (Global As-
sembly Caché). Haga clic en Cancel.
5. Hay que agregar un elemento existente, en este caso el proyecto Clase de la solución
Ejercicios. Proceda de la siguiente forma: seleccione la solución Calculos, desplie-
gue el menú contextual y seleccione Add – Existing project. Seleccione el proyecto
de la librería, que se identifica por el archivo Clase.vbproj (Visual Basic Project) ubi- 10
cado en el directorio C:\APVBNETVS\Ejercicios\Clase.
6. Si en este momento intenta agregar una referencia, se dará cuenta de que el proyecto
de librería Clase ya aparece dentro de la pestaña Projects de Add Reference, con lo
cual normalmente podrá establecer la referencia sin problemas. El problema es que de-
berá realizar este proceso en cada proyecto en el que desee utilizar la funcionalidad de
la clase; ello implica dar permisos sobre los objetos de la librería y exponer el conte-
nido del código a modificaciones no autorizadas. Los problemas no paran ahí: imagi-
ne que la librería incluya código de cifrado a datos sensibles, todo el mundo sabrá có-
mo se codificó el algoritmo de seguridad. En realidad agregar el proyecto a la nueva
solución no es lo que queríamos hacer, sino disponer de la funcionalidad de la libre-
ría, sin saber nada más respecto al código o la composición.
7. Elimine el proyecto Clase que acaba de agregar. Para ello, seleccione en Solution Ex-
plorer el nodo Clase, despliegue el menú contextual y seleccione Remove. Al solici-
tarse la confirmación de eliminación, confírmela. Esto no impacta físicamente al pro-
yecto, solamente elimina la referencia de la solución.

➤ Distribución de copias locales de librerías DLL


8. Una buena práctica es hacer una copia local de la librería DLL en el directorio de tra-
bajo de la nueva solución. Copie el archivo Clase.DLL que se encuentra en C:\APVB-
NETVS\Ejercicios\Clase\Bin\Debug, y péguelo en C:\APVBNETVS\Calculos. Aun-
que la referencia podría hacerse directamente en el archivo original, se recomienda el
uso de copias locales para que al momento de integrar paquetes de instalación el con-
junto de recursos esté más organizado.
9. En Solution Explorer seleccione el nodo Calculos, despliegue el menú contextual y
seleccione Add Existing Item. Aparecerá una ventana que le permitirá seleccionar ar-
chivos. Seleccione la copia local de la DLL que está en C:\APVBNETVS\Calculos.
306 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. En Solution Explorer seleccione el nodo PruebaLibreria. Despliegue el menú con-


textual y seleccione Add Reference. Seleccione la pestaña Browse. Seleccione el ar-
chivo Clase.DLL que se encuentra en C:\APVBNETVS\Calculos. De esa forma dispo-
nemos de la funcionalidad del ensamblado, sin entrar en los pormenores de su
desarrollo, desde una copia local.
11. Abra desde Solution Explorer el código de Module1.vb de PruebaLibreria. Agregue
un Imports, vea Intellisense y note que ya se puede disponer de la clase.

12. Guarde los cambios de su solución.


FIN DEL EJERCICIO*
Capítulo 10. Clases, métodos y propiedades 307

MAPA MENTAL DEL CAPÍTULO

10
308 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

Class, 281 Friend, 284 Object Browser, 302 Friend, 284


Designer, 289 GET, 282 Private, 284 Public, 284
Code Snippets, 285 Librerías, 283 Property, 282 SET, 282
Diagrama de la Modificadores de Propiedades, 282
clase, 289 acceso, 283 Protected, 284

PREGUNTAS
10.1 ¿Cuál es la sintaxis para declarar una clase?
10.2 ¿Cuál es la sintaxis para declarar una propiedad?
10.3 Explique los modificadores de acceso y su impacto en los elementos de una clase.
10.4 Explique el procedimiento para crear una biblioteca o librería.
10.5 ¿Qué especificaciones deben hacerse en un programa para que pueda consumir la
funcionalidad de una clase que se encuentra en una librería externa?
Capítulo 10. Clases, métodos y propiedades 309

Notas:

10
310 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Es la definición formal de un objeto:
a) Clase
b) Propiedad
c) Método

2. Es la instrucción constructora por excelencia:


a) New
b) CreateObject
c) Dim

3. Son las características particulares de los objetos:


a) Métodos
b) Clases
c) Propiedades

4. Calificadores de declaración que determinan el grado de encapsulamiento de una clase:


a) Agregados
b) Delegados
c) Modificadores de acceso

5. Es la especificación de destino (target) que aplica para las bibliotecas de clase, al momento de compi-
lar para generar un DLL:
a) Library
b) Class
c) Binary

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Las clases que pertenecen a la biblioteca de clases de .NET Framework pueden utili-
zarse directamente, sin necesidad de instanciación, pero las creadas por el usuario no.
7. Una librería DLL puede ser utilizada sólo por un ensamblado, ya que la información
de ésta queda registrada en metadatos.
8. Se pueden definir tantas propiedades al objeto como nuestros programas requieran.
9. Para utilizar una librería desde un programa que le es ajeno, es necesario establecer
la referencia al compilar mediante el argumento /r

10. Una clase Public puede ser utilizada por todos los programas y procedimientos de
una aplicación.
CAPÍTULO 11
Herencia y
polimorfismo
Objetivos: Aprender la implementación de herencia y polimorfismo de los
objetos.

1. Aprenderá qué es la herencia entre objetos y cuándo se debe utilizar.


2. Conocerá los modificadores de funcionalidad de los objetos para progra-
mar adecuadamente la herencia en una jerarquía de clases.
3. Sabrá qué son MyBase y MyClass, y cuándo utilizarlas.
4. Aprenderá en qué consiste el polimorfismo y cómo establecerlo de ma-
nera programática.

311
312 Aprenda Practicando Visual Basic 2005 usando Visual Studio

Contenido
Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
¿Cuándo se debe utilizar la herencia? . . . . . . . . . . . . . . . . . . . . . . . . . 313
Inherits (Heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Notlnheritable (No heredable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Mustlnherit (Debe heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Modificadores de acceso, necesarios para la herencia . . . . . . . . . . . . . 315
Programación de clases base y clases derivadas . . . . . . . . . . . . . 315
➤ Adición de clases a un módulo usando Class Designer . . 316
Estatutos auxiliares para el manejo de herencia y polimorfismo . . . . . . . . . . 323
NotOverridable (No reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overridable (Reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
MustOverridable (Debe reemplazarse) . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overrides (Reemplaza) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overloads (Sobrecarga/Sustituye) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
MyBase y MyClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Comprobación del polimorfismo basado en herencia
y el uso de MyBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
➤ Especificación de modificadores de herencia
usando Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Capítulo 11. Herencia y polimorfismo 313

El manejo de propiedades, métodos y eventos es sólo el principio de la programación orien-


tada a objetos; las características principales de la POO descansan en la capacidad de los ob-
jetos para trabajar en colaboración con otros objetos, y de aprovechar total o parcialmente
su funcionalidad mediante la reutilización de código según lo requieran las aplicaciones.
En el presente capítulo estudiaremos los principios que permiten el máximo aprovecha-
miento del código a través de POO y con sus dos capacidades características: herencia y
polimorfismo.

Herencia
La herencia (inheritance) es un concepto fundamental de la programación orientada a ob-
jetos, y consiste en la capacidad de definir clases que sirven como base de otras clases, evi-
tando la redundancia en la definición de elementos como métodos, eventos y propiedades.
Hay una clase base y una o varias clases derivadas; las clases derivadas aprovechan todo
lo declarado en la clase base, asumiéndolo como suyo y utilizando capacidades que no es-
tán codificadas en ellas.
Las clases derivadas pueden heredar, e incluso extender, las propiedades, los métodos y los
eventos de la clase base. Es posible también que las clases derivadas sustituyan o modifi- 11
quen (override) la funcionalidad de los métodos de la clase base.
En Visual Basic, por omisión, todas las clases pueden heredarse.
Las ventajas de la herencia son muchas, pero la principal es que el desarrollador tendrá que
escribir y depurar el código sólo una vez, para una clase, y disponer en muchas clases de
la misma funcionalidad, estableciendo las referencias adecuadas.

¿Cuándo se debe utilizar la herencia?


La herencia entre clases no debe utilizarse por el simple hecho de que el lenguaje lo per-
mite. La herencia debe planearse; el desarrollador debe pensar cómo han de ser las clases,
organizándolas en lo que se conoce como jerarquía de clases.
Se recomienda una jerarquía de clases cuando entre las clases se presenta una relación de tipo
Es-un (is-a); debe evitarse el uso de herencia cuando se trata de relaciones Tiene-un (has-a).
Una clase que contiene las características de los automóviles en general (Automóviles) tie-
ne mucho que compartirle a una clase que almacena las particularidades de los automóvi-
les deportivos (AutomóvilesDeportivos), pues un automóvil deportivo, antes que ser de
tipo deportivo, es un automóvil (is-a). Ahora pregúntese, ¿qué comparte un dueño de un
automóvil y un automóvil? Automóviles y DueñosAutomóviles, no comparten rasgos. Las
personas que poseen automóviles no se derivan de los automóviles, ni viceversa. Que una
persona tenga un (has-a) automóvil, no quiere decir que comparta con éste sus métodos,
314 Aprenda Practicando Visual Basic 2005 usando Visual Studio

propiedades y eventos. Imagínese tener que determinar el tipo de transmisión, número de


puertas y número de serie que una persona posee. Simplemente, de una cosa no puede de-
rivar la otra.
Se recomienda una jerarquía de clases, obviamente, sólo si el código de una clase brinda
alguna funcionalidad que se pueda reutilizar; tratar de heredar aspectos muy particulares
que sólo son pertinentes para una clase no tiene sentido.

Inherits (Heredar)
El estatuto Inherits se utiliza para especificar que una clase de nueva creación tiene co-
mo base una clase ya existente. La clase nueva es la clase derivada (derived class); la cla-
se ya existente es la clase base (base class).
La sintaxis es la siguiente:

Class NombreClaseDerivada
InheritsNombreClaseBase
...
End Class

En este caso, la clase derivada dispone de todos los elementos declarados en la clase base.

NotInheritable (No heredable)


Ya decíamos que por omisión todas las clases en Visual Basic pueden heredarse. Habrán
ocasiones en que no queramos que una clase pueda heredarse; en tal caso, hay que especi-
ficar, al declarar una clase, que ésta no es heredable. La sintaxis para ello es la siguiente:

NotInheritable Class NombreClase


...
End Class

En este caso, intentar heredar NombreClase generaría un error (Inherits NombreClase).

MustInherit (Debe heredar)


Como sabemos, los objetos son instancias de una clase. Ya explicábamos que no se puede
tener acceso a la funcionalidad de una clase sino a través de una instancia de la misma, es
decir, de un objeto basado en la clase. Eso es verdadero sólo relativamente.
¿Habrá alguna forma de que podamos disponer de la funcionalidad de una clase sin gene-
rar una instancia de la misma?
La respuesta es que sí. Podemos declarar una clase que no pueda instanciarse pero que pue-
da ser utilizada sólo si se hereda por otra clase. Para hacer eso es necesario especificar el
estatuto MustInherit.
Capítulo 11. Herencia y polimorfismo 315

La sintaxis es la siguiente:
MustInherit Class NombreClase
...
End Class

En este caso, instanciar NombreClase generaría error (Dim Objeto As New NombreClase())

NOTA
Algunos lenguajes como C++ y C#, llaman a las clases calificadas como MustInherit, como cla-
ses abstractas (abstract class).

Modificadores de acceso, necesarios para la herencia


Usted debe determinar el alcance que tendrá su jerarquía de clases, a efecto de restringir el
acceso a las clases, de tal manera que sólo puedan heredarlas aquellas porciones de código
que deban hacerlo.
Calificar una clase como clase pública (public class), se logra utilizando el modificador de 11
acceso Public al momento de la declaración de la clase. Esto garantiza que todas las cla-
ses podrán utilizar la clase todo el tiempo; en este caso, el acceso es abierto.
Si no quiere una clase de acceso abierto, puede restringir el acceso a la clase utilizando los
modificadores de acceso Friend y Private.
Tome en cuenta que en una jerarquía de clases el acceso puede heredarse sólo hacia un ac-
ceso igual o mayor, nunca menor: una clase con acceso Public no puede heredar una cla-
se Friend o Private, y una clase Friend no puede heredar una Private.
En este ejercicio se generará una clase base y una clase derivada, y se comprobará la he-
rencia entre ellas.

Ejercicio 11.1
Programación de clases base y clases derivadas

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Herencia.
3. Abra Class View (oprima las teclas Ctrl-Mayús-C) y colóquese en el nodo Herencia
– Herencia; despliegue el menú contextual y seleccione View Class Diagram.
316 Aprenda Practicando Visual Basic 2005 usando Visual Studio

4. Se desplegará Class Designer.

➤ Adición de clases a un módulo usando Class Designer


5. Colóquese en cualquier parte del diagrama de clase y despliegue el menú contextual.
Seleccione Add – Class.
Capítulo 11. Herencia y polimorfismo 317

6. Aparecerá la ventana New Class. En este programa queremos codificar clases en el


programa de consola que ya comenzamos a construir (Module1.vb). Asignamos en
Class Name el nombre MiClaseBase, en Access dejamos el valor de Public, y en
File name especificamos que queremos agregar la clase a un archivo existente (Add
to existing file), colocando el nombre de nuestro programa de consola (Module1.vb).

7. Con ello se habrá agregado a nuestro programa de consola una clase. Como podrá sos-
pechar, las clases no sólo se pueden codificar como proyectos independientes, sino
también integrarse perfectamente en otros proyectos.
11
8. Aparecerá nuestra nueva clase en el diagrama de clase. Seleccione la nueva clase, des-
pliegue el menú contextual y seleccione Class Details.
318 Aprenda Practicando Visual Basic 2005 usando Visual Studio

9. Utilizando Class Details, agregue a MiClaseBase dos métodos, llamados Mensaje1()


y Mensaje2(). En la columna Type no coloque nada, debido a que los métodos no de-
volverán valores.

10. Haga las modificaciones pertinentes para que nuestro código luzca como sigue. En
esencia se hace al programa strong type, se importa un espacio de nombres, se colocan
en Main() líneas para que el programa espere una tecla y se provee de comportamien-
to a los métodos de MiClaseBase.

Codificación de Herencia – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10
11 Write(“Presione INTRO para continuar”)
12 ReadLine()
13 End Sub
14
15 End Module
16
17 Public Class MiClaseBase
18
19 ‘’’ <summary>
20 ‘’’ Envía primer mensaje
21 ‘’’ </summary>
22 Public Sub Mensaje1()
23 WriteLine(“Clase Base - Mensaje 1”)
24 End Sub
Capítulo 11. Herencia y polimorfismo 319

25
26 ‘’’ <summary>
27 ‘’’ Envía segundo mensaje
28 ‘’’ </summary>
29 Public Sub Mensaje2()
30 WriteLine(“Clase Base - Mensaje 2”)
31 End Sub
32 End Class

11. Regrese al diagrama de clase del programa Herencia, agregue una nueva clase (Add
– Class); en Class name especifique MiClaseDerivada, en Access especifique Public,
y en File name seleccione Add to existing file, especificando nuestro programa, es de-
cir, Module1.vb.

11

12. Seleccione en el diagrama de clase el objeto MiClaseDerivada, despliegue el me-


nú contextual y seleccione Class Details. Agregue un método, cuyo nombre sea
Mensaje3().
320 Aprenda Practicando Visual Basic 2005 usando Visual Studio

13. Complemente el código de tal forma que luzca de la siguiente manera:

Codificación de Herencia – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Dim MiObjeto As New MiClaseDerivada
11 MiObjeto.Mensaje1()
12 MiObjeto.Mensaje2()
13 MiObjeto.Mensaje3()
14 Write(“Presione INTRO para continuar”)
15 ReadLine()
16 End Sub
17
18 End Module
19
20 Public Class MiClaseBase
21
22 ‘’’ <summary>
23 ‘’’ Envía primer mensaje
24 ‘’’ </summary>
25 Public Sub Mensaje1()
26 WriteLine(“Clase Base - Mensaje 1”)
27 End Sub
28
29 ‘’’ <summary>
30 ‘’’ Envía segundo mensaje
31 ‘’’ </summary>
32 Public Sub Mensaje2()
33 WriteLine(“Clase Base - Mensaje 2”)
34 End Sub
35 End Class
36
37 Public Class MiClaseDerivada
38 Inherits MiClaseBase
39
40 ‘’’ <summary>
41 ‘’’ Envía tercer mensaje
42 ‘’’ </summary>
43 Public Sub Mensaje3()
44 WriteLine(“Clase Base - Mensaje 2”)
45 End Sub
46 End Class
Capítulo 11. Herencia y polimorfismo 321

Ejecución guiada de Herencia – Module1.vb

14. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
15. En un módulo lo que se ejecuta es el procedimiento principal, llamado Main(), líneas
22 a la 30.
El módulo completo tiene dos clases: MiclaseBase, de la línea 20 a la 35, y MiClase-
Derivada, de la línea 37 a la 46.

MiClaseBase tiene dos métodos: Mensaje1( ), de la línea 22 a la 27, y Mensaje2( ),


de la línea 29 a la 34. MiClaseDerivada tiene un solo método: Mensaje3( ), de la lí-
nea 40 a la 45.
Tome en cuenta que la clase MiClaseDerivada no posee los métodos Mensaje1() y
Mensaje2(),pues la que los posee es la clase MiClaseBase.
Lo más importante de este programa es que MiClaseDerivada hereda la funcionalidad 11
de MiClaseBase al aplicar la instrucción Inherits, en la línea 38; aun cuando Mensa-
je1() y Mensaje2() no están declaradas en MiClaseDerivada, ya forman parte de di-
cha clase, debido a que son tomadas de la clase base. La integración es tal que, al es-
tar codificando el programa, Intellisense reconoce los miembros de MiClaseBase
como parte de MiClaseDerivada.
322 Aprenda Practicando Visual Basic 2005 usando Visual Studio

16. En la línea 10 se tiene un constructor que genera una instancia de la clase MiClaseDe-
rivada bajo el nombre de MiObjeto. Observe cómo las líneas 11 y 12 hacen uso de
métodos no declarados en la clase MiClaseDerivada; esto es posible gracias a que,
al haber establecido una relación de herencia con MiClaseBase, la clase derivada dis-
pone automáticamente de todos los métodos, propiedades y eventos declarados en la
clase base.
De esta forma, MiClaseDerivada sólo declarará cosas que no están declaradas en Mi-
ClaseBase. Declarar los mismos métodos en ambas clases sería redundante.
Tome en cuenta las dimensiones que puede tomar su jerarquía de clases, ya que si he-
reda una clase que a su vez es derivada de otra clase, se hereda también la funcionali-
dad de la clase base de ésta.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Clase Base - Mensaje 1


Clase Base - Mensaje 2
Clase Base - Mensaje 2
Presione INTRO para continuar

17. Si consultamos el diagrama de clase, nos daremos cuenta que reconoce ya la relación
de herencia existente entre nuestras dos clases.

FIN DEL EJERCICIO *


Capítulo 11. Herencia y polimorfismo 323

Estatutos auxiliares para el manejo


de herencia y polimorfismo
En ocasiones heredamos una clase, pero nos damos cuenta que algunas entidades (méto-
dos, propiedades, eventos) no se ajustan del todo a lo que verdaderamente necesitamos; en
Tiempos de resumen, no nos sirven tal y como fueron heredadas. Es posible que pensemos que los ele-
compilación
de CLR mentos heredados son útiles, pero que lo serían más con algunas pequeñas modificaciones.
Dichas modificaciones se realizan en la clase derivada, respecto de las definiciones origi-
nales existentes en la clase base.
La programación orientada a objetos hace posible que eso suceda, pues permite implemen-
tar diferentes comportamientos para un método (override), o de plano reemplazarlo por
completo (overload). La funcionalidad heredada puede modificarse por otra que sea más
indicada para el problema de programación que deseamos resolver; con ello se promueve
que la reutilización del código sea flexible y adaptable.
Por omisión, una clase derivada hereda los métodos y propiedades de su clase base. Si ne-
cesitamos que una propiedad o método heredado se comporte de manera distinta a como
se definió en la clase base, puede ser implementada de forma distinta (overridden) o reem- 11
plazada (overloaded); esto quiere decir que la herencia sirve hasta donde nosotros desea-
mos comenzar a hacer modificaciones.
Los estatutos auxiliares de herencia sirven para especificar el grado de modificación que
ha de darse entre la clase derivada y la clase base; estos son: Overridable, NotOverrida-
ble, Overrides, MustOverride y Overloads.

En cuanto a la clase base hay tres escenarios:

FIGURA 11.1
Estatutos
auxiliares para
el manejo de
herencia
324 Aprenda Practicando Visual Basic 2005 usando Visual Studio

NotOverridable (No reemplazable)


El primer escenario es que la clase base no acepte que su funcionalidad sea modificada o
sustituida. En ese caso, el estatuto NotOverridable evita que una propiedad o método de
una clase base pueda ser sustituido en una clase derivada. Por omisión, los métodos públi-
cos en una clase base son NotOverridable.

Overridable (Reemplazable)
El segundo escenario es que la clase base admita modificaciones o sustituciones a su funcio-
nalidad. El estatuto Overridable establece que una propiedad o método (elemento) de una
clase base puede ser modificado en su implementación o sustituido en una clase derivada.

MustOverride (Debe reemplazarse)


El tercer escenario es que la modificación a la funcionalidad de la clase base no sólo sea
posible, sino que sea obligatoria. El estatuto MustOverride hace que sea obligatorio hacer
variaciones, en la clase derivada, de las propiedades o método de la clase base que han si-
do heredados.
Del lado de la clase derivada hay dos escenarios, que sólo son posibles si los elementos de
la clase base permiten modificaciones en la funcionalidad.

Overrides (Reemplaza)
El primer escenario es cuando la clase base permite que su funcionalidad sea modificada,
respetando la estructura original del elemento modificado. El estatuto Overrides permite la
variación en la clase derivada, de sus propiedades o sus métodos. Esto será siempre y cuan-
do se mantengan los mismos argumentos en el método de la clase base y la clase derivada.
Overrides sólo permite desarrollar en la clase derivada una implementación distinta de un
elemento de la clase base, y no su sustitución por otro que no guarde semejanza.

Overloads (Sobrecarga/Sustituye)
El segundo escenario es que se desee sustituir la funcionalidad, sin necesidad de respetar
estructuras o condiciones precedentes.
En ocasiones, además de modificar el comportamiento de los métodos que participan en
una relación de herencia, es necesario hacer uso de diferentes argumentos, ya sea porque
los que se tienen deben considerar otros tipos de datos, o bien, porque el método que mo-
Capítulo 11. Herencia y polimorfismo 325

difica al heredado de la clase base requiere una cantidad distinta de argumentos. En este
caso, ya no hablamos de una implementación distinta de lo mismo, sino de dos métodos
bastante distintos entre sí que comparten un nombre.
En este último caso, Overrides no sirve pues exige igualdad de argumentos. Para poder
lograr nuestro cometido, debemos utilizar Overloads, que indica la sustitución del méto-
do de la clase base por otro de la clase derivada, tengan o no relación entre sí. Overloads
es la única forma de implementar, bajo un mismo nombre, dos métodos que no coinciden
más que en el nombre.

MyBase y MyClass
Se puede utilizar la palabra reservada MyBase para llamar a ejecución a un método de la
clase base desde una clase derivada. Esto quiere decir que a) si existe herencia entre dos
clases, y b) en la clase derivada se modifica un método, entonces c) es posible mandar lla-
mar a ejecución al método, ya sea en la forma en que se encuentra en la clase base, o en la
forma en que se encuentra en la clase derivada misma.
Con MyBase podemos obligar a la aplicación a que utilice un método de la clase base y no
de la clase derivada; en caso contrario, es posible que queramos mandar llamar el método 11
tal y como está en la clase derivada. Para ello utilizamos la palabra reservada MyClass, que
se encarga de llamar a ejecución un método que se encuentra en la misma clase cuando és-
ta es derivada.
Es importante saber que tanto MyBase como MyClass, aunque en su manejo parecen obje-
tos, realmente no lo son. No se instancian; existen porque el lenguaje los proporciona pa-
ra un manejo más flexible de la herencia y el polimorfismo.

Polimorfismo
El polimorfismo es la habilidad que tiene el lenguaje para definir múltiples clases que
contengan métodos y propiedades del mismo nombre, pero que brindan diferente funcio-
nalidad.
Cuando se presenta el polimorfismo es posible elegir, en tiempo de ejecución, aquellos mé-
todos o propiedades que necesitamos. No importa que varias clases posean los mismos
métodos y las mismas propiedades: la aplicación debe ser capaz de utilizar precisamente
aquellas cuya funcionalidad estemos invocando.
La herencia y la sustitución de métodos y propiedades tienen mucho que ver con el poli-
morfismo. Cuando se declara una clase y a partir de ésta se derivan otras clases, estamos
ante la presencia de la herencia; si además de esto, los métodos y propiedades de la clase
326 Aprenda Practicando Visual Basic 2005 usando Visual Studio

base que fueron heredados son modificados (Overriden) o sustituidos (Overloaded) en la


clase derivada, de tal manera que comparten el mismo nombre pero no la misma funciona-
lidad, estamos ante el polimorfismo. Una manifestación aún más pura del polimorfismo se
presenta cuando se utiliza Overloads, que implica una sustitución completa de métodos
que se encuentran en clases que guardan una relación de herencia.
Cuando en una clase derivada se modifican métodos o propiedades de la clase base, se di-
ce que hay polimorfismo basado en herencia.

Ejercicio 11.2
Comprobación del polimorfismo basado en herencia y el uso de MyBase

En este ejercicio se comprobará el polimorfismo basado en herencia; para ello se definirán


varias clases, se heredarán unas con otras y se verá el uso de la palabra reservada MyBase.
El programa calculará lo que se le pagará a los empleados, partiendo del supuesto que pue-
de haber pago normal, agregarse un bono por puntualidad del 25 por ciento, e incluso un
bono adicional del 20 por ciento.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue su solución un proyecto Windows – Console Application, llamado Nomina.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de Nomina – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Const PagoXHoraVig As Decimal = 120D
8 Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11
12 End Sub
13
14 End Module
Capítulo 11. Herencia y polimorfismo 327

4. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina –
Nomina y haga clic en el icono View Class Diagram.
5. Agregue, usando Class Designer, una clase llamada Pago, que será pública y que se
agregará al programa de consola que estamos trabajando.

11
➤ Especificación de modificadores de herencia
usando Properties

6. En el diagrama de clase seleccione la clase Pago que acaba de agregar, invoque Class
Details y agregue un método de nombre CalculaPago, que será público y que devol-
verá un valor Decimal. En Class Details seleccione el método que acaba de agregar y
despliegue el menú contextual; seleccione la opción Properties.
328 Aprenda Practicando Visual Basic 2005 usando Visual Studio

7. En la propiedad Inheritance modifier seleccione el valor Overridable.

8. En este punto, nuestro código debe lucir de la siguiente manera:

Codificación de Nomina – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Public Const PagoXHoraVig As Decimal = 120D
8 Public Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11
12 End Sub
13
14 End Module
15
16 Public Class Pago
17
18 ‘’’ <summary>
19 ‘’’ Cálculo del pago neto
20 ‘’’ </summary>
21 Public Overridable Function CalculaPago() As Decimal
22
23 End Function
24 End Class
Capítulo 11. Herencia y polimorfismo 329

9. Coloque como argumentos de CalculaPago() las horas trabajadas y el pago por hora.
Complemente el método, a fin de que proporcione un resultado. El procedimiento de-
be quedar de la siguiente manera:

Codificación de Nomina – Module1.vb - Pago

1 Public Class Pago


2
3
4 ‘’’ <summary>
5 ‘’’ Cálculo del pago neto
6 ‘’’ </summary>
7 Public Overridable Function CalculaPago(_
8 ByVal HorasTrabajadas As Decimal, _
9 ByVal PagoXHora As Decimal) As Decimal
10
11 Return (HorasTrabajadas * PagoXHora)
12
13 End Function
14 End Class

10. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – 11
Nomina y haga clic en el icono View Class Diagram.
11. Agregue, usando Class Designer, una clase llamada PagoBonificado, que será públi-
ca y que se agregará al programa de consola que estamos trabajando.
12. En el diagrama de clase seleccione la clase PagoBonificado que acaba de agregar, in-
voque Class Details y agregue un método de nombre CalculaPago(), que será públi-
co y devolverá un valor Decimal.
13. Edite el programa y agregue una línea que especifique que la nueva clase hereda la
funcionalidad de la clase Pago. Aquí se generaría una contaminación de espacios de
nombres, dado que Pago ya posee un método llamado CalculaPago(), y al estar he-
redando su funcionalidad, equivaldría a estar definiendo dos miembros con el mismo
nombre, lo cual no es posible. Para evitar el problema, estando en Class Details selec-
cione el método CalculaPago() de PagoBonificado, e invoque Properties; deberá
modificarse la propiedad Inheritance modifier, asignando un valor Overrides. Da-
do que se está realizando una operación de reemplazo (overrides), los argumentos
del método deben ser exactamente los mismos. La única variante entre los dos pro-
cedimientos es que el método CalculaPago() de la clase PagoBonificado retorna el
monto a pagar multiplicado por la constante de bono de puntualidad. Seguramente se
dio cuenta de que el monto a pagar es un dato que ya ofrece CalculaPago() de la cla-
se Pago, por lo que se consume el método de la clase base.
14. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o
bien agregando el siguiente código en el programa:
330 Aprenda Practicando Visual Basic 2005 usando Visual Studio

Codificación de Nomina – Module1.vb - PagoBonificado

1 Public Class PagoBonificado


2 Inherits Pago
3
4 ‘’’ <summary>
5 ‘’’ Cálculo de pago con bonificación
6 ‘’’ </summary>
7 Public Overrides Function CalculaPago( _
8 ByVal HorasTrabajadas As Decimal, _
9 ByVal PagoXHora As Decimal) As Decimal
10
11 Dim PagoNeto As Decimal
12 PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora)
13 Return PagoNeto * BonoPuntualidad
14
15 End Function
16 End Class

15. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – No-
mina y haga clic en el icono View Class Diagram.
16. Agregue, usando Class Designer, una clase llamada PagoBonificadoExtra, que será
pública y se agregará al programa de consola que estamos trabajando.
17. En el diagrama de clase seleccione la clase PagoBonificadoExtra que acaba de agre-
gar, invoque Class Details y agregue un método de nombre CalculaPago(), que será
público y devolverá un valor Decimal.
18. Edite el programa y agregue una línea que especifique que la nueva clase hereda la
funcionalidad de la clase PagoBonificado. Aquí se generaría una contaminación de
espacios de nombres, dado que Pago ya posee un método llamado CalculaPago(), y
al estar heredando su funcionalidad, equivaldría a estar definiendo dos miembros con
el mismo nombre, lo cual no es posible.
19. Hay otro problema: el nuevo método, además de los beneficios de puntualidad, inte-
grará un beneficio adicional que el usuario podrá especificar, por lo cual el método
CalculaPago() no tiene el mismo número de argumentos que CalculaPago() de la
clase PagoBonificado, por lo que una operación de reemplazo no es posible. Deberá
realizarse una operación de sustitución (overload) para que los argumentos del méto-
do no necesariamente sean los mismos. La sustitución deberá especificarse vía códi-
go, dado que Properties no ofrece el valor Overload para Inheritance modifier (lo
cual tiene mucho sentido si consideramos que la sustitución tiene que ver más con el
polimorfismo que con la herencia). La única variante entre los dos procedimientos es
que el método CalculaPago() de la clase PagoBonificadoExtra devuelve el monto a
pagar multiplicado por la constante de bono de puntualidad (información que ofrece
el método CalculaPago() de la clase base), y además le agrega un porcentaje adicio-
nal de beneficio.
Capítulo 11. Herencia y polimorfismo 331

20. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o
bien agregando el siguiente código en el programa.

Codificación de Nomina – Module1.vb - PagoBonificadoExtra

1 Public Class PagoBonificadoExtra


2 Inherits PagoBonificado
3
4 ‘’’ <summary>
5 ‘’’ Cálculo de pago con bonificación y extra
6 ‘’’ </summary>
7 Public Overloads Function CalculaPago( _
8 ByVal HorasTrabajadas As Decimal, _
9 ByVal PagoXHora As Decimal, _
10 ByVal Extra As Decimal) As Decimal
11
12 Dim PagoBonificado As Decimal
13 PagoBonificado = MyBase.CalculaPago( _
14 HorasTrabajadas, PagoXHora)
15 Return PagoBonificado * Extra
16
17 End Function
18 End Class
11
21. Complemente el procedimiento Main() para proveer de funcionamiento al programa.
Al final, deberá lucir como sigue:

Codificación de Nomina – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Public Const PagoXHoraVig As Decimal = 120D
8 Public Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11 Dim PagoNoPuntuales As Pago = New Pago()
12 Dim PagoPuntuales As New PagoBonificado()
13 Dim PagoPuntualesPlus As New PagoBonificadoExtra()
14 Dim Horas As Decimal = 40
15
16 WriteLine(“Pago a los no puntuales: “ & _
17 PagoNoPuntuales.CalculaPago(Horas, PagoXHoraVig))
18 WriteLine(“Pago a los puntuales: “ & _
19 PagoPuntuales.CalculaPago(Horas, PagoXHoraVig))
20 WriteLine(“Pago a los puntuales, + extra: “ & _
21 PagoPuntualesPlus.CalculaPago(Horas, _
22 PagoXHoraVig, 1.2D))
332 Aprenda Practicando Visual Basic 2005 usando Visual Studio

23
24 Write(“Pulse INTRO para continuar”)
25 ReadLine()
26 End Sub
27
28 End Module
29
30 Public Class Pago
31
32
33 ‘’’ <summary>
34 ‘’’ Cálculo del pago neto
35 ‘’’ </summary>
36 Public Overridable Function CalculaPago( _
37 ByVal HorasTrabajadas As Decimal, _
38 ByVal PagoXHora As Decimal) As Decimal
39
40 Return (HorasTrabajadas * PagoXHora)
41
42 End Function
43 End Class
44
45 Public Class PagoBonificado
46 Inherits Pago
47
48 ‘’’ <summary>
49 ‘’’ Cálculo de pago con bonificación
50 ‘’’ </summary>
51 Public Overrides Function CalculaPago( _
51 ByVal HorasTrabajadas As Decimal, _
53 ByVal PagoXHora As Decimal) As Decimal
54
55 Dim PagoNeto As Decimal
56 PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora)
57 Return PagoNeto * BonoPuntualidad
58
59 End Function
60 End Class
61
62 Public Class PagoBonificadoExtra
63 Inherits PagoBonificado
64
65 ‘’’ <summary>
66 ‘’’ Cálculo de pago con bonificación y extra
67 ‘’’ </summary>
68 Public Overloads Function CalculaPago( _
69 ByVal HorasTrabajadas As Decimal, _
70 ByVal PagoXHora As Decimal, _
71 ByVal Extra As Decimal) As Decimal
72
73 Dim PagoBonificado As Decimal
74 PagoBonificado = MyBase.CalculaPago( _
75 HorasTrabajadas, PagoXHora)
76 Return PagoBonificado * Extra
77
78 End Function
79 End Class
Capítulo 11. Herencia y polimorfismo 333

Ejecución guiada de Nomina – Module1.vb

22. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
23. El programa calcula el monto a pagar a los empleados. Hay tres escenarios: un pago
para todos los empleados, que es un monto neto; además hay un monto para los em-
pleados puntuales, que es un poco más alto; finalmente hay un monto aún más alto pa-
ra los que son puntuales, pero además tienen un desempeño excepcional.
24. El programa se compone del procedimiento Main(), líneas 10 a la 26, que se encarga
de hacer las instancias de las clases, así como de mostrar los resultados.
25. Al inicio del módulo se declaran dos constantes de alcance público, que por lo mismo
estarán disponibles tanto para el módulo como para las clases del programa. Se ane-
xan estas constantes con el único fin de no solicitar información al usuario para la de-
mostración del programa.
26. El método Pago.CalcularPago() requiere dos argumentos: horas trabajadas y pago por
hora. Con ellos calcula el monto del pago a realizar, que resulta de la multiplicación
de los argumentos. La clase PagoBonificado hereda la funcionalidad de la clase Pago,
y de hecho consume el resultado de sus métodos. A su vez, PagoBonificadoExtra hereda 11
la funcionalidad de PagoBonificado. Las relaciones de herencia entre las clases
quedan como sigue: Pago es clase base de PagoBonificado; Pago bonificado es clase de-
rivada de Pago y clase base para PagoBonificadoExtra; PagoBonificadoExtra sólo es
clase derivada de PagoBonificado. Respecto al manejo de los métodos, podemos decir
que el método Pago.CalculaPago() es sustituido por PagoBonificado.CalculaPago, y
PagoBonificado.CalculaPago es sustituido por PagoBonificadoExtra.CalculaPago.

FIGURA 11.2
Relaciones de
herencia del
programa
334 Aprenda Practicando Visual Basic 2005 usando Visual Studio

27. Al ejecutarse el programa, se definen los valores iniciales del pago por hora vigente (lí-
nea 7) y del bono de puntualidad (línea 8). En el procedimiento principal se genera una
instancia de la clase Pago (línea 11), una instancia de la clase PagoBonificado (línea 12)
y una instancia de PagoBonificadoExtra (línea 13). La funcionalidad de nuestras clases
está disponible a través de las variables objeto que acabamos de definir. Otro dato que se
provee es el número de horas por semana sobre las que se calculan los pagos (línea 14).
28. En las líneas 16 y 17 se muestra un mensaje que para construirse consume el método
CalculaPago() de la clase Pago, que es la que dio origen al objeto PagoNoPuntuales.
Se proporcionan como argumentos el número de horas laboradas y el pago por hora vi-
gente. El método se encarga de recibir los dos valores (líneas 36 a la 38), multiplicarlos
y devolver el resultado (línea 40). Es importante observar que este método fue codifica-
do de tal forma que permite su reemplazo y sustitución (modificador Overridable).
29. En las líneas 18 y 19 se muestra un mensaje que para construirse consume el método
CalculaPago() de la clase PagoBonificado (la que dio origen al objeto PagoPuntua-
les). Se proporcionan como argumentos el número de horas laboradas y el pago por
hora vigente. El método se encarga de recibir los dos valores (líneas 51 a la 53) y de-
clara una variable de trabajo (línea 55) a la cual le asigna el valor retornado el méto-
do MyBase.CalculaPago(); en virtud de que la clase base es Pago, sería equivalente a
ejecutar Pago.CalculaPago(). Se pasan los datos recibidos a MyBase.CalculaPago()
y al resultado se le aplica el bono de puntualidad (línea 57). Es importante notar que
la clase hereda la funcionalidad de la clase Pago (línea 46) y reemplaza la implemen-
tación del método Pago.CalculaPago(), por lo cual respeta la cantidad y el tipo de los
argumentos establecidos en la clase base (líneas 51 a 53).
30. En las líneas 20 y 22 se muestra un mensaje que para construirse consume el método
CalculaPago() de la clase PagoBonificadoExtra, que es la que dio origen al objeto
PagoPuntualesPlus. Se proporcionan como argumentos el número de horas laboradas,
el pago por hora vigente y el porcentaje aplicable al pago por buen desempeño. El mé-
todo se encarga de recibir los tres valores (líneas 68 a la 71) y declara una variable de
trabajo (línea 73) a la cual le asigna el valor retornado el método MyBase.CalculaPago(),
es decir, PagoBonificado.ClaseBase(), a la cual le pasa los datos que necesita. Al re-
sultado le aplica el bono extra (línea 76). Es importante observar que la clase hereda
la funcionalidad de la clase PagoBonificado (línea 63) y sustituye la implementación
del método PagoBonificado.CalculaPago() (líneas 68 a 71), dado que recibe un nú-
mero distinto de argumentos que el mismo método en su clase base.
Si todo ocurrió como se esperaba, la salida será la siguiente:
Pago a los no puntuales: 4800
Pago a los puntuales: 6000.00
Pago a los puntuales, + extra: 7200.000
Pulse INTRO para continuar

FIN DEL EJERCICIO*


Capítulo 11. Herencia y polimorfismo 335

MAPA MENTAL DEL CAPÍTULO

11
336 Aprenda Practicando Visual Basic 2005 usando Visual Studio

TERMINOLOGÍA

Abstract class, 315 Inheritance, 313 No reemplazable, Overridden, 323


Clase(s) Inherits, 314 324 Override, 313, 323
abstractas, 315 Jerarquía de clases, NotInheritable, 314 Overrides, 323-4
base, 313 313 NotOverridable, Polimorfismo, 325
Clases derivadas, MustInherit, 314 323-4 Reemplaza, 324
313 MustOverride, 323- Overload, 323 Reemplazable, 324
Debe reemplazarse, 4 Overloaded, 323 Sobrecarga/Sustituy
324 MyBase, 325 Overloads, 323-4 e, 324
Herencia, 313 MyClass, 325 Overridable, 323-4

PREGUNTAS
11.1 ¿Qué es la herencia?
11.2 ¿En qué casos se recomienda la implementación de la herencia?
11.3 ¿Cuáles son los estatutos para establecer relaciones de herencia entre clases?
11.4 Mencione y explique los estatutos auxiliares de herencia y polimorfismo.
11.5 Mencione un ejemplo de automatización real, en donde pueda usted implementar
herencia y polimorfismo.
Capítulo 11. Herencia y polimorfismo 337

Notas:

11
338 Aprenda Practicando Visual Basic 2005 usando Visual Studio

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. Es la habilidad de una clase para servir de base a otra clase, trasladándole su funcionalidad:
a) Herencia
b) Polimorfismo
c) Encapsulamiento

2. Tipo de relación para la que se recomienda la herencia:


a) Has-a
b) Is-a
c) Go-to

3. Permite la variación en la clase derivada, de las propiedades y métodos (requiere mantener los mismos
argumentos):
a) Inherits
b) Overrides
c) Overloads

4. Habilidad de un lenguaje para definir clases que se comporten distinto, a pesar de llamarse igual:
a) Herencia
b) Polimorfismo
c) Encapsulamiento

5. Permiten generar un tipo de dato compuesto:


a) Delegados
b) Clases
c) Estructuras

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Por omisión, las clases en Visual Basic son NotInheritable.

7. Si no desea un acceso abierto a su clase puede restringir el acceso al utilizar el


modificador Friend.

8. MyClass se utiliza para llamar a ejecución un método de la clase base.

9. La manifestación más pura del polimorfismo es la utilización de overloads.

10. Si un auto móvil y su dueño fueran objetos, la relación entre ellos sería is-a.
Capítulos:
12 Desarrollo de aplicaciones
Windows
Parte 4
13 Desarrollo de aplicaciones
Web con ASP.NET Interfases
14 Servicios Web XML Windows/Web y
Servicios Web XML
Herramientas de Visual
Studio revisadas: En esta parte del libro aprenderemos a desarrollar
las interfases que proporcionarán a nuestros
1. Form Designer
2. Menu Designer procesos datos completos y correctos.
3. Dynamic Help
4. String collection editor Esta parte describe la manera de recopilar los datos
5. HTML Designer necesarios para el procesamiento y el
6. Regular Expression Editor almacenamiento.

Comienza con una revisión de las posibilidades de


Otras herramientas: las interfases de plataforma Windows, hoy por hoy,
1. disco.exe las más sofisticadas y poderosas.
2. wsdl.exe
Posteriormente analiza la elaboración de interfases
para el ambiente Web con ASP.NET.

Finalmente, trata el tema de los Servicios Web


XML, que permiten la elaboración de interfases
desatendidas, propias para el consumo aplicación a
aplicación.
Hay quienes argumentan que los datos nunca son
suficientes para satisfacer las necesidades; esa
percepción es propia de las aplicaciones mal
delimitadas. El desarrollador inteligente siempre
sabe producir el máximo de información con el
mínimo de datos, y se asegura de que los pocos
datos requeridos siempre sean proporcionados en
la cantidad y la forma correctas.
CAPÍTULO 12
Desarrollo de aplicaciones
Windows

Objetivos: Conocer los elementos básicos del trabajo con controles para la crea-
ción de aplicaciones con interfaz gráfica Windows.

1. Conocerá los conceptos generales del desarrollo de interfaces y su orien-


tación a objetos en .NET.
2. Utilizará la ayuda de .NET.
3. Se familiarizará con los grupos de controles más importantes para el
desarrollo de aplicaciones Windows.
4. Aprenderá el concepto de las colecciones y su relevancia en el desarro-
llo de aplicaciones Windows.
5. Conocerá las generalidades del enfoque.
6. Aprenderá a desarrollar una interfaz Windows utilizando Visual Studio.

341
342 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido

Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344


Desarrollo de interfaces basadas en objetos . . . . . . . . . . . . . . . . . . . . . . . . . 345
Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Formas de agregar controles a una interfaz . . . . . . . . . . . . . . . . . . . . . 348
Estrategia para el estudio efectivo de los controles . . . . . . . . . . . . . . . 348
Jerarquía de clases relacionadas con controles . . . . . . . . . . . . . . . . . . . . . . . 349
Uso de la ayuda para conocer los miembros de las
clases de BCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
➤ Uso de Dynamic Help . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
➤ Búsqueda de temas en la ayuda . . . . . . . . . . . . . . . . . . . 352
➤ Estructura de un tópico de ayuda . . . . . . . . . . . . . . . . . . 353
Clasificación de los controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Grupo de controles comunes (Common Controls) . . . . . . . . . . . . . . . . 355
Grupo de controles contenedores (Containers) . . . . . . . . . . . . . . . . . . 357
Grupo de controles de menú y barras de herramientas
(Menus & Toolbars) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Grupo de controles componentes (Components) . . . . . . . . . . . . . . . . . 358
Grupo de controles de impresión (Printing) . . . . . . . . . . . . . . . . . . . . . 359
Grupo de controles de cuadros de diálogo (Dialogs) . . . . . . . . . . . . . . 360
Manejo de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Las colecciones y la programación de aplicaciones Windows . . . . . . . . 362
For Each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Enfoque (Focus) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Interfaz multipágina con manejo avanzado de cuadros
de texto, barra de menús y botones de comando . . . . . . . . . . . 364
➤ Establecimiento de valores generales de formulario . . . 365
➤ Adición de un sistema de menús usando Menu
Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
➤ Líneas guía en tiempo de diseño para la
alineación de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
➤ Cómo agregar imágenes a objetos Button . . . . . . . . . . . 370
➤ Opciones de formato para grupos de objetos . . . . . . . . 372
➤ Cómo establecer páginas de controles (TabControl) . . . 375
Uso de grupos de controles, combos y selectores de número . . 380
Orden de tabulación y activación dinámica de controles . . . . . . 382
➤ Lanzamiento de tareas desde la barra de menús . . . . . . 384
➤ Procedimiento para el evento de arranque (Load) . . . . . 386
Capítulo 12. Desarrollo de Aplicaciones Windows 343

➤ Uso de Tab Order para establecer el orden de


tabulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
➤ Bloqueo de controles (Lock Controls) . . . . . . . . . . . . . . . 389
➤ Activación dinámica de elementos . . . . . . . . . . . . . . . . . 389
Uso de controles para la visualización de páginas Web . . . . . . . 391
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

12
344 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Interfaz de usuario
Se llama interfaz de usuario al sistema de elementos de software a través de los cuales un
programa determinado se articula con el usuario para recibir datos y actuar en consecuen-
cia. La interfaz puede ser gráfica (GUI, Interfaz gráfica de usuario, Graphic User Interfa-
ce), si está constituida por elementos gráficos (iconos, punteros, ventanas); o textual, cuan-
do el usuario introduce comandos e instrucciones en forma de cadenas de caracteres
específicas (por ejemplo, las aplicaciones de consola). En el caso de Visual Basic es posi-
ble implementar interfaces de usuario en ambas modalidades.

El objetivo principal de una interfaz, sea cual sea su tipo, es recibir los datos válidos, mí-
nimos, suficientes y necesarios para que un programa produzca los resultados esperados, y
para dar al usuario la información relacionada con sus operaciones.

La interfaz de usuario es el principal elemento de comunicación entre las aplicaciones y


los consumidores de la aplicación. Pueden ser consumidores de la aplicación las personas
que la utilizan o los programas que se conectan a ella de manera automática y aprovechan
su funcionalidad sin mediar la intervención humana (como en el caso de los servicios Web
XML).

Una interfaz se constituye en un punto de contacto con el usuario: permite la entrada y sa-
lida de datos, encargándose de los enlaces subyacentes que el usuario no tiene necesidad
de conocer. El usuario captura información y espera un resultado, sin importarle la arqui-
tectura de hardware y software que permitan a la aplicación producir la respuesta.

FIGURA 12.1
Forma de trabajo
de una interfaz.
Capítulo 12. Desarrollo de Aplicaciones Windows 345

Una buena interfaz:


❑ Permite la recopilación de la cantidad precisa de datos que el programa requiere para su
procesamiento. Más datos de los requeridos es innecesario; menos, es insuficiente.
❑ Permite la recopilación de los datos, en el tipo de dato que se necesita. Si se desea cap-
turar una fecha de nacimiento, lo que se espera es un dato de tipo Date, y no un String,
un Integer u otro.
❑ Valida que los datos respeten las reglas de operación. Si las reglas de operación deter-
minan que una fecha a capturar no sea anterior a la fecha del día del sistema, o que un
número deba estar entre un determinado rango, la interfaz debe garantizar que sólo se
admitan datos que respeten dichas reglas.
❑ Proporciona la manera de corregir los errores que en la captura se cometan, y debe
orientar al usuario sobre la forma correcta de captura.
❑ Debe ser amigable, estética y proporcionada. De preferencia, deben respetar los con-
vencionalismos que el usuario utilice con más frecuencia; el programador no debe an-
teponer sus preferencias personales si éstas no facilitan la aceptación de la aplicación
por parte del usuario.
❑ La interfaz de usuario debe proporcionar la información de manera organizada y estéti-
ca, de manera que el usuario la encuentre en la cantidad y la forma requerida.

NOTA 12
En computación hay un fenómeno que se conoce como GIGO (Garbage In, Garbage Out/ba-
sura entra, basura sale). Si una aplicación acepta datos erróneos, muy probablemente se ge-
nerarán errores en el procesamiento. Se puede tener la mejor aplicación del mundo, pero si
la persona que utiliza la aplicación introduce datos equivocados, obtendrá resultados equivo-
cados. Lo más que puede hacer un programador es validar tantos datos como sea posible, ya
sea por tipo de dato o por regla de operación.

Desarrollo de interfaces basadas en objetos


Una interfaz sencilla y práctica para efectos explicativos es el registro de un usuario, tal co-
mo se muestra en la figura 12.2. Consiste en un cuadro de diálogo con un espacio para es-
pecificar un nombre de usuario, otro para dar una contraseña y un tercero donde se deberá
confirmar la contraseña. El botón Aceptar no se habilita sino hasta que se hayan proporcio-
nado todos los datos requeridos.
346 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 12.2
Interfaz
elemental.

Para cumplir con el propósito de la interfaz, el mínimo de datos que podemos preguntar
son el usuario y la contraseña dos veces.
La interfaz muestra varios elementos: tres etiquetas (objetos Label), tres cuadros de texto
(objetos TextBox) y dos botones de comando (objetos Button). Todos ellos se encuentran
en un objeto más grande, al que se conoce como formulario (objeto Form). La interfaz es-
tá compuesta entonces por 9 objetos.
Un objeto contenedor es el que puede contener otros objetos. Los objetos contenedores son
conocidos también como objetos padre (parent), mientras que los objetos contenidos
son conocidos como objetos hijo (child). Es posible que un objeto contenedor esté conte-
nido en otro objeto contenedor, por lo que podemos decir que éstos pueden anidarse.
Se tienen los siguientes elementos gráficos de interfaz: 1 objeto contenedor y 8 objetos
contenidos (1 objeto padre y 8 objetos hijos). Es importante recalcar que en .NET usted no
tiene que redactar el código necesario para dibujar píxel por píxel cada uno de los elemen-
tos. La codificación ya está disponible como parte de BCL en forma de objetos que pue-
den ser invocados desde su programa. Para dibujar un formulario, por ejemplo, basta con
instanciar la clase System.Windows.Forms.Form y modificar el estado del objeto para ob-
tener la apariencia y el comportamiento deseado. Los objetos que se necesitan en nuestra
interfaz derivan de las siguientes clases:

Clase BCL Tipo Cantidad


System.Windows.Forms.Form Parent 1
System.Windows.Forms.Label Child 3
System.Windows.Forms.TextBox Child 3
System.Windows.Forms.Button Child 2
Capítulo 12. Desarrollo de Aplicaciones Windows 347

Controles
Los controles son las representaciones gráficas de las clases, disponibles en Visual Studio
a través de Toolbox. Los controles son la forma para llegar a las clases de BCL, a fin de
generar instancias que se conviertan en objetos de interfaz. Aunque los controles y los ob-
jetos son cosas distintas, está tan generalizado el uso de la palabra control para designar las
instancias de las clases agregadas a una interfaz gráfica que es común encontrarlos como
sinónimos.
Si desea que su interfaz sea efectiva, requiere saber manejar los objetos que ésta incluya;
esto sólo se logra conociendo la clase de la cual derivan y las capacidades de dicha clase.
Los controles están disponibles en la barra de herramientas, o Toolbox. La herramienta
Toolbox se organiza en grupos de controles, clasificándolos de acuerdo con la similitud de
su funcionalidad o enfoque.
Los grupos de controles pueden expandirse o contraerse con el fin de tener presentes sólo
los controles que utilicemos. Incluso es posible la generación de grupos de controles del
usuario, colocando ahí los controles más usuales para nosotros; con ello se facilita la ope-
ración de buscarlos y encontrarlos.

FIGURA 12.3
Toolbox, o barra
de herramientas.

12
348 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Formas de agregar controles a una interfaz


Existen tres formas para agregar un control a una interfaz gráfica:
1. Modo inserción. Se logra haciendo doble clic sobre un control en Toolbox. El obje-
to se agregará al espacio de trabajo, donde podrá moverse o ajustarse. En este modo no
hay control de la posición en la que el objeto se colocará, ni de sus dimensiones.
2. Modo arrastre. Se logra arrastrando un control desde Toolbox hasta el espacio de tra-
bajo. En este modo tenemos el control de la posición que ocupará el objeto, pero no de
sus dimensiones.
3. Modo trazo. Consiste en hacer un clic sobre un control en Toolbox, y dibujar en el
espacio de trabajo el contorno que ha de ocupar el control. En este modo tenemos con-
trol de la posición y las dimensiones que el objeto ocupará.

Estrategia para el estudio efectivo de los controles


La siguiente es la secuencia que recomendamos para aprender a utilizar los controles dis-
ponibles en la biblioteca de clases de .NET Framework y sus miembros:
1. Tenga bien claro lo que desea hacer. Si no sabe lo que quiere, tampoco sabrá qué
clase es la más adecuada a sus necesidades; no sea de las personas que define la inter-
faz de usuario a medida que se da cuenta lo que la clase permite hacer; pues es la for-
ma más fácil de hacer de una interfaz de usuario un laboratorio de aprendizaje de cla-
ses, lo que a la larga es ineficiente.
2. Investigue para qué sirven los objetos generados a partir de la clase. Si la
clase no es lo que usted busca, seleccione otra que le sirva más específicamente ¡La bi-
blioteca de clases de .NET Framework posee tantas, que seguro encontrará alguna que se
adecue a sus necesidades! Incluso si encuentra una que le sea de utilidad, siga buscan-
do; es posible que encuentre otra clase que le funcione de manera más específica. Sea
profundo en su análisis para decidir las clases a utilizar; le aseguramos que será tiempo
bien invertido, pues si selecciona una clase que no es la más adecuada perderá tiem-
po codificando aquellas cosas que la clase no proporciona de origen. Le va a desilusio-
nar bastante romperse la cabeza para obtener cierta funcionalidad, para luego encontrar-
se una clase ya integrada a la biblioteca de .NET Framework que hacía precisamente
eso que usted codificó.
3. Investigue las propiedades relevantes de la clase. Las propiedades determinan
en gran medida la forma en que lucen y pueden comportarse los objetos; es importante
ver primero las propiedades, antes de otros miembros, ya que los valores asignados a las
propiedades pueden determinar la disponibilidad de los eventos y los métodos.
4. Investigue qué eventos reconoce la clase. Esto le permitirá determinar si un ob-
jeto generado a partir de la clase le sirve para sus propósitos de interacción y si obede-
Capítulo 12. Desarrollo de Aplicaciones Windows 349

ce a la filosofía de la interfaz de usuario que está desarrollando. Investigue primero los


eventos por la sencilla razón de que, generalmente, mandamos a ejecución un método
como respuesta a un evento; si el evento no sucede, el método tampoco sucederá.
5. Investigue, finalmente, los métodos que permite la clase. Utilizando los mé-
todos podrá poner a trabajar las capacidades de comportamiento intrínseco del objeto.

Jerarquía de clases relacionadas con controles


En la estrategia expuesta anteriormente queda claro que es necesario aprender las propie-
dades, los métodos y los eventos de las clases de las cuales derivan los objetos, a fin de go-
bernar su apariencia y comportamientos.
Una forma lógica de hacerlo es seleccionar los tipos de objeto que necesitamos y explorar
sus propiedades, métodos y eventos; de esta forma podremos darnos cuenta de que muchas
de las propiedades, métodos y eventos se repiten en todos los objetos. La explicación a ese
fenómeno es que derivan de clases genéricas comunes, que proveen la funcionalidad bási-
ca para todos los objetos.
Aprender las clases genéricas automáticamente lleva a conocer un alto porcentaje de capa-
cidades de las clases para la definición de objetos de interfaz. La gran mayoría de los con-
troles constituyen una clase derivada de la clase Control, que a su vez es derivada de la
clase Object.

FIGURA 12.4 12
Jerarquía de
clases para
interfaces en
Windows.
350 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Esto implica que, como ya lo sabe, los controles heredan propiedades, métodos y eventos
de la clase base.
La figura 12.4 ejemplifica la jerarquía de clases a la que están sujetos la mayoría de los
controles que se utilizan en una interfaz de usuario.
Si puede entender cuáles son los miembros de la clase Object y la clase Control habrá en-
tendido el comportamiento general de los controles.
El número de miembros de dichas clases es muy extenso; no sería práctico mencionarlos
todos. Si desea consultar un listado exhaustivo búsquelos en la ayuda de .NET Framework,
mediante el nombre del control que le interese y la palabra Class.

Ejercicio 12.1
Uso de la ayuda para conocer los miembros de las clases de BCL

Conocerá la forma en que se puede buscar información de clases en la ayuda de .NET (es
necesario que la ayuda esté instalada en el sistema).
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Haga clic en el botón Show All Files de la barra de herramientas de Solution
Explorer.
3. En Solution Explorer seleccione el nodo HolaMundoWin – Form1.vb – Form1.De-
signer.vb.

➤ Uso de Dynamic Help

4. Elija la opción de menú Help – Dynamic Help.


5. Aparecerá en el espacio de trabajo la herramienta Dynamic Help.
Capítulo 12. Desarrollo de Aplicaciones Windows 351

6. La herramienta Dynamic Help es una ayuda dinámica que actualiza vínculos a los te-
mas de ayuda relativos a lo que estemos haciendo. Dependiendo de lo que estemos tra-
bajando, aparecerán los vínculos pertinentes. Inicialmente aparecerán temas genéricos
del tipo de proyecto que tengamos en el espacio de trabajo.
7. Busque la siguiente línea de código y seleccione la palabra Label.
Me.lblResultado = New System.Windows.Forms.Label
8. En Dynamic Help aparecerán sólo temas relacionados con lo que acabamos de seleccionar.

9. Busque la ayuda de la clase Label. Deberá iniciar con Label Class.


10. Vea cómo aparecen varios temas que inician con Label Class, pues la clase Label
existe en diferentes jerarquías de espacios de nombres (namespaces). Si una clase
apunta hacia System.Web.UI.MobileControls, se refiere a las clases para interfaces de
cómputo móvil; System.Web.UI.WebControls, se refiere a las clases para interfaces
Web ASP.NET; finalmente System.Windows.Forms agrupa a las clases para definir 12
objetos en interfaces basadas en Windows. Incluso hay implementaciones de los con-
troles para la programación en programas de Microsoft Office, como Word y Excel.
Dado que estamos en una aplicación Windows, seleccione Label Class (System-
.Windows.Forms).
352 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

> Lo nuevo
En Visual Studio 2005, el contenido de la ayuda se distribuye de forma distinta, más organi-
zada y predecible. Cada clase tendrá un encabezado de tema (Class), para posteriormente
ofrecer generalidades (about class), miembros (all members), información del constructor
(constructor), sintaxis declarativa (declarative sintaxis), eventos, métodos y propiedades
(events, methods, properties).

11. Lo anterior despliega la ayuda de Visual Studio.

➤ Búsqueda de temas en la ayuda

12. La ayuda se compone de tres elementos básicos: Index, que se encarga de enumerar
todos los temas incluidos; Topic content, que muestra el contenido de la ayuda corres-
pondiente al tema, e Index Results, que muestra los diferentes temas que se encuen-
tran para una búsqueda.
13. Index tiene dos fichas: Contents, que muestra los tópicos de forma organizada por te-
mas en un esquema de árbol de nodos, e Index, que permite especificar un tema a bus-
car, ya sea sobre toda la ayuda o aplicando un filtro por tecnología.
14. Utilizando Index, especifique en Filtered by el valor .NET Framework, con el fin de fil-
trar la ayuda y ver sólo los temas relacionados con la plataforma .NET. Busque la ayu-
Capítulo 12. Desarrollo de Aplicaciones Windows 353

da de los cuadros de texto, especificando TextBox Class, about en Look for:, y opri-
miendo la tecla Intro al finalizar.
15. Aparecerán en Index Results aquellos temas que concuerden con la búsqueda.

16. Seleccione el tópico TextBox Class (System.Windows.Forms), haciendo doble clic


sobre el mismo.

➤ Estructura de un tópico de ayuda

17. Un tópico de ayuda se compone de explicaciones y vínculos. La ayuda aparece en


Topic Content.

FIGURA 12.5
Ayuda.

12
354 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Dependiendo del tópico de ayuda mostrado aparecerán diversos elementos en Topic
Content. En el encabezado del tópico aparecerá el nombre del mismo; debajo, vínculos
de acceso rápido a temas de interés general o, por lo menos, un vínculo See Also, que
lleva a temas relacionados. Dependiendo del tópico los demás vínculos pueden variar.
19. También en el encabezado del tópico aparece un vínculo para expandir o contraer los
subtópicos de la ayuda; si los subtópicos están contraídos, aparecerá el vínculo Ex-
pand All, que permitirá expandirlos; en caso de que estén expandidos, aparecerá el
vínculo Collapse All, para contraerlos.
20. En caso de que los subtópicos correspondientes a TextBox Class no estén expandi-
dos, haga clic en el vínculo Expand All.
21. Con la finalidad de encontrar información específica, la ayuda cuenta con una opción
de filtro que varía dependiendo del contenido que se está buscando. Un filtro típico es
el lenguaje .NET en el que se ejemplifican las instrucciones y sintaxis; si usted sólo
codifica en Visual Basic, probablemente ver los ejemplos y sintaxis en todos los len-
guajes .NET incluidos en la ayuda (C#, C++, J#, JScript) no hará más que complicar
la investigación. En caso de que el tópico tenga ejemplos de codificación, la ayuda de
.NET Framework permitirá seleccionar el o los lenguajes en los que desee ver las im-
plementaciones en código.
22. En Language filter seleccione únicamente Visual Basic (usage). Vea cómo en el
cuerpo de la ayuda aparecerán sólo ejemplos en el lenguaje seleccionado. Observe có-
mo en Visual Basic se puede incluso filtrar la ayuda para ver el uso (usage) o la decla-
ración de las sentencias (declaration).
23. En el cuerpo de la ayuda aparecerá el tema desarrollado en subtópicos y ejemplos. Los
subtópicos pueden contraerse o expandirse, haciendo clic en el icono (+ , – ) que apa-
rece contiguo al título. Generalmente aparecerá un resumen de la funcionalidad del tó-
pico en la parte superior.
24. En el encabezado de la ayuda haga clic en el vínculo Members para examinar las propieda-
des, los métodos y los eventos disponibles para el objeto Label en una interfaz Windows.
25. Vea cómo el filtro ha cambiado. Ahora permite filtrar con base en los miembros que
desea ver. Ya decíamos que los objetos de interfaz derivan de Object y de Controls.
Si ya conoce los miembros comunes de dichas clases, es probable que sólo le intere-
se ver en la ayuda aquellos miembros que son particulares de la clase investigada.
26. En la ayuda de los miembros de Label, encuentre la propiedad BackColor. Dicha pro-
piedad es común a todos los controles, dado que la heredan de la clase Controls.
27. Expanda el cuadro combinado del filtro y desmarque todas las casillas de verificación.
Vea cómo BackColor ya no aparece. Esto sucede porque se inhabilitó la opción In-
clude Inherited Members.
28. Este procedimiento es aplicable para encontrar ayuda para todas las clases de BCL.
29. Cierre la ventana de ayuda de .NET.
FIN DEL EJERCICIO *
Capítulo 12. Desarrollo de Aplicaciones Windows 355

> Lo nuevo
En Visual Studio 2005 la ayuda viene mejorada, dado que permite la integración con la comu-
nidad de desarrolladores (se requiere estar en línea para ello). No sólo se puede consultar lo
último en documentación, sino que directamente se pueden agregar preguntas a foros de Vi-
sual Studio. Se tiene un nuevo menú, llamado Community, que permitirá el acceso a los re-
cursos disponibles para la comunidad de desarrolladores a nivel mundial.

Clasificación de los controles


La herramienta Toolbox muestra los controles de forma categorizada por grupos, de tal ma-
nera que puedan ser identificados aquellos con mayor afinidad en cuanto a su propósito.
Dependiendo de la aplicación que se esté desarrollando (consola, Windows, Web, mobile)
Toolbox mostrará los controles pertinentes.
En el caso de las aplicaciones Windows, los controles incluidos en Toolbox son los siguien-
tes (se mencionan las categorías de controles más importantes):

Grupo de controles comunes (Common Controls)


Concentra los controles más comúnmente utilizados en interfaces basadas en Windows.

Control Nombre Uso

Pointer Indica la no selección de otros controles.


12
Este control realmente no se enlaza con
ninguna clase de BCL y aparece en todos
los grupos de controles.

Button Muestra un botón que al presionarlo


desencadena una acción.

CheckBox Representa una casilla de verificación.

CheckedListBox Representa una lista de opciones que


pueden ser marcadas en forma de
casillas de verificación.

ComboBox Representa un cuadro combinado de


opciones (cuadro de texto + lista
desplegable).
DateTimePicker Representa un selector de fechas.
356 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Label Representa una etiqueta textual de sólo


lectura.

LinkLabel Representa una etiqueta que puede


desplegar hipervínculos.

ListBox Representa una lista.

ListView Representa una colección de elementos,


preferentemente gráficos, que pueden
ser seleccionados.

MaskedTextBox Representa un cuadro de texto que


distingue entre una entrada válida y una
inválida, de acuerdo con un patrón.

MonthCalendar Representa un selector de fechas en


modo mes.

NotifyIcon Representa un icono en el área de


notificación.

NumericUpDown Representa un selector de números


dentro de un intervalo.

PictureBox Representa un cuadro en el cual se


puede desplegar una imagen.

ProgressBar Representa una barra de control de


avance de un proceso.

RadioButton Representa un botón de opción.


RichTextBox Representa un cuadro de texto RTF
(Rich Texto Format, Formato de texto
enriquecido).
TextBox Representa un cuadro de texto.

ToolTip Representa un cuadro de información


que aparece sólo al sobreponer el puntero
del ratón sobre un elemento de interfaz.

TreeView Representa una colección jerárquica de


elementos (nodos) y permite su selección.

WebBrowser Representa un navegador de Internet


que puede incluirse en un formulario.
Capítulo 12. Desarrollo de Aplicaciones Windows 357

Grupo de controles contenedores (Containers)


Reúne los controles contenedores utilizados en interfaces Windows. Dentro de ellos podrán
colocarse otros controles, heredando propiedades de aspecto y disponibilidad.

Control Nombre Uso

FlowLayoutPanel Representa un espacio de trabajo en el


cual los controles se acomodan automáti-
camente de forma vertical y horizontal.

GroupBox Representa un marco que agrupa a otros


controles, con la opción de incluir un
texto superior explicativo.

Panel Representa un espacio de trabajo en el


cual se pueden colocar controles que
requieren agruparse.

SplitContainer Representa un área de espacio de trabajo


que se divide en dos paneles que
pueden ajustarse de manera dinámica.

TabControl Representa un conjunto de páginas de


controles, que pueden seleccionarse
mediante el uso de fichas.

TableLayoutPanel Representa un panel dinámico


que se subdivide en celdas.
12

Grupo de controles de menú y barras


de herramientas (Menus & Toolbars)
Concentra los controles para el diseño de sistemas de menús y barras de herramientas ba-
sadas en Windows.

Control Nombre Uso

ContextMenuStrip Representa un menú contextual.

MenuStrip Proporciona un sistema de menús a un


formulario.

StatusStrip Representa una barra de estado para un


formulario.
358 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ToolStrip Representa un contenedor para


objetos de barra de herramientas.

ToolStripContainer Proporciona paneles laterales en


una forma, y un panel central,
en donde se pueden colocar otros
controles.

Grupo de controles de datos (Data)


Concentra los controles para el manejo de datos tomados de diversas fuentes.

Control Nombre Uso

DataSet Representa una base de datos desconec-


tada que se almacena en memoria.

DataGridView Representa una rejilla de datos que


permite personalizar la apariencia.

BindingSource Encapsula una fuente de datos para una


forma.

BindingNavigator Representa una interfaz de navegación y


manipulación de datos cuando se tienen
en el formulario controles enlazados
con las fuentes de datos.

ReportViewer Permite la visualización de reportes


ReportViewer.

Grupo de controles componentes (Components)


Concentra los controles de uso genérico basados en componentes .NET.

Control Nombre Uso

BackgroundWorker Representa la ejecución de un


proceso en un flujo de procesa-
miento separado (thread).

DirectoryEntry Representa el encapsulamiento de


nodos y objetos de Active Directory.
Capítulo 12. Desarrollo de Aplicaciones Windows 359

DirectorySearcher Representa una consulta sobre el


Active Directory.

ErrorProvider Representa una interfaz entre un


control y un error asociado con él.

EventLog Representa una interacción con el


logo de eventos de Windows.

FileSystemWatcher Representa un monitoreo que vigila


y detecta si un directorio o archivo
ha sufrido cambios en su contenido.

HelpProvider Representa ayuda popup o en línea


para un control.

ImageList Representa una colección de


objetos de imagen.

MessageQueue Representa un manejador de colas


en .NET.

PerformanceCounter Representa un componente


de monitoreo de desempeño de
Windows (performance counter).

Process Representa el acceso a procesos


que pueden ser detenidos o
iniciados de manera local o remota.
12
SerialPort Representa un recurso de acceso
al puerto serial.

ServiceController Representa un servicio de Windows


y permite su manipulación.

Timer Representa un temporizador, que


permite ejecutar procesos en
determinado intervalo.

Grupo de controles de impresión (Printing)


Concentra los controles para la manipulación de la salida por impresora.
360 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Control Nombre Uso

PageSetupDialog Permite a los usuarios establecer la


configuración de las páginas de
impresión.

PrintDialog Representa un cuadro de diálogo


estándar de Windows para la selección
de impresora y envío de impresión.

PrintDocument Representa un documento de impresión


que puede diseñarse.

PrintPreview Representa una versión esencial de


Control presentación preliminar.

PrintPreview Representa un cuadro de diálogo


Dialog estándar de Windows para la visualiza-
ción de presentaciones preliminares.

Grupo de controles de cuadros de diálogo (Dialogs)


Concentra los controles de cuadros de diálogo para incorporar funcionalidad estilo Win-
dows a las aplicaciones.

Control Nombre Uso

ColorDialog Representa un cuadro de diálogo


estándar de Windows para la selección
de colores.

FolderBrowser Muestra y permite que el usuario


Dialog seleccione un directorio de los
existentes en el sistema de archivos.

FontDialog Representa un cuadro de diálogo estándar


de Windows para la selección de fuentes.

OpenFileDialog Representa un cuadro de diálogo


estándar de Windows para la selección
de un nombre de archivo existente.

SaveFileDialog Representa un cuadro de diálogo


estándar de Windows para la especifica-
ción de nombres de archivo válidos.
Capítulo 12. Desarrollo de Aplicaciones Windows 361

Este libro no incluye todas las propiedades y el manejo de los controles, dado que el tema
es extenso y no tiene que ver con Visual Basic como lenguaje, sino con el uso específico
de las clases de BCL.

Manejo de colecciones
Uno de los conceptos más importantes en .NET Framework es el manejo de colecciones.
Una colección es un conjunto de objetos de igual naturaleza que se agrupan como unidad
de referencia, y a los que es posible referirse como una unidad, además de ser elementos
individuales y autónomos.
Podemos encontrarnos las colecciones como instancias de clases de tipo Collection, co-
mo arreglos o como propiedades de objetos que permiten el manejo de colecciones (como
es el caso de los contenedores).
Es requisito para una colección que todos los objetos de la misma sean de un mismo tipo,
a fin de guardar una coherencia de contenido que no perjudique el procesamiento que se
realice con la colección. A cada uno de los elementos de una colección se le da el nombre
de item. Los items son accesibles ya sea por un subíndice que indica la posición del
elemento dentro de la colección, o por un nombre de elemento, en el caso que estos estén
denominados.
Dado que una colección tiene su propia identidad y comportamiento, posee propiedades y
métodos que permiten su manipulación. Por ejemplo, para conocer el número de elemen-
tos que componen la colección basta con invocar la propiedad Collection.Count de la co-
lección; para agregar elementos, podemos utilizar el método Collection.Add, mientras
12
que para eliminarlos podemos utilizar el método Collection.Remove.
Existen colecciones genéricas para agrupar objetos de tipo indeterminado. Este tipo de co-
lecciones no requiere la especificación de un determinado tipo de objeto, lo que implica
mucha flexibilidad; sin embargo, también implica pérdida de desempeño de las aplicacio-
nes, ya que es necesaria la realización de conversiones en tiempo de ejecución (boxing, un-
boxing).
Se habla de boxing cuando un tipo de dato primitivo es convertido en su equivalente a ob-
jeto (pasa de ser ByVal a ser ByRef), con lo cual podrá disponer de toda la funcionalidad
de la clase, como lo son los métodos y propiedades intrínsecos de la clase que le dio ori-
gen. Se habla de unboxing en el caso contrario, cuando un objeto pasa de ser un objeto a
su equivalente en dato primitivo (de ByRef a ByVal).
No sólo existen colecciones genéricas; hay algunas de tipo objeto que refieren a un tipo de
objeto determinado y que, por tanto, tienen la ventaja de evitar las conversiones en tiempo
de ejecución, lo cual las hace más eficientes.
362 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA
Las colecciones serán aludidas en este libro con el siguiente estilo tipográfico: Collection, a
fin de que las distinga de las propiedades comunes.

Las colecciones y la programación


de aplicaciones Windows
Es importante entender el concepto de colecciones si se desea desarrollar aplicaciones
Windows, pues la interfaz gráfica generalmente utiliza objetos contenedores para ser inte-
grada.
Un objeto contenedor es aquel que puede contener otros objetos. En el caso de las aplica-
ciones Windows, se tienen tres objetos contenedores básicos: Form, GroupBox y Panel.
Cada uno de ellos posee una colección Controls, a través de la cual se controlarán los ob-
jetos de la interfaz como un todo.
La integración de un formulario basado en Windows que actuará como interfaz es muy sen-
cilla:

1. Se declara y se instancia un objeto contenedor (por ejemplo, Form).


2. Se declaran e instancian los objetos de la interfaz (derivados de la clase Control).
3. Se proporciona el estado requerido a los objetos de la interfaz (asignación de valores
a las propiedades de los objetos).
4. No olvide que algunos objetos contenedores pueden estar dentro de un formulario y
que algunos objetos poseen sus propias colecciones.
5. Se agregan los objetos declarados a la colección Form.Controls del objeto contene-
dor aplicando el método Collection.Add sobre la colección.
6. Se muestra el formulario en forma modal, utilizando Form.ShowDialog.

For Each
El ciclo For Each es una estructura de control que sirve para explorar colecciones. La sin-
taxis de For Each es la siguiente:
For Each Variable In Colección
«proceso en donde Variable se establece como

referencia del elemento en la colección»

Next Variable
Capítulo 12. Desarrollo de Aplicaciones Windows 363

Donde Variable es una variable de trabajo del mismo tipo de dato que los elementos con-
tenidos en la colección. Colección será la colección de objetos a explorar.

NOTA
En la tabla de miembros más utilizados se incluyen sólo aquellos que sean inherentes al con-
trol que se está documentando; se omitirá mencionar propiedades, métodos y eventos que
sean derivados de las clases Control y Object, que ya fueron documentados en el capítulo an-
terior.

Enfoque (Focus)
Se entiende por enfoque (focus) la capacidad de interactuar a través del teclado con un ob-
jeto. Por lógica, en tiempo de ejecución sólo un objeto puede poseer el enfoque en un mo-
mento determinado.
Hay algunos objetos que no pueden tener el enfoque debido a su incapacidad de interactuar
con el usuario (por ejemplo, los objetos invisibles como ToolTip).
Los objetos que sí permiten la interacción del usuario tienen una propiedad denominada
Control.TabIndex que indica el orden en que el control del programa navegará de un ob-
jeto a otro al presionar la tecla TAB.
Inicialmente, en la ejecución de un programa, el enfoque lo tendrá el objeto que, teniendo la
capacidad de poseer el enfoque, tenga el valor menor en la propiedad Control.TabIndex, 12
siempre y cuando se encuentre habilitado (propiedad Control.Enabled establecida a True)
y visible (propiedad Control.Visible establecida en True).
Cuando es posible manipular el valor de un objeto con el teclado se dice que dicho objeto tie-
ne el enfoque. Si el objeto, teniendo el enfoque, lo traslada a otro objeto, se dice que pierde
el enfoque; si un objeto, no teniendo el enfoque lo recibe, se dice que adquiere el enfoque.
El orden para adquirir y perder el enfoque está determinado por la propiedad Control.
TabIndex. Este orden se respeta sólo si se traslada el enfoque presionando la tecla TAB; es
posible trasladar el enfoque de otras formas, como haciendo clic en un objeto, y en tales ca-
sos no importa el orden determinado en Control.TabIndex. Al orden en que los objetos
van pasando el enfoque se le llama orden de tabulación (Tab Order).
Hay varios métodos y eventos relacionados estrechamente con el enfoque. El método
Control.Focus, por ejemplo, proporciona el enfoque a un objeto. Cuando un objeto deja
de tener el enfoque, se produce para ese objeto el evento Control.LostFocus. Cuando un
objeto adquiere el enfoque, le sucede el evento Control.GotFocus.
364 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Como puede darse cuenta, el simple hecho de oprimir la tecla TAB o señalar con el pun-
tero del ratón a un objeto que no posee el enfoque, propicia una buena cantidad de even-
tos, tanto para el objeto que recibe el enfoque como para el que lo pierde. Aquí se genera
confusión: ¿Cuál ocurre primero?
A continuación le mostramos todos los eventos que suceden si un objeto adquiere el enfo-
que y lo pierde:

1. Cuando entramos a un objeto, se provoca primero el evento Control.Enter.


2. Ya que entramos, comenzamos a disponer de la capacidad de interactuar con él, por lo
que se provoca el evento Control.GotFocus.
3. Si estando en el objeto presionamos TAB, indicamos que queremos dejar el objeto,
provocando el evento Control.Leave.
4. Antes de poder dejar el objeto, es necesario saber si es válido o no hacerlo; se provo-
ca el evento Control.Validating.
5. Si la validación se lleva a cabo, se provoca el evento Control.Validated.
6. Ya que comprobamos que fue válido dejar el objeto, se pierde la capacidad de interac-
tuar con él, por lo que se provoca el evento Control.LostFocus.

Definir un adecuado orden de tabulación es indispensable para construir una buena inter-
faz. Si el orden es caótico, el usuario se perderá. No trate de ser innovador con respecto al
orden de tabulación: analice el orden en que el usuario del programa acostumbra capturar
los datos o analice el documento a partir del cual realiza la captura, y proporcione el orden
necesario. Créamelo, se lo van a agradecer mucho.

Ejercicio 12.2
Interfaz multipágina con manejo avanzado de cuadros de texto, barra de
menús y botones de comando

Aprenderá a crear una aplicación de interfaz Windows utilizando los controles gráficos pro-
porcionados por .NET Framework.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Windows Application, llamado Empresa.
Deberá aparecer un formulario en el diseñador de formularios, que por omisión recibe
el nombre de Form1.
Capítulo 12. Desarrollo de Aplicaciones Windows 365

➤ Establecimiento de valores generales de formulario

3. Cambie el nombre del formulario, de Form1 a frmEmpresa. Los cambios de nombre se


realizan utilizando Properties (tecla F4), localizando la propiedad Name y especifican-
do como valor el nuevo nombre que se desea asignar.

NOTA
En términos de notación, cuando hagamos referencia a Clase.Miembro, por ejemplo Form-
.Name, nos referiremos al miembro de la clase; la explicación será válida para todas las instan-
cias que de dicha clase se generen.

Cuando hagamos referencia a Instancia.Miembro, por ejemplo frmEmpresa.Name, especifica-


remos valores y condiciones que se le apliquen sólo a un objeto en particular.

En todos los casos, los controles pertenecen a Windows.Forms.Controls.

4. Modifique las siguientes propiedades:

Propiedad Valor a asignar

frmEmpresa.Text Registro de empresa


frmEmpresa.Size.Width 450

frmEmpresa.Size.Height 350

5. Cuando encuentre este tipo de tablas en los ejercicios, lo que debe hacer es lo siguiente: 12
a) En la columna de propiedad se encuentra una referencia que se compone de
Objeto.Propiedad. En la herramienta Properties debe asegurarse que tiene selec-
cionado el objeto al cual desea modificar las propiedades; eso se comprueba si el
objeto aparece en el cuadro combinado de selección de objetos de Properties. Una
forma de seleccionar el objeto es haciendo un solo clic sobre él.
b) En algunos casos la propiedad tendrá en la tabla dos referencias (Propie-
dad1.Propiedad2), lo que indica que la primera propiedad engloba a la segunda.
c) A fin de cuentas debe encontrarse en la columna izquierda de la rejilla de propie-
dades la propiedad especificada (Propiedad), y debe establecer el valor de la mis-
ma en la columna derecha de la rejilla (Valor a asignar).
d) Los valores de las propiedades no se asignan hasta oprimir la tecla Intro al termi-
nar la edición.
6. La propiedad Form.Text permite asignar el título que ha de mostrarse en la barra de tí-
tulo del formulario; Form.Width permite asignar el ancho en píxeles del formulario,
mientras que Form.Height permite asignar el alto en píxeles.
366 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7. En Properties busque la propiedad frmEmpresa.Icon, y haga clic en el botón de


asistencia de introducción de valores . Aparecerá la ventana de selección de ar-
chivos. Seleccione el archivo WindowsApp.ico, que se encuentra en los archivos
complementarios al capítulo, en C:\APVBNETVS\Cap11. La propiedad Form.Icon
permite seleccionar el icono del programa. Como puede ver, el icono que aparece en
la barra de título de la aplicación ha cambiado por el que hemos especificado. Por
el momento nuestra interfaz luce como sigue:

➤ Adición de un sistema de menús usando Menu Designer

8. Visual Studio posee controles y herramientas llamados ToolStrip Designer, que per-
miten la modificación de propiedades textuales en modo de diseño. Uno de ellos es
MenuStrip.
9. Agregue en modo de inserción un objeto MenuStrip; para ello haga doble clic en el
control MenuStrip, que se encuentra en el grupo Menu & Toolbars de Toolbox. En
el formulario se integrará un sistema de menú, que podrá ser complementado de forma
totalmente visual. En la parte inferior de Form Designer aparecerá un panel donde se
muestran todos los objetos que visualmente no constituyen un elemento de la interfaz,
como es el caso de MenuStrip.
Capítulo 12. Desarrollo de Aplicaciones Windows 367

Form Designer debe lucir como sigue:

10. Vea cómo se ha integrado una barra de menúa que muestra el texto Type Here. Esta
herramienta se llama Menu Designer, que permite ir diseñando sistemas de menú con
suma facilidad. Por definición, un sistema de menú es un conjunto de opciones que se
distribuyen visualmente de forma jerárquica y que al ser seleccionadas desencadenan
acciones.

FIGURA 12.6 12
Menu Designer.

11. En Menu Designer cada opción constituye un elemento de menú (menu item). Se tie-
nen elementos de primer nivel, que son aquellas opciones que aparecen de forma per-
manente en la barra de menús, y que no dependen de ningún elemento de menú. Tam-
bién pueden insertarse elementos de segundo nivel, que son los que dependen de un
elemento de primer nivel; elementos de tercer nivel, cuarto nivel, y así sucesivamente.
368 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. En el área de edición donde aparece Type Here se escribe la etiqueta de elemento; si
como etiqueta del elemento emplea un verbo, procure utilizar uno en infinitivo. Al co-
menzar a editar una etiqueta de elemento, automáticamente se proponen elementos la-
tentes, que son aquellos que pudieran existir siempre y cuando se edite su etiqueta de
elemento. Aparecerá siempre un elemento latente abajo y otro a la derecha: los ele-
mentos latentes que aparecen en la parte inferior generan opciones de menú al mismo
nivel, mientras que las opciones que se editan hacia la derecha constituyen la forma-
ción de un nuevo nivel de elementos (salvo en el caso de los elementos de primer ni-
vel, donde lo que se genera es un nuevo elemento de primer nivel).
13. Escriba como etiqueta del elemento de primer nivel la palabra Acciones. En el ele-
mento latente inferior escriba Limpiar campos; en el elemento latente inferior escri-
ba un guión (-), y finalmente en el elemento latente inferior escriba Cerrar. Nuestro
sistema de menús debe lucir como sigue (observe que al aplicar un guión como eti-
queta se genera una línea separadora):

14. El sistema de menús es para Visual Basic un objeto de tipo MenuStrip; los elementos
de un sistema de menús constituyen objetos ToolStripMenuItem. Lo que escribimos en
la etiqueta de elemento realmente constituye la propiedad ToolStripMenuItem.Text de
cada elemento.

➤ Líneas guía en tiempo de diseño para la alineación de objetos

15. Ahora trabajaremos con objetos basados en el control Button, que se encuentra en el
grupo Common controls de Toolbox. Agregue un objeto Button a la interfaz y cambie
su nombre Button1 por btnAceptar. Agregue otro objeto Button y cambie su nombre
Button2 por btnCancelar. Trate de colocarlos en la parte inferior izquierda, como
usualmente Windows ubica los botones de aceptar y cancelar.
Capítulo 12. Desarrollo de Aplicaciones Windows 369

16. Al mover los objetos en la interfaz para colocarlos en el sitio que queremos, podremos
usar las líneas guía (snaplines) que Visual Basic muestra; éstas permiten una alinea-
ción y distribución estética de los controles.

FIGURA 12.7
Líneas guía de
Form Designer.

17. Existen diferentes líneas guía: las guías de proximidad, que son las que conectan a ob-
jetos entre sí, indicando la distancia recomendada entre objetos para una interfaz grá-
fica Windows (también pueden asociarse a bordes del espacio de trabajo). Además
existen las guías de alineación, que permiten evaluar la posición de un objeto en rela-
ción con otros objetos y elementos del entorno.
18. Mueva btnCancelar de tal forma que se ubique en la esquina inferior derecha. No de-
je de acomodar el botón hasta que vea las guías de proximidad con el borde derecho e
inferior. Eso garantiza las medidas estándar de una interfaz Windows.
12

19. Mueva btnAceptar de tal manera que se muestren las guías de proximidad, tanto con
el borde inferior como con btnCancelar; además deberá buscarse que aparezca la guía
de alineación que garantice que el texto interno de los botones estén alineados en su lí-
mite inferior.
370 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

20. Modifique las siguientes propiedades:

Propiedad Valor a asignar

btnAceptar.Text &Aceptar

btnCancelar.Text &Cancelar

frmEmpresa.CancelButton btnCancelar

21. La propiedad Button.Text permite asignar el texto que aparecerá en la cara del bo-
tón. Si se antepone el carácter & a una de las letras en Button.Text, automáticamen-
te se forma una tecla de atajo (shortcut); esto permite que oprimir la combinación de
teclas Alt-A equivalga a hacer clic en btnAceptar, y presionar Alt-C sea equivalente
a hacer clic en btnCancelar.
22. La propiedad Form.AcceptButton permite definir a un botón existente en la interfaz
como acción de aceptación, por lo cual oprimir la tecla Intro equivale a hacer clic en
el botón especificado. Por otro lado, Form.CancelButton permite definir a un botón
existente en la interfaz como acción de cancelación, por lo cual oprimir la tecla Esc
equivale a hacer clic en btnCancelar. En nuestra interfaz se asigna btnCancelar
como botón de cancelación.
23. Nuestra interfaz debe lucir como sigue:

➤ Cómo agregar imágenes a objetos Button

24. Asigne un valor a btnAceptar.Image; para ello haga clic en el botón de asistencia de
introducción de valores . Recuerde que todas las asignaciones de valores se realizan
desde Properties (tecla F4). Aparecerá la ventana Select Resource:
Capítulo 12. Desarrollo de Aplicaciones Windows 371

25. El valor que ha de recibir btnAceptar.Image es de tipo Image, y no puede represen-


tarse mediante código. Para ese tipo de valores y contenidos cada proyecto posee un
archivo de recursos, de extensión .RESX; en ese archivo se almacenan diversos elemen-
tos externos que deseamos sean considerados como parte integral de la aplicación.
26. Haga clic en Import..., y seleccione el archivo ok.png que se encuentra en el directo-
rio de archivos complementarios del capítulo. Haga clic nuevamente en Import... y se-
leccione el archivo Error.png. En la lista de recursos tendrá entonces a Ok y Error.
Seleccione Ok de la lista de recursos y acepte haciendo clic en el botón Ok. La imagen
seleccionada aparecerá en el centro del objeto.
27. Modifique btnCancelar.Image; seleccione el recurso Error de la lista de recursos
cuando ésta aparezca. Haga clic en Ok para aceptar. La imagen aparecerá al centro del 12
botón.
28. Como puede ver, las imágenes al centro de los botones no son las más adecuadas. Mo-
difique btnAceptar.ImageAlign asignando el valor MiddleLeft. Al hacer la modifi-
cación aparecerá una ayuda visual que indica la posición en donde deseamos colocar
la imagen.
372 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

29. Asigne también el valor de MiddleLeft a btnCancelar.ImageAlign.


30. La propiedad Button.Image representa la imagen que un botón presentará en su cara,
mientras que Button.ImageAlign representa la posición que la imagen ocupará en la
cara del botón.
31. Nuestros botones deben lucir de la siguiente manera:

32. Como puede ver, los botones están muy compactados, por lo que deberá incrementar
sus dimensiones utilizando los delimitadores de tamaño. Incremente el tamaño de bt-
nAceptar hasta que el texto y la imagen se ajusten correctamente. Aunque la tentación
sea mucha, no modifique por el momento el tamaño de btnCancelar.

FIGURA 12.8
Modificando
dimensiones
de botón

➤ Opciones de formato para grupos de objetos

33. Un grupo de objetos es la selección de varios objetos en tiempo de diseño. Cuando se


tiene un grupo de objetos en Properties aparecerán sólo las propiedades que son com-
partidas por todos ellos; modificar el valor de una propiedad cuando se trabaja con un
grupo de objetos equivale a modificar el valor de dicha propiedad para todos los obje-
tos del grupo.
34. Al trabajar con un grupo de objetos, en todos ellos se colocarán delimitadores de ta-
maño. Sólo uno de ellos tendrá los delimitadores de tamaño en color blanco, mientras
que el resto de los objetos tendrá los delimitadores en color negro. El objeto que tiene
los delimitadores en color blanco es el objeto principal de referencia; es decir, que las
opciones de formato aplicables al grupo van en función a dicho objeto. Teniendo se-
leccionado un grupo, basta con hacer clic sobre alguno de los objetos del mismo para
que asuma el rol de objeto principal de referencia.
35. Las opciones de menú pertinentes para el objeto principal de referencia son las si-
guientes:
Capítulo 12. Desarrollo de Aplicaciones Windows 373

Icono en barra de herramienta/Opción de menú Acción

Format – Align – Lefts Alinea todos los objetos del grupo con el borde
izquierdo del objeto principal de referencia.
Format – Align – Centers Alinea todos los objetos del grupo con el eje
central vertical del objeto principal de referencia.
Format – Align – Rights Alinea todos los objetos del grupo con el borde
derecho del objeto principal de referencia.
Format – Align – Tops Alinea todos los objetos del grupo con el borde
superior del objeto principal de referencia.
Format – Align – Middles Alinea todos los objetos del grupo con el eje
central horizontal del objeto principal de referencia.
Format – Align – Bottoms Alinea todos los objetos del grupo con el borde
inferior del objeto principal de referencia.
Format – Make same size - Width Establece a los objetos del grupo con el mismo
ancho que el objeto principal de referencia.
Format – Make same size - Height Establece a los objetos del grupo con el mismo
alto que el objeto principal de referencia.
Format – Make same size - Both Establece a los objetos del grupo con el mismo
tamaño que el objeto principal de referencia.
Format – Horizontal spacing – Establece una misma distancia entre los objetos,
Make equal sobre el eje horizontal.
12
Format – Horizontal spacing – Incrementa de forma proporcional la distancia
Increase entre los objetos, sobre el eje horizontal.
Format – Horizontal spacing – Disminuye de forma proporcional la distancia
Decrease entre los objetos, sobre el eje horizontal.
Format – Horizontal spacing – Elimina la distancia entre los objetos, sobre el
Remove eje horizontal, dejándolos contiguos.
Format – Vertical spacing – Establece una misma distancia entre los objetos,
Make equal sobre el eje vertical.
Format – Vertical spacing – Incrementa de forma proporcional la distancia
Increase entre los objetos, sobre el eje vertical.
Format – Vertical spacing – Disminuye de forma proporcional la distancia
Decrease entre los objetos, sobre el eje vertical.
Format – Vertical spacing – Elimina la distancia entre los objetos, sobre
Remove el eje vertical, dejándolos contiguos.
374 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

36. Otras opciones de formato aplicables tanto para los objetos en grupo como para un ob-
jeto individual, son las siguientes:

Icono en barra de herramienta/Opción de menú Acción

Format – Center in form – Centra los objetos respecto al ancho del


Horizontally formulario.
Format – Center in form – Vertically Centra los objetos respecto al alto del
formulario.
Format – Order – Bring to front Coloca el objeto al frente de los demás, de tal
forma que tendrá prioridad en la selección.
Format – Order – Send to back Coloca el objeto atrás de los demás, dándoles
menor prioridad de selección.

37. Trace un rectángulo imaginario que toque los dos botones del formulario.

38. Al soltar el ratón se habrán seleccionado los objetos en modo grupo.

39. El objeto primario de referencia es btnCancelar, dado que tiene delimitadores de ta-
maño en color blanco. Haga, en btnAceptar, a fin de que se establezca como objeto
primario de grupo.
40. Seleccione Format – Make same size – Both . Los botones asumirán el tamaño del ob-
jeto principal de referencia, es decir, btnAceptar.
41. Apoyándose en las líneas guía, vuelva a distribuir los botones de tal manera que ten-
gan una distribución estética. Nuestro formulario debe lucir como sigue:
Capítulo 12. Desarrollo de Aplicaciones Windows 375

➤ Cómo establecer páginas de controles (TabControl)

42. En modo trazo agregue un objeto TabControl, que se encuentra en el grupo Contai-
ners de Toolbox. Trace el objeto de tal forma que quede entre la barra de menú y los
botones, abarcando casi hasta los bordes el ancho del formulario.
43. Aparecerá el objeto TabControl, mostrando dos fichas (tabs).

FIGURA 12.9 12
TabControl.
376 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

44. Lo que se agrega a la interfaz es un objeto TabControl que contiene dos objetos Tab-
Page; cada TabPage posee su pestaña de selección, de tal forma que se pueda alternar
entre ellas. Si hacemos clic sobre el área superior del control, es decir, en el área donde
se encuentran las pestañas de selección de página, estaremos trabajando con el objeto
TabControl en su calidad de contenedor de objetos TabPage. Por otro lado, si hacemos
clic en la pestaña de algún TabPage y luego hacemos clic en el cuerpo de la página,
estaremos trabajando con el objeto TabPage.
45. Haga clic en cualquiera de las pestañas de selección de página, a fin de seleccionar el
TabControl. Cambie el nombre del objeto de TabControl1 a tcDatos.
46. TabControl proporciona herramientas a nivel objeto para la manipulación de su compor-
tamiento y apariencia (figura 12.09). A través de los delimitadores de tamaño es posible
extender o contraer el control, simplemente arrastrando el delimitador en la dirección
en que queremos que se expanda o contraiga. También está el icono para mover el ob-
jeto de lugar, a través del cual podemos arrastrar un control hacia otro sitio en la inter-
faz. Finalmente tenemos el icono de tareas de objeto (smart tag) que proporciona una
liga rápida hacia las acciones más comunes a realizar con el control, y además permite
la modificación rápida de las propiedades más comunes; si bien las acciones son gene-
ralmente posibles en el menú de contexto, smart tag es más específico.
47. Haga clic en el smart tag del objeto y seleccione el vínculo Add Tab.

48. Se agregará un TabPage más a tcDatos. En el plano subyacente, lo que ocurrió es que
se agregó un elemento más a la colección TabPages.
49. Si seleccionamos la pestaña de un TabPage y luego hacemos clic en el área del cuer-
po del TabPage estaremos trabajando con la página. Seleccione la ficha TabPage1 y ha-
ga clic en el cuerpo de la página; en Properties cambie la propiedad Name, de TabPa-
ge1 a tpGenerales. Modifique también el nombre de TabPage2 por tpContacto, y el
de TabPage3 por tpSitio.
50. Modifique las siguientes propiedades:

Propiedad Valor a asignar

tpGenerales.Text Datos generales


tpContacto.Text Persona de contacto
tpSitio.Text Sitio en Internet
btnAceptar.Enabled False
Capítulo 12. Desarrollo de Aplicaciones Windows 377

51. Seleccione tpGenerales y agregue 5 etiquetas (Label), 1 cuadro de texto con másca-
ra (MaskedTextBox), 3 cuadros de texto (Textbox) y un objeto para selección de fe-
cha (DateTimePicker). Todos los controles se encuentran en el grupo Common Con-
trols de Toolbox.
52. Distribuya los objetos de la siguiente forma:

53. Modifique las siguientes propiedades. Un consejo rápido: si al seleccionar un objeto su


propiedad por omisión es Text, se puede comenzar a escribir el valor de la propiedad 12
Text sin seleccionarla en Properties. Tal es el caso de Label: haga clic en los objetos
Label y escriba simplemente lo que la etiqueta ha de mostrar, automáticamente se ac-
tualizará Text. Los controles se relacionan en orden de lectura de izquierda a derecha,
de arriba abajo:

Propiedad Valor a asignar

Label1.Text ID Empresa:
MaskedTextBox1.Name mtbIDEmpresa

mtbIDEmpresa.Mask , seleccionar <Custom> y


escribir 9999999999 en Mask
378 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 12.10
Input Mask.

Propiedad Valor a asignar

Label1.Text ID Empresa:
Label2.Text Nombre:
TextBox1.Name txtNombre
txtNombre.CharacterCasing Upper
txtNombre.MaxLength 40
Label3.Text Dirección:
TextBox2.Name txtDireccion
txtDireccion.AcceptsReturn True
txtDireccion.MaxLength 200
txtDireccion.Multiline True
(aumentar el alto del objeto,
una vez modificada esta
propiedad)
Label4.Text NIP de acceso:
TextBox3.Name txtNIP
txtNIP.MaxLength 10
txtNIP.PasswordChar *
DateTimePicker1.Name dtpClienteDesde
Capítulo 12. Desarrollo de Aplicaciones Windows 379

54. La interfaz debe lucir de la siguiente manera:

55. Las propiedades Text de los controles indican la parte textual visible de los objetos. La
propiedad MaskedTextBox.Mask sirve para representar la máscara o patrón de entrada
que aceptará el control; en nuestro caso, el número de empresa es un número de máxi-
mo diez posiciones, por lo que la máscara de entrada es 9999999999. La propiedad
TextBox.CharacterCasing determina si el contenido del cuadro de texto será conver-
tido a minúsculas, mayúsculas, o será mixto; en nuestro caso pedimos que el nombre de
la empresa esté en mayúsculas. La propiedad TextBox.MaxLength permite especificar 12
el número máximo de caracteres que podrán ser ingresados en el cuadro de texto. La
propiedad TextBox.AcceptsReturn permite que se incluya Intro dentro del conteni-
do, sin darle significado especial. La propiedad TextBox.MultiLine establece que el
cuadro de texto puede incluir varias líneas de escritura; al establecer esta propiedad como
True, automáticamente aparecen delimitadores de tamaño que permiten no sólo incre-
mentar el ancho del objeto, sino también el alto. La propiedad TextBox.PasswordChar
permite establecer un símbolo a través del cual lo que uno escribe en un cuadro de tex-
to queda oculto a la vista.
56. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la
tecla F5). Ejecute la aplicación y verifique que en el ID de la empresa sólo se puedan
capturar números, hasta un total de diez; que lo capturado en el nombre siempre esté
en mayúscula, que en dirección se pueda capturar más de una línea; que se admita el
uso de Intro; que el NIP aparezca como oculto a la vista, y que se pueda seleccionar
una fecha distinta a la mostrada como antigüedad del cliente.

FIN DEL EJERCICIO*


380 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 12.3
Uso de grupos de controles, combos y selectores de número

Aprenderá a utilizar grupos de controles, combos y selectores de números en una interfaz


Windows.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Continúe trabajando con el proyecto Empresa, iniciado en el ejercicio anterior.
3. Seleccione tpContacto y agregue cuatro etiquetas (Label), un cuadro de texto (Text-
Box), un cuadro de texto con máscara (MaskedTextBox), un cuadro combinado (Com-
boBox), un selector de número (NumericUpDown) y un cuadro de grupo (GroupBox),
dentro del cual se deberán agregar en modo arrastre dos botones de opción (Radio-
Button). Al seleccionar el cuadro de grupo y moverlo de lugar, los botones de radio
deberán moverse junto con él.
4. Distribuya los objetos de la siguiente manera:

5. Modifique las siguientes propiedades:

Propiedad Valor a asignar

Label6.Text Nombre:
TextBox1.Name txtNombreCon
txtNombreCon.MaxLength 50
Capítulo 12. Desarrollo de Aplicaciones Windows 381

txtNombreCon.CharacterCasing Upper
Label7.Text Teléfono:
MaskedTextBox1.Name mtbTelefono
mtbTelefono.Mask 99 (99) 9999-9999
Label8.Text Título:
ComboBox1.Name cboTitulo

cboTitulo.Items , y escribir las opciones


del combo, una en cada línea.

FIGURA 12.11
String Collection
Editor.

12

Propiedad Valor a asignar

Label9.Text Sucursales:
NumericUpDown1.Name nudSucursales
nudSucursales.Maximum 50
nudSucursales.Minimum 1
GroupBox1.Text Sexo
RadioButton1.Name rbtnMasculino
rbtnMasculino.Checked True
rbtnmasculino.Text Masculino
RadioButton2.Name rbtnFemenino
rbtnFemenino.Text Femenino
382 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. La interfaz debe lucir de la siguiente manera:

7. Las propiedades Text de los controles indican la parte textual visible de los controles.
La propiedad NumericUpDown.Maximum sirve para indicar el número máximo hasta
donde permitirá el selector de números llegar, mientras que NumericUpDown.Minimum
determina el mínimo. La propiedad GroupBox.Text permite establecer el texto de
encabezado que ha de aparecer en un cuadro de grupo de controles. La propiedad
RadioButton.Checked indica si el botón de opción está seleccionado o no; sólo puede
haber un botón de opción seleccionado en un grupo de controles a un tiempo.
8. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la
tecla F5). Ejecute la aplicación y verifique que aparecen todos los elementos que haya
agregado en String Collection Editor para el cuadro combinado; que los límites máxi-
mos y mínimos del selector de números se respete, y que al seleccionar un botón de
opción dentro de un grupo, los demás dejan de estar seleccionados.
FIN DEL EJERCICIO*

Ejercicio 12.4
Orden de tabulación y activación dinámica de controles

Aprenderá a manipular la activación dinámica de controles en una interfaz, dependiendo


del cumplimiento de condiciones. Aprenderá también el manejo de la herramienta Tab
Order.
Capítulo 12. Desarrollo de Aplicaciones Windows 383

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Continúe trabajando con el proyecto Empresa, iniciado en el ejercicio 12.2.
3. Seleccione tpSitio y agregue un objeto de casilla de verificación (CheckBox), un cua-
dro de texto (TextBox), un botón de comando (Button), un control de navegación en
Internet (WebBrowser) y un control de ayuda fugaz (ToolTip). Este último es invisible
en tiempo de ejecución, por lo que no se agrega a la interfaz; la forma en que deberá
incluirlo es arrastrando el control desde ToolBox hasta el cuadro de texto de la interfaz.
4. Distribuya los objetos de la siguiente forma:

5. Modifique las siguientes propiedades:


12
Propiedad Valor a asignar

CheckBox1.Name chkSitio
chkSitio.Text Tiene sitio Web?
TextBox1.Name txtURL
txtURL.Enabled False
Button1.Name btnVerSitio
btnVerSitio.Text &Ver
btnVerSitio.Enable False
WebBrowser1.Name webPagina
txtURL.ToolTip on ToolTip1 Coloque aquí la ruta http
del sitio
ToolTip1.ToolTipTitle Mensaje del sistema
384 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. La interfaz debe lucir de la siguiente forma:

7. Las propiedades Text de los controles indican la parte textual visible de los objetos.
La propiedad ToolTip.ToolTipTitle sirve para especificar el título de encabeza-
do que aparecerá con el mensaje de ayuda fugaz, que se especifica en la propiedad
TextBox.ToolTip. La propiedad Control.Enabled de los controles indica si están o
no disponibles para su uso en tiempo de ejecución, no obstante de que estén visibles.

➤ Lanzamiento de tareas desde la barra de menús

8. Una de las tareas más comunes en el desarrollo de interfases es la de limpiar los datos
existentes en los campos para iniciar una nueva captura. En nuestro ejemplo, colóque-
se en cualquier parte del formulario en tiempo de diseño, despliegue el menú contex-
tual y seleccione la opción View Code para ver el código del programa. Como no he-
mos codificado nada, aparecerá la declaración de una clase en blanco. Codifique la
siguiente rutina que limpiará todos los campos que podemos editar en nuestra interfaz
(debe ir entre el inicio y el fin de la declaración de la clase).

Codificación de Empresas – Form1.vb - LimpiaCampos

1 Sub LimpiaCampos()
2 ‘ Campos del primer TabPage
3 mtbIDEmpresa.Text = “”
4 txtNombre.Text = “”
5 txtDireccion.Text = “”
Capítulo 12. Desarrollo de Aplicaciones Windows 385

6 txtNIP.Text = “”
7
8 ‘ Campos del segundo TabPage
9 txtNombreCon.Text = “”
10 mtbTelefono.Text = “”
11 rbtnMasculino.Checked = True
12 cboTitulo.SelectedIndex = 0
13
14 ‘ Campos del tercer TabPage
15 chkSitio.Checked = False
16 txtURL.Text = “”
17 txtURL.Enabled = False
18 btnVerSitio.Enabled = False
19 End Sub

9. Como puede ver, se limpian todos los campos textuales y se reestablecen los valores
iniciales del formulario.
10. Vaya a Form Designer y en tiempo de diseño seleccione la opción Limpiar Campos,
haciendo doble clic sobre la opción. Aparecerá nuevamente el código, pero habrá agre-
gado un procedimiento de evento que se lanzará cuando el usuario seleccione la op-
ción en tiempo de ejecución. El procedimiento se llama LimpiarCamposToolStripMe-
nuItem_Click. En dicho procedimiento mande llamar el procedimiento LimpiaCampos,
que acabamos de desarrollar.

Codificación de Empresas – Form1.vb – LimpiarCamposToolStripMenuItem_Click


12
1 Private Sub LimpiarCamposToolStripMenuItem_Click(
ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles LimpiarCamposToolStripMenuItem.Click
2 Call LimpiaCampos()
3 End Sub

11. Aunque la instrucción Call para mandar a ejecutar un procedimiento puede omitirse,
se incluye para mejorar la claridad del código.
12. Vaya a Form Designer y en tiempo de diseño seleccione la opción Cerrar, haciendo
doble clic sobre la opción. Aparecerá nuevamente el código, que deberá complemen-
tar de la siguiente manera:
386 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Empresas – Form1.vb – CerrarToolStripMenuItem_Click

1 Private Sub CerrarToolStripMenuItem_Click(


ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles CerrarToolStripMenuItem.Click
2 Me.Close()
3 End Sub

13. Al aplicar el método Close() sobre el formulario (que se reconoce a sí mismo como
Me), se cierra el formulario.
14. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la
tecla F5). Ejecute la aplicación, escriba en los campos textuales del formulario y se-
leccione la opción de menú Limpiar Campos. Luego compruebe que al utilizar la op-
ción de menú Cerrar, el formulario se cierra. Con ello habrá aprendido cómo enviar
comandos a través del menú.

➤ Procedimiento para el evento de arranque (Load)

15. Un formulario tiene un procedimiento de evento de arranque, denominado Load. El


evento Form.Load sucede antes de que el formulario sea desplegado por primera vez,
y es ahí donde podemos especificar aquellas cosas que sean establecidas antes que
cualquier cosa suceda en la interfaz. Una cosa que nos gustaría es que los campos es-
tuvieran limpios antes de comenzar a trabajar con la interfaz. Para lograrlo podemos
ejecutar el procedimiento LimpiaCampos en el procedimiento de evento de arranque.
16. Un evento por omisión (default event), es el procedimiento de evento más común para un
determinado tipo de objeto; al estar en Form Designer y hacer doble clic sobre un de-
terminado objeto, Visual Studio abrirá Text Editor y preconstruirá la estructura del
procedimiento del evento por omisión. Cuando hacemos doble clic sobre un botón, por
ejemplo, se precodificará el procedimiento de evento para el evento Button.Click,
dado que Button.Click es el evento más común del tipo de objeto.
17. Para codificar el evento Form.Load de nuestro formulario bastará hacer doble clic en
cualquier parte no ocupada dentro del formulario, dado que Form.Load es el evento
por omisión de Form. Desde Form Designer, haga doble clic en cualquier parte no
ocupada del formulario.
18. Aparecerá la codificación del procedimiento de evento frmEmpresa.Load. Edite el
programa de tal manera que el procedimiento quede de la siguiente forma:
Capítulo 12. Desarrollo de Aplicaciones Windows 387

Codificación de Empresas – Form1.vb - frmEmpresa_Load

1 Private Sub frmEmpresa_Load(


2 ByVal sender As System.Object, ByVal e As System.EventArgs)
3 Handles MyBase.Load
4 Call LimpiaCampos()
5 End Sub

19. De esta manera, antes de que el formulario se muestre por primera vez, será ejecuta-
do el procedimiento que iniciará los valores del formulario.

➤ Uso de Tab Order para establecer el orden de tabulación

20. El orden de tabulación es el orden en que los objetos adquieren el enfoque de manera
secuencial al presionar la tecla TAB. Lo ideal es que el orden de tabulación obedezca
a la forma natural en que el usuario de la aplicación está acostumbrado a ordenar los
datos de entrada. En tiempo de diseño procuramos ser ordenados, pero no siempre po-
demos agregar los objetos en el orden de tabulación que deseamos. Eso no nos debe
preocupar, dado que es posible modificar el orden de tabulación utilizando la propie-
dad Control.TabIndex de los objetos.
21. Otra opción es hacer clic en el botón Tab Order de la barra de herramientas de
formato en tiempo de diseño. Seleccione tpContacto y haga clic en el botón Tab Order.
Aparecerá una interfaz muy parecida a la siguiente:
12
FIGURA 12.12
TabOrder.
388 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

22. Los números que aparecen en los controles son los índices de orden, e indican el or-
den y la profundidad del mismo. De acuerdo con la figura 12.12, el menú es el punto
de donde parte el orden de tabulación (0), siguiendo el botón Aceptar (1), luego el bo-
tón Cancelar (2) y finalmente el TabControl (3). Como TabControl es contenedor, su
contenido tendrá un orden 3.x.y.z, donde x es el orden de las páginas, y es el orden de
los controles dentro de la página, y z sería el orden de los controles dentro de un con-
trol contenedor dentro de la página.
23. Se recomienda que las etiquetas (Label) sean las primeras en el orden, dado que no
reciben el enfoque. Después debe darse el orden de acuerdo a como se desee el or-
den de tabulación. Para modificar el orden sólo se requiere hacer clic sobre el control
hasta que tenga el índice de orden que queremos. Al tener activada la herramienta de
Tab Order, al posicionar el puntero del ratón sobre el control, aparece un borde som-
breado y el puntero cambia a cruz. Al hacer clic en ese momento, el índice de orden
cambia, y cambia el orden del resto de los controles de tal manera que no haya dos
iguales.

24. Modifique el orden de tabulación de tal manera que quede de la siguiente manera:
Capítulo 12. Desarrollo de Aplicaciones Windows 389

25. Al terminar de colocar el orden deseado, basta hacer clic en el botón Tab Order
nuevamente para dar por aceptados los cambios. Se recomienda aplicar el orden de ta-
bulación cuando ya se está bastante seguro de que no modificará la interfaz.

➤ Bloqueo de controles (Lock Controls)

26. Cuando ya la interfaz está bastante depurada y en orden, lo conveniente es aplicar el


bloqueado de controles, que consiste en inhabilitar la posibilidad de modificaciones a
los controles en tiempo de diseño; se permitirá sólo la codificación. Para bloquear los
controles sólo se tiene que seleccionar la opción Format – Lock Controls; aparecerá
un pequeño candado en la esquina superior izquierda de los controles, lo que indica
que están bloqueados.

➤ Activación dinámica de elementos

27. Una de las principales actividades preventivas que una interfaz puede realizar es no
permitir la ejecución de trabajos si los datos para un proceso no son completos y co-
rrectos. Una forma de hacerlo es que el botón de comando que ejecute el procesamien-
to o el almacenamiento se mantenga inhabilitado, en tanto no se cuente con todos los
datos requeridos.
28. En nuestro caso, deseamos que antes de que se pueda presionar el botón Aceptar los
objetos siguientes tengan un valor: mtbIDEmpresa, txtNombre, txtDireccion, txt-
NIP, txtNombreCon, mtbTelefono. El valor de todos ellos está representado por la pro-
piedad Text. 12
29. En Form Designer, despliegue el menú contextual y seleccione View Code. En Text
Editor codifique el siguiente procedimiento dentro de la clase:

Codificación de Empresas – Form1.vb - ActivaAceptar

1 Sub ActivaAceptar(ByVal sender As Object, ByVal e As EventArgs)


Handles mtbIDEmpresa.LostFocus, txtNombre.LostFocus,
txtDireccion.LostFocus, txtNIP.LostFocus,
txtNombreCon.LostFocus, mtbTelefono.LostFocus
2 If mtbIDEmpresa.Text = “” Or txtNombre.Text = “” _
3 Or txtDireccion.Text = “” Or txtNIP.Text = “” _
4 Or txtNombreCon.Text = “” Or mtbTelefono.Text = “” Then
5 btnAceptar.Enabled = False
6 Else
7 btnAceptar.Enabled = True
8 End If
9 End Sub
390 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

30. En la línea 1 del bloque anterior se declara el procedimiento. Después del nombre del
procedimiento (ActivaAceptar) se abren paréntesis declarando dos argumentos. Es-
tos argumentos se denominan argumentos implícitos, dado que CLR en tiempo de eje-
cución provee los datos a los argumentos sin que el usuario tenga que enviarlos me-
diante una llamada Call. La mayoría de los eventos manejados en .NET requieren de
dos argumentos implícitos: sender, que puede ser cualquier tipo de objeto (Object)
transferido en modo value type y que hace referencia al objeto desde el cual se desen-
cadena el evento; y e que es de tipo EventArgs (manejador de argumentos de even-
tos), que también es pasado en modo value type. En la misma declaración del proce-
dimiento se agrega la referencia Handles, que indica qué eventos controlará el
procedimiento codificado. En nuestro caso, el procedimiento se ejecutará cuando se
cause el evento Control.LostFocus para los objetos mtbIDEmpresa, txtNombre, txt-
Direccion, txtNIP, txtNombreCon, mtbTelefono. En todo el código no verá un lla-
mado a ejecución de ActivaAceptar; CLR lo lanzará a ejecución y será quien también
le dirá qué objeto es el que provocó, así como los argumentos pertinentes del evento.
31. En la líneas 2 a la 4 se evalúa si alguno de los objetos no ha sido capturado (Text=””),
en cuyo caso inhabilita el botón Aceptar. De lo contrario, es decir, si todos tienen va-
lor, el botón Aceptar se habilita.
32. Otra activación automática que podemos hacer es que, en la tercera página, sólo se
pueda capturar información de URL y ver la página en Internet si la casilla de verifi-
cación está marcada. En Form Designer haga doble clic en chkSitio. Se precodifica-
rá el procedimiento por omisión aplicable al cuadro de verificación. Se trata del even-
to CheckBox.CheckedChanged, que se lanzará cuando se cambie el estado de marcado
de la casilla de verificación. Codifique lo siguiente:

Codificación de Empresas – Form1.vb – chkSitio_CheckedChanged

1 Private Sub chkSitio_CheckedChanged(


ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles chkSitio.CheckedChanged
2 txtURL.Enabled = chkSitio.Checked
3 btnVerSitio.Enabled = chkSitio.Checked
4 End Sub

33. Nos aprovechamos de que la propiedad que almacena si la casilla de verificación está
o no marcada es Boolean. Si la casilla de verificación no está marcada, la propiedad
CheckBox.Checked es False, y si está marcada la propiedad CheckBox.Checked es
True. Asigne el valor de CheckBox.Checked a las propiedades Control.Enabled de
los objetos dependientes: al marcar la casilla de verificación, los objetos se activarán,
y al desmarcarla se inhabilitarán (líneas 2 y 3).
Capítulo 12. Desarrollo de Aplicaciones Windows 391

34. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la
tecla F5). Ejecute la aplicación y verifique que el botón Aceptar está disponible sólo
si todos los campos requeridos tienen datos. Verifique que el cuadro de verificación
gobierna la disponibilidad del cuadro de texto en el que se solicita el URL y el botón
de ver sitio.

FIN DEL EJERCICIO*

Ejercicio 12.5
Uso de controles para la visualización de páginas Web

Aprenderá a utilizar los controles para la visualización de contenidos Web desde formula-
rios Windows.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Continúe trabajando con el proyecto Empresa del ejercicio anterior.
3. En Form Designer seleccione tpSitio y haga doble clic en btnVerSitio para editar el
procedimiento que ha de ejecutarse al hacer clic en el botón Ver. Codifique lo siguiente:

Codificación de Empresas – Form1.vb - btnVerSitio_Click 12


1 Private Sub btnVerSitio_Click(
ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnVerSitio.Click
2 webPagina.Navigate(New Uri(txtURL.Text))
3 End Sub

4. La línea 2 se encarga de ir, en el objeto WebBrowser, a la dirección en Internet que se


haya proporcionado en txtURL. La liga no puede proporcionarse de forma textual, y
por ello tiene que ser una nueva instancia de la clase WebBrowser.Uri, que permite es-
pecificar recursos en Internet.
5. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la
tecla F5). Ejecute la aplicación, active la casilla de verificación que pregunta si tiene
sitio Web, escriba como liga http://www.aprendapracticando.com y haga clic en Ver.
La página debe aparecer en el formulario.
FIN DEL EJERCICIO*
392 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 12. Desarrollo de Aplicaciones Windows 393

TERMINOLOGÍA

AcceptButton, 370 de menú, 357 For Each, 362 Menús, 357


AcceptReturn, 378 Controls, 362 GotFocus, 364 MenuStrip, 357
Add, 361 Count, 361 Graphic User MenuStrip, 366
BackgroundWorker, Cuadros de diálogo, Interface, 344 MessageQueue, 359
358 360 GroupBox, 357 Modo
Barra de herramien- DataGridView, 358 Grupo(s) arrastre, 348
tas, 357 DataSet, 358 de controles, 347 inserción, 348
BindingNavigator, DateTimePicker, 355 de objetos, 372 trazo, 348
358 Default event, 386 GUI, 344 MonthCalendar, 356
BindingSource, 358 Delimitadores de Guías Multiline, 378
Bloqueo de con- tamaño, de alineación, NotifyIcon, 356
troles, 389 372 369 NumericUpDown,
Boxing, 361 Dialogs, 360 de proximidad, 356
Button, 355 Directory Searcher, 369 Objeto
Call, 385 359 HelpProvider, 359 contenedor, 346
CancelButton, 370 DirectoryEntry, 358 Image, 370 hijo, 346
CharacterCasing, Elemento de menu, ImageAlign, 371 padre, 346
378 367 ImageList, 359 principal de refe-
CheckBox, 355 Elementos gráficos Input Mask, 378 rencia, 372
CheckedListBox, 355 de interfaz, 346 Interfaz de usuario, OpenFileDialog, 360
Child, 346 Enabled, 363 344 PageSetupDialog,
Close, 386 Enfoque, 363 Interfaz gráfica de 360 12
Colección, 361 Enter, 364 usuario, 344 Páginas de con-
ColorDialog, 360 ErrorProvider, 359 Item(s), 361, 381 troles, 375
ComboBox, 355 Etiqueta de ele- Label, 356 Panel, 357
Common Controls, mento, 368 Leave, 364 Parent, 346
355 EventLog, 359 Líneas guía, 369 PasswordChar, 378
Containers, 357 Evento por omisión, LinkLabel, 356 Performance
ContextMenuStrip, 386 ListBox, 356 Counter, 359
357 FileSystem Watcher, ListView, 356 PictureBox, 356
Controles, 347 359 Load, 386 Pointer, 355
Controles FlowLayoutPanel, Lock Controls, 389 PrintDialog, 360
comunes, 355 357 LostFocus, 364 PrintDocument,
contenedores, Focus, 363 Mask, 377 360
357 FolderBrowserDia- MaskedTextBox, 356 Printing, 359-60
de impression, log, 360 MaxLength, 378 PrintPreview
359-60 FontDialog, 360 Menu item, 367 Control, 360
394 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

PrintPreview RichTextBox, 356 TabIndex, 363 Container, 358


Dialog, 360 SaveFileDialog, 360 TableLayoutPanel, Designer, 366
Procedimiento de SerialPort, 359 357 ToolTipTitle, 383
evento de Service Controller, Tareas de objeto, ToolTrip, 356
arranque, 386 359 376 TreeView, 356
Process, 359 Smart tag, 376 Tecla de atajo, 370 Unboxing, 361
ProgressBar, 356 Snaplines, 369 Text, 370 Uri, 391
RadioButton, 356 SplitContainer, 357 TextBox, 356 Validated, 364
Remove, 361 StatusStrip, 357 Timer, 359 Validating, 364
ReportViewer, 358 TabControl, 357, Toolbars, 357 Visible, 363
RESX, 371 375 ToolStrip, 358 WebBrowser, 356

PREGUNTAS
12.1 ¿Cuál es el principal propósito de una interfaz?
12.2 Explique qué son los objetos contenedores y cuándo se da una relación padre-hijo
entre objetos.
12.3 ¿Cuáles son las tres formas de agregar objetos en Form Designer?
12.4 Mencione los pasos que integran la estrategia para el estudio efectivo de controles.
12.5 ¿Qué importancia tiene que los controles deriven de la clase Control y Object? ¿En
qué nos beneficia?
12.6 Seleccione 15 controles que considere que utilizará en sus interfases Windows.
Capítulo 12. Desarrollo de Aplicaciones Windows 395

Notas:

12
396 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Elemento a través del cual un programa recibe datos:
a) Formulario
b) Control
c) Interfaz de usuario

2. Es un objeto que contiene a otros objetos:


a) Formulario
b) Objeto contenedor
c) Objeto receptor

3. Las propiedades, métodos y eventos, son:


a) Argumentos
b) Elementos de interfaz
c) Miembros

4. Todos los controles de Windows.Forms.Controls derivan de:p


a) Namespace
b) Enumeraciones
c) Clases Object y Control

5. Es la forma de agregar controles en donde mayor control se tiene de la posición y las dimensiones de
los objetos:
a) Inserción
b) Arrastre
c) Trazo

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Los objetos no pueden anidarse.

7. Los manejadores permiten asociar un procedimiento con un evento.

8. En unboxing, un objeto pasa a ser un tipo de dato primitivo.

9. Un grupo de controles puede tener sólo objetos de un mismo tipo.

10. La clase Object deriva de la clase Control.


CAPÍTULO 13
Desarrollo de aplicaciones
Web con ASP.NET
Objetivos: Aprender la estructura general de una página Web codificada en
ASP.NET.

1. Conocer los requerimientos para el desarrollo de aplicaciones Web en


.NET.
2. Identificar los elementos que pueden integrarse en una página Web
ASP.NET para guardar compatibilidad con desarrollos pasados.
3. Identificar las directivas y conocer cómo se agregan a una página Web.
4. Aprender qué son los formularios del servidor y cómo se agregan a una
página Web.
5. Conocer los controles del servidor, qué tipos hay y cómo se agregan a
una página Web.
6. Aprender qué es el código declarativo y cómo se agrega a una página
Web.

397
398 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Motivos del auge de las aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Requerimientos para el desarrollo de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . 400
Entorno operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Procesamiento de páginas Web en .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Características de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Elementos de una página Web ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Estructura básica de una página ASP.NET . . . . . . . . . . . . . . . . . . . . . . . 410
Contenido HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Bloques proveedores de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Formulario del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Controles del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Adición de código a una página: Código declarativo . . . . . . . . . . . . . . 417
Controles comunes en aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Grupo de controles estándar (Standard) . . . . . . . . . . . . . . . . . . . . . . . . 419
Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Grupo de controles de validación (Validation) . . . . . . . . . . . . . . . . . . . 422
Grupo de controles de navegación (Navigation) . . . . . . . . . . . . . . . . . 422
Grupo de controles de acceso (Login) . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Grupo de controles HTML (HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Creación de una página Web ASP.NET, prueba e identificación
de sus elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
➤ Configuraciones iniciales del diseñador de páginas
Web para las vistas y el posicionamiento de controles . . 425
➤ Adición de elementos a un sitio Web . . . . . . . . . . . . . . . 427
➤ Establecimiento de valores generales de formulario . . . 427
➤ Revisión del código generado por el servidor . . . . . . . . 437
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 399

El tema de ASP.NET es suficientemente amplio para dedicarle un libro aparte. Dado que es
una de las formas más populares en que se consume código en Visual Basic, este capítulo
se ocupa del tema desde la perspectiva más amplia de la programación orientada a objetos.

Motivos del auge de las aplicaciones Web


Quizá el futuro inmediato de las aplicaciones distribuidas esté en el desarrollo de aplica-
ciones Web. Conforme la tecnología de desarrollo Web avanza (y lo hace a pasos agigan-
tados), las plataformas son cada vez más sencillas, confiables, seguras y escalables.
A continuación se explican algunas de las principales razones por las cuales la Web se ha
convertido en un campo fructífero para el desarrollo.
Uso de Internet como red privada corporativa. A medida que los negocios se
globalizan, la Internet cobra importancia como red privada corporativa. Dos son los deto-
nadores: por un lado, las organizaciones requieren comunicar datos con sus socios comer-
ciales; por otro, instalar redes privadas para hacerlo sería demasiado costoso, incluso
ocioso, ya que no hay razones para intentar la instalación de una red global nueva cuan-
do ya existe una.
Evolución en la confiabilidad de la Web. Ciertamente, cada nueva alternativa tiene
sus ventajas y desventajas. Tópicos como la seguridad en Internet, la disponibilidad de ser-
vicios de telecomunicaciones, la compatibilidad entre diversas plataformas operativas, la
complejidad de la técnica de desarrollo de aplicaciones Web, entre otros problemas, debe-
rán ser resueltos gradualmente.
Afortunadamente, las nuevas técnicas de cifrado, la existencia de protocolos universales
reconocidos por todas las plataformas y el desarrollo basado en lenguajes de alta portabi-
lidad, garantizan que los paquetes de datos que deben ser enviados de un lado a otro del
globo, lleguen completos y seguros, utilizando para ello programas cada vez más sencillos,
rápidos y estables. 13
Posibilidad de desarrollo profesional. La evolución de las operaciones de datos de
los negocios nos llevará poco a poco hacia un esquema de aplicaciones que utilicen los ser-
vicios de Internet para la comunicación de datos.
Esto abre un campo inmenso para los servicios de desarrollo de aplicaciones basadas en la
Web; en consecuencia, los desarrolladores deberán buscar las herramientas que les permi-
tan brindar soluciones estables, fáciles de generar y con posibilidades de crecimiento.
No será extraño saber que programadores, desarrolladores gráficos y administradores de
bases de datos formen pequeñas organizaciones dedicadas al desarrollo profesional de apli-
caciones para su uso en la Web, con una cartera respetable de clientes ansiosos.
400 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Lo más interesante de todo es que la comunidad de desarrolladores, a la vez que es provee-


dora de servicios, se convierte al mismo tiempo en promotora, generando un nicho econó-
mico en el que es mejor estar dentro.

Plataformas de desarrollo estandarizadas y disponibles. La nueva plataforma de


desarrollo, Microsoft.NET, maximiza el uso de Internet como medio de comunicación al
tiempo que resuelve los problemas inherentes al desarrollo en ambiente Web, facilitando
como nunca antes el proceso de desarrollo, y logrando un equilibrio entre simplicidad, con-
sistencia y potencia.

El respaldo de Microsoft hacia la tecnología .NET Framework asegura la máxima penetra-


ción de los productos en las organizaciones, lo cual permite generar un círculo virtuoso en-
tre productos y servicios relacionados (market share). Esto promueve que cada vez más
empresas y desarrolladores la adopten como su plataforma de desarrollo y operación, lo
que gradualmente garantizará el máximo conocimiento sobre la tecnología, servicios de
desarrollo y consultoría disponibles, así como precios justos de productos y servicios. Ese
fenómeno ya se vivió con Visual Basic. Ahora es el turno de .NET.

Antes de adentrarnos en la programación de ASP.NET, es conveniente analizar de manera


breve algunos conceptos de programación Web.

Requerimientos para el desarrollo de ASP.NET


Los requerimientos para desarrollar con ASP.NET varían un poco respecto a los demás ti-
pos de aplicaciones. Éstas son algunas de las particularidades del desarrollo en ASP.NET:

Entorno operativo

❑ Motor de ejecución Web. Es el que se encargará de recibir las peticiones de pági-


nas y resolverlas, entrando en contacto con los componentes involucrados por la pági-
na Web requerida, así como con los componentes de .NET Framework, tales como CLR
y BCL. En el caso de una plataforma Microsoft, el motor de ejecución Web se llama In-
ternet Information Server, conocido también como IIS.
Para verificar que IIS esté disponible en su equipo, trate de desplegar la siguiente página:
http://localhost

Con ello deberá aparecer la página de presentación de IIS. Se recomienda ampliamen-


te contar con la versión 5.5 o superior.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 401

IIS sólo está disponible en las versiones Server de Windows (2000, 2003 y posteriores),
así como las versiones Professional de los sistemas de escritorio de Windows (XP, 2000,
etcetéra). No siempre se instala de manera predeterminada, y por ese motivo es necesa-
rio verificar la disponibilidad de IIS. En caso de que no lo tenga instalado, proceda a
instalarlo; es indispensable.
¡No olvide que deberá tener instalado IIS y levantar los servicios Web antes de instalar
.NET Framework SDK! Si instala .NET Framework SDK y luego instala y habilita IIS,
las aplicaciones ASP.NET no funcionarán, dado que no hay manera que se registre la
articulación entre herramientas. Si ya instaló .NET Framework SDK y después instala
IIS, será necesario que establezca el registro de articulación con la siguiente instrucción
en línea de comandos:
aspnet_regiis.exe -i

❑ Privilegios de depuración. Para depurar páginas en ASP.NET es necesario que la


cuenta con la que esté desarrollando pertenezca al grupo de usuarios de depuración
(Debugger Users). Los trabajos de depuración sostienen un diálogo intenso con el sis-
tema operativo y es necesario que el desarrollador tenga los permisos necesarios para
interactuar con los servicios de monitoreo de problemas del equipo.
❑ .NET Framework. Es necesario que el equipo sea capaz de resolver el contenido Web
ASP.NET, y para ello es necesario que disponga de .NET Framework instalado, lo que
permitirá acceder a CLR y BCL. El código ASP.NET es compilado al momento de rea-
lizar peticiones a páginas ASP.NET, y los ensamblados que se generan en el proceso son
administrados y requieren de CLR para funcionar. Además, los controles Web del ser-
vidor son clases de BCL (que debe estar presente en el entorno operativo del equipo de
desarrollo).

Herramientas de desarrollo
13
❑ Visual Studio. Definitivamente la mejor opción para el desarrollo profesional de pá-
ginas ASP.NET es Visual Studio, que integra facilidades de diseño y depuración de
páginas Web. Aunque no es necesario para el desarrollo de páginas Web ASP.NET, sí
agiliza enormemente la labor de desarrollo.
❑ Visual Web Developer Express Edition. Es un entorno integrado de desarrollo de
aplicaciones Web, para uso semiprofesional. Similar a Visual Studio, incluye diseñado-
res y asistentes interesantes, pero es más limitado respecto de la producción de software
y el trabajo en equipo.
402 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Procesamiento de páginas Web en .NET


El hecho de que ASP sea “.NET”, pone de manifiesto que las páginas activas operan aho-
ra bajo las reglas de funcionamiento de la plataforma .NET. No se trata de mejoras sobre
Forma en que la misma forma de funcionar; esto implica cambios radicales que producen mejoras.
se resuelven
las páginas
ASP.NET En ASP clásico (ASP antes de .NET) las páginas se resolvían de modo interpretado; es de-
cir, cada vez que se solicitaba una página ASP al servidor, ésta debía ser analizada, inter-
pretada y transformada en código HTML equivalente, el cual finalmente era remitido al
cliente.
En ASP.NET la forma de ejecución es distinta, dado que trabaja bajo el modelo petición
- respuesta dinámico orientado a eventos, en donde hay contenidos que se resuelven en el
servidor. Además el código remitido al cliente está preparado para la captura de eventos y
la ejecución automática de procesos, sin necesidad de que el usuario haga peticiones explí-
citas.
Al hacer la petición, el servidor se percata de que la página requerida es ASP.NET (ASPX);
la página, que es tratada como un programa, primeramente es procesada por un analizador
de código (Parser), que verifica que el programa esté bien escrito y que no presente erro-
res de sintaxis o referencias perdidas (uso de variables, procedimientos, o miembros ine-
xistentes).
Si el programa no tiene errores de sintaxis o referencias perdidas, el programa es puesto a
disposición del compilador de páginas de .NET Framework; el compilador se encargará
de generar un ensamblado de extensión DLL, de nombre único, que define una clase ca-
paz de generar el código HTML que ha de ser devuelto al navegador del cliente.
Este ensamblado se almacena en un área denominada caché de ensamblados (Assembly
Cache), donde se almacenan todos los ensamblados generados por el compilador de pá-
ginas.
Ya que está generado el ensamblado capaz de producir el contenido Web que ha de ser de-
vuelto al cliente, un elemento denominado HTTP Runtime se encarga de solicitar la ejecu-
ción de la clase generada, para crear la instancia del objeto generador y producir el conte-
nido Web.
El contenido Web generado por la clase es almacenado en una área denominada caché de
salida (Output Cache); en ese espacio se almacenan los contenidos HTML, los guiones de
ejecución de parte del cliente e incluso los datos generados como parte de la salida. De ahí,
el contenido es enviado al cliente solicitante.
Si posteriormente se solicita la misma página, se buscará primeramente en el caché de sa-
lida; si el contenido Web se encuentra todavía ahí, no se realizará procesamiento alguno,
por lo cual la respuesta es extremadamente rápida.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 403

En el peor de los casos, si el contenido Web no se encuentra en el caché, se producirá la


ejecución de la clase creándose un nuevo contenido Web, lo cual de todas maneras es mu-
cho más rápido que utilizar código interpretado.

FIGURA 13.1
Procesamiento
de páginas Web
ASP.NET.

Características de ASP.NET
ASP.NET es la implementación en plataforma Microsoft para aplicaciones bajo el modelo
petición-respuesta dinámica orientada a eventos. En sí se trata de un modelo de servicios
necesarios para construir aplicaciones empresariales en plataforma Web.
Antes de ASP.NET contábamos con lo que ahora se ha dado en llamar ASP Clásico, que
operaba bajo el modelo petición-respuesta dinámico. Esta tecnología está perdiendo vigen- 13
cia rápidamente, ya que ASP.NET es más potente, sencillo y organizado; en términos ge-
nerales, hay ciertas características de ASP.NET que lo están convirtiendo rápidamente en el
estándar para el desarrollo Web.
Las características particulares más relevantes de ASP.NET son las siguientes:

❑ Aceptación de varios lenguajes


❑ Desempeño mejorado
❑ Código compilado
❑ Manejo automático de estado
❑ Código separado del diseño (Code Behind)
404 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ Uso de bibliotecas de clase de .NET Framework


❑ Controles Web del servidor
❑ Independencia del navegador
❑ Servicios Web XML
❑ Seguridad mejorada
❑ Mayor escalabilidad
❑ Permite sesiones cookie-less
❑ Fácil configuración
❑ Fácil implementación (Copy Deployment)
❑ Personalización basada en Web Parts
❑ Recursos de personalización: Master pages, Skins y Themes

Aceptación de varios lenguajes. ASP Clásico permitía desarrollar en un solo lengua-


je llamado código ASP, que era más bien un subconjunto de Visual Basic. Si usted tenía
experiencia en algún otro lenguaje, por ejemplo Java o C, de nada le servía. Era necesario
que aprendiera código ASP para poder instruir al servidor en cualquier tarea.
ASP.NET es la alternativa de desarrollo de aplicaciones Web para la plataforma .NET y por
ese motivo posee muchas de las características que hacen de .NET la plataforma de desa-
rrollo más fuerte del mercado; una de ellas es que acepta varios lenguajes de .NET, como
Visual Basic, C#, JScript .NET y J#, entre muchos otros.
No importa qué lenguaje .NET sea el que domine: podrá desarrollar procedimientos en
cualquier lenguaje .NET aceptado, e integrar la funcionalidad a sus páginas Web. Si es de-
sarrollador de aplicaciones de consola o aplicaciones Windows, no tendrá que cambiar de
lenguaje por el simple hecho de cambiar de ambiente.
Una ventaja adicional es que toda la programación Web puede hacerse bajo el enfoque
orientado a objetos; el desarrollador usa etiquetas para controlar propiedades y desde el có-
digo puede manejar eventos y ejecutar métodos.
Desempeño mejorado. En ASP Clásico, los bloques de código de parte del servidor
debían ser interpretados y ejecutados cada vez que se invocaba la página; la acción de in-
terpretar el código una y otra vez degradaba el desempeño de las aplicaciones.
En ASP.NET el código se compila hasta terminar siendo código ejecutable para el servi-
dor. Es interpretado una sola vez y a partir de ahí, cada vez que ejecutemos la página Web
invocaremos la versión interpretada y depurada de la página.
El hecho de que ya no tengamos que interpretar código de manera recurrente hace que las
aplicaciones tengan un mejor desempeño; si además consideramos que el código compila-
do es más rápido que el código interpretado, la ventaja en velocidad es significativa.
Código compilado. En ASP Clásico los bloques de código que el servidor resolvía ter-
minaban siendo código interpretado; es decir, cada vez que se tenía acceso a la página ASP,
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 405

IIS debía interpretar el código, buscar errores de sintaxis, generar el código HTML corres-
pondiente y resolver la página.

En el caso de ASP.NET, el código se compila en el servidor. La primera vez que acceda a


la página probablemente tarde un poco, pero a partir de ahí el ensamblado que generará el
código HTML a remitir al navegador ya estará disponible en un área de caché. En ese sen-
tido, después de la primera vez que se entra a una página, el servidor ya no resuelve nada,
sólo ejecuta el programa ya existente.

En virtud de que el servidor mantiene el caché, no importa qué usuario haya llamado por
primera vez la página; la versión compilada del código estará disponible para todos los que
la requieran posteriormente.

Otra ventaja es que .NET Framework se encarga de realizar las compilaciones y ejecucio-
nes cuando son necesarias de manera automática; el desarrollador sólo requiere intentar
cargar la página en un navegador. .NET Framework decidirá el tratamiento óptimo de la
solicitud realizada.

Al ejecutar una página ASP.NET se genera un ensamblado de extensión DLL que se aloja-
rá en el directorio \Bin del sitio, desde donde se consumirá su funcionalidad.

Manejo automático del estado. En ASP Clásico mantener el estado de los formula-
rios (Form-state) era un suplicio. Si se querían trasladar datos de una página a otra de ma-
nera confiable era necesario realizar una labor intensa que consistía en declarar objetos
ocultos (hidden objects), así como variables de sesión, que generalmente en un momento
dado de la ejecución perdían vigencia y arruinaban todo el proceso.

Otra alternativa era manejar los valores mediante cookies; el problema es que con tantos
ataques a la privacidad realizados en Internet, inhabilitar la admisión de cookies es una
práctica común. Ese hecho, obviamente, dejaba a la aplicación sin una función completa.

En ASP.NET, el estado de formulario se mantiene de manera automática a través de un ob-


jeto oculto y cifrado; las páginas ya no llaman a otras páginas para hacer un mismo proce- 13
so en partes. En lugar de ello, las páginas se mandan llamar a sí mismas y realizan el tras-
lado de datos de manera transparente para el usuario.

Código separado (Code Behind). En ASP Clásico, los programas eran una verdade-
ra ensalada de tecnologías que confundía a los inexpertos y dificultaba el mantenimiento
de los programas a los expertos.

En un mismo programa era común encontrar etiquetas HTML (lenguaje de marcas), llama-
das a componentes (objetos COM), bloques de código de parte del cliente codificados en
VBScript, bloques de código de parte del cliente codificados en JavaSctipt y bloques de
código de parte del servidor (código ASP).
406 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En ocasiones, los encargados del diseño de las páginas modificaban código ASP o código
de los guiones; a su vez, los programadores de procedimientos modificaban la codificación de
diseño, etcétera. En resumen, era un caos.
Con ASP.NET el código puede estar separado del diseño de la página (capacidad llamada
Code Behind). En su totalidad, se trata de código de parte del servidor, y las etiquetas
HTML se reducen al mínimo. Como producto obtenemos programas más limpios y estruc-
turados. Tranquilamente se puede encargar a un grupo de diseño que trabaje sobre la for-
ma de la página, mientras que los programadores podrán estar desarrollando procedimien-
tos de manera independiente.
Como en Visual Studio el código se maneja en modo Code Behind, por cada aplicación se
tendrá la página Web ASPX, que será la página en donde se encuentren las etiquetas ASP-
.NET; por otro lado, se tendrá un programa de extensión VB o CS (dependiendo el lengua-
je que decidamos utilizar), en donde se encontrará la programación de una clase que pro-
vee la funcionalidad de orientación a eventos de la página. Al ejecutarse la página, la clase
se compilará generando un ensamblado que después se puede consumir.
Uso de BCL. Con ASP Clásico era posible utilizar los componentes registrados en el ser-
vidor y, aunque se empleaba una buena cantidad de ellos, este uso era de alguna manera
ajena al código ASP y no estaba plenamente integrada.
En ASP.NET, en virtud de que codificamos con lenguajes .NET, podemos hacer uso de la
biblioteca de clases de .NET Framework, lo que permite agregar funcionalidad sin prece-
dentes a las aplicaciones Web. Como sabe, la biblioteca de clases de .NET Framework po-
see un gran número de clases disponibles para su uso en los programas; aunque probable-
mente no pueda utilizarlas todas en ambiente Web, la cantidad de elementos que puede
utilizar es bastante amplia.
Controles Web del Servidor. En ASP Clásico desarrollábamos con Front Page o con
Visual InterDev; aunque dichas herramientas poseían una caja de herramientas con “con-
troles”, realmente se trataba de vínculos a generadores de código que implementaban un
determinado objeto utilizando código HTML y DHTML.
En ASP.NET se tienen verdaderos controles Web de parte del servidor. Al agregar un ele-
mento gráfico en Visual Studio se agregan etiquetas que serán resueltas en el servidor y se
traducirán en objetos plenamente funcionales de parte del cliente, capaces de percibir even-
tos y realizar llamadas automáticas al servidor.
Otra ventaja de los controles Web del servidor es que son objetos de BCL que pueden ser
identificados y utilizados de forma programática.
Independencia del navegador. En ASP Clásico terminábamos de codificar las páginas
y las probábamos; cuando comprobábamos que todo funcionaba bien hacíamos la publica-
ción. El problema surgía cuando el usuario revisaba nuestras aplicaciones en un navegador
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 407

distinto al que nosotros utilizamos (por ejemplo, Netscape Navigator). La aplicación per-
día la estética y algunos elementos ya no funcionaban. El problema era que la funcionali-
dad de nuestras aplicaciones dependía del navegador; en un mundo de aplicaciones globa-
les no podemos obligar a nuestros clientes a que tengan tal o cual navegador.
Eso hacia necesario indagar qué navegador utilizaba el cliente, a fin de proporcionarle un
resultado funcional acorde al mismo. Prácticamente se desarrollaban dos programas para
dos diferentes navegadores.
En ASP.NET, los controles Web del servidor son capaces de determinar por sí mismos qué
navegador utiliza el cliente para que el servidor genere el código correspondiente. En otras
palabras, las aplicaciones serán independientes de la plataforma que las lea.
Servicios Web XML. En ASP Clásico no existían los servicios. Para poder distribuir
funcionalidad era necesario desarrollar componentes, registrarlos en el servidor y esperar
que no se dieran problemas técnicos y de permisos para poder utilizarlos en aplicaciones
Web desde estaciones remotas.
Los componentes son paquetes binarios ejecutables, por lo cual no son afines a los fire-
walls y los servidores proxy; otro problema adicional: sólo funcionan para la misma plata-
forma operativa, es decir, Windows.
En ASP.NET se puede hacer uso de Servicios Web XML, componentes funcionales que
pueden ser utilizados mediante peticiones Web y facilitan el intercambio de funcionalidad
utilizando Internet como medio.
Los Servicios Web XML utilizan protocolos estándar como SOAP (Simple Object Access
Protocol) y XML (eXtensible Markup Language) para trabajar, por lo que permiten la in-
teracción con plataformas operativas distintas a Windows.
Seguridad mejorada. De manera predeterminada, el ambiente Web proporciona acce-
so anónimo a los sitios; no obstante ello, es posible que se desee restringir el acceso de al-
guna manera.
En ASP Clásico sólo se tenía un tipo de seguridad: Autenticación Windows. Bajo este es-
13
quema, el IIS podía ejecutar una validación de seguridad, dando acceso de acuerdo con el
sistema de usuarios y roles de usuarios de Windows.
En ASP.NET, además de la autenticación Windows, se emplea la autenticación de formu-
larios, a través de la cual usted puede restringir el acceso por medio de programación.
ASP.NET también proporciona seguridad mediante los servicios de Microsoft Passport,
que es un servicio centralizado de autenticación brindado por Microsoft.
Además, ASP.NET cuenta con un nuevo mecanismo, denominado membresía ASP.NET
(ASP.NET membership), que es una funcionalidad interconstruida de ASP.NET que permi-
408 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

te crear y administrar un esquema de control de usuarios y puede ser utilizada a través de


controles de Login disponibles en Toolbox. Si se implementa el esquema basado en mem-
bresía ASP.NET, llevar a cabo las labores de registro de usuarios y cambios de contraseña,
entre otras, será tan sencillo como arrastrar y colocar.
Mayor escalabilidad. En ASP Clásico los estados de las sesiones eran mantenidos en el
mismo servidor en donde se encontraba el motor de ejecución Web (IIS); esto provocaba
que para poder utilizar información relativa a las sesiones era necesario invocarla en el mis-
mo servidor. En caso de que se presentara un incremento en el tráfico de transacciones, la
única opción para manejarlas era incrementar la capacidad del servidor.
Una de las consecuencias de esta situación era la potencial sobrecarga del servidor, debi-
do a que el procesamiento y el estado de sesiones no se podían distribuir.
En ASP.NET el estado de las sesiones puede ser mantenido en un proceso separado, en una
máquina o base de datos aparte, lo que permite la existencia de una sesión con servidores
combinados (cross-server session).
La ventaja de esto es que se pueden conectar servidores adicionales para absorber los in-
crementos de tráfico de transacciones.
Sesiones cookie-less. Algunas ocasiones, en ASP Clásico se desarrollaban aplicacio-
nes que hacían uso de cookies; el problema sobrevenía cuando el usuario inhabilitaba la ca-
pacidad de su navegador de admitirlas, en cuyo caso las aplicaciones dejaban de funcionar
normalmente.
Con ASP.NET es posible mantener el estado de las sesiones incluso si la capacidad del na-
vegador para manejar Cookies está inhabilitada. A este funcionamiento se le ha dado el
nombre de cookie-less.
ASP.NET maneja de manera cifrada la información que se manejaría a través de Cookies
(SessionID), trasladando los valores por medio del URL (Uniform Resource Locator).
Fácil configuración. Con ASP Clásico la configuración de las aplicaciones era un poco
oscura; era necesario conocer bien el ambiente de la aplicación y Visual InterDev.
Con ASP.NET la configuración se mantiene en un archivo textual XML, llamado Web.config,
que es entendible si se lo quiere leer.
Fácil implementación (Copy Deployment). Con ASP Clásico copiar una aplicación
Web a otro servidor requería precisión. Las razones eran simples: los archivos del sitio se
encontraban en la carpeta del sitio, las librerías se encontraban en la carpeta \SYSTEM del
sistema operativo, y se encontraban registradas en el Registro de Windows del equipo ori-
gen. Para migrar una aplicación había que estar seguro de copiar la carpeta de la aplicación
y además verificar que todas las librerías de un equipo estuvieran debidamente copiadas y
registradas en el equipo destino. Lo peor de todo, si la aplicación requería una librería que
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 409

no estaba registrada en el servidor destino, era necesario dar de baja el servidor Web para
poder integrar la nueva librería; este escenario es el peor de todos para las aplicaciones que
requieren la máxima disponibilidad.

Con ASP.NET todos los archivos que una aplicación necesita se encuentran en la carpeta
del sitio. Para copiar un sitio a otro servidor basta con copiar la carpeta del sitio en su to-
talidad. A este tipo de implementación se le ha dado el nombre de Copy Deployment.

Recursos de personalización: Master pages, Skins y Themes. En ASP.NET se


pueden utilizar recursos adicionales para la personalización y estandarización de los sitios
desarrollados.

Las páginas maestras (master pages) son páginas generales que definen la apariencia, el
comportamiento y el enfoque del sitio en general. Las variaciones se manejan a través de
páginas de contenido (content pages). Para definir este tipo de páginas es necesario crear
una página de extensión .master que contendrá una apariencia predefinida (layout) com-
puesta en HTML y controles Web del servidor; esta página contendrá, en lugar de directi-
vas @ Page, una directiva @ Master. Una página maestra puede tener dos o más controles
delimitadores de contenido (ContentPlaceHolder), que no son otra cosa que regiones en
la página Web en donde se pueden integrar elementos de contenido. Las páginas de conte-
nido dispondrán de la directiva @ Page, en donde el argumento MasterPageFile permite
el enlace con la página maestra; en la página de contenido se agregan controles de conte-
nido que permiten especificar el ContentPlaceHolder en donde el contenido ha de inte-
grarse. En tiempo de ejecución, las páginas maestra y de contenido se enlazan para produ-
cir un resultado coherente y estandarizado.

Las páginas de apariencia (skins) son archivos con extensión .skin que definen las pro-
piedades de apariencia para las páginas ASP.NET; junto con las páginas de cascadas de es-
tilos (.CSS) determinan el look de las páginas Web. Se definen escribiendo una página con
los controles Web del servidor a los que se les desea establecer propiedades de apariencia
predeterminadas junto con las propiedades que se desea establecer como predeterminadas.
No se especifica la propiedad Id, dado que no se utilizarán más que como referencia para 13
indicar a ASP.NET que aplique determinados valores en sus propiedades de apariencia a
un determinado tipo de controles.

Los temas (themes) son conjuntos de recursos adicionales, como imágenes, código de par-
te del cliente (scripting) y sonido, que se pueden integrar a un sitio Web para darle mayor
calidad.

Personalización de la interfaz: Web Parts. En ASP.NET es posible dividir el conte-


nido de una página en partes autónomas, denominadas Web Parts, que el usuario puede
personalizar. Con base en las Web parts es posible reubicar contenido en la página, ocul-
tar o mostrar partes, e incluso modificarlas dinámicamente respecto de su contenido.
410 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Elementos de una página Web ASP.NET


En muchos sentidos, una página Web desarrollada en ASP.NET es una página común que,
al ser invocada en el servidor, será interpretada y ejecutada por el motor de ejecución Web
(IIS) y por .NET Framework.
Las páginas Web desarrolladas en ASP.NET tienen la extensión ASPX, y son archivos de
código textual que no requieren de ninguna herramienta especial para ser desarrollados;
basta con un editor de texto simple para desarrollarlas. En el presente texto el término pá-
ginas Web se refiere a a páginas Web ASP.NET con extensión ASPX.
Al invocar una página ASP.NET, el servidor resuelve los elementos que componen la pá-
gina en sus equivalentes funcionales codificados en HTML, VBScript y JScript. Ya que la
página ha sido resuelta se envía al cliente que la solicitó.

Estructura básica de una página ASP.NET


Inicialmente, es exactamente igual que una página Web HTML:

<html>
<head>
</head>
<body>
</body>
</html>

A medida que introducimos elementos en el área de encabezado y el cuerpo de la página


(que serán resueltos en el servidor), la página comienza a ponerse interesante.
En una página ASPX podemos incluir lo siguiente:

❑ Contenido HTML
❑ Bloques proveedores de código
❑ Directivas
❑ Formulario del servidor
❑ Controles del servidor
❍ Controles Web (Web Controls)
❍ Controles HTML (HTML Controls)
❍ Controles de validación (Input Validation Controls)
❍ Rich Controls
❑ Código declarativo
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 411

Contenido HTML
Las páginas ASP.NET tienen las capacidades anteriores de ASP Clásico; en ese sentido, si-
guen aceptando contenido HTML . Tan es así que la página básica contiene las etiquetas
de estructura básicas HTML.
Una diferencia importante es que las páginas ASP.NET son rigurosas en el manejo de eti-
quetas, pues cuidan que cada una de ellas se abra y cierre debidamente, además de que su
sintaxis sea correcta en estricto sentido. Anteriormente, las páginas equivocadas simple-
mente no funcionaban como debían; en ASP.NET, no sólo no funcionarán, sino que mar-
carán error.
Por contenido HTML nos referimos a etiquetas HTML, manejo de estilos, bloques de có-
digo de parte del cliente, declaración de objetos COM, etcétera. Esto implica que sus pá-
ginas funcionarán como funcionaban antes. En caso de que utilicen componentes COM,
éstos no necesariamente tendrán que ser codificados y compilados en su forma equivalen-
te para .NET. En ese sentido, la inversión realizada en componentes y codificación se man-
tiene.

Bloques proveedores de código


Los bloques proveedores de código son los que el motor de ejecución Web (IIS) convierte
a su equivalente en HTML. Son el equivalente a los bloques de código que se utilizaban en
ASP Clásico, delimitados entre <% y %>.
Un ejemplo de este tipo de contenido sería el siguiente:

<%
Dim Hora As Integer
Hora = hour(Now)
if Hora > 12 and Hora < 20 then

else
Response.Write(“Buenas tardes”)
13
if Hora > 20 then
Response.Write(“Buenas noches”)
else
Response.Write(“Buenos días”)
end if
end if
%>

En este ejemplo, el servidor dará un saludo (“Buenos días”, “Buenas tardes”, “Buenas no-
ches”), considerando la fecha y hora del servidor (no la fecha y hora de parte del cliente).
Todo este código deriva en el saludo apropiado según la hora del servidor.
412 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA
Tanto el contenido HTML como los bloques proveedores de código se mantienen por compa-
tibilidad con los desarrollos pasados. En ASP.NET es deseable utilizarlos lo menos posible, a fin
de darle mayor simplicidad y funcionalidad a los desarrollos.

Directivas
Las directivas son especificaciones de valores que utiliza la página y los compiladores de
controles de usuario al procesar páginas Web en ASP.NET.
Para declararlas se utiliza la siguiente sintaxis, que se coloca al inicio de la página Web:

<%@ NombreDirectiva [ Atributos ] %>

Donde NombreDirectiva es el nombre de la directiva que se desea incluir y Atributos son


los atributos y sus valores, expresados en pares igualados (propiedad = valor); los atribu-
tos se separan entre sí por espacios en blanco.
Las directivas más importantes son las siguientes:

❑ @Page. Define atributos específicos de página utilizados por el analizador sintáctico y


el compilador de páginas ASP.NET. Puede incluirse sólo en archivos .ASPX (formula-
rios Web de ASP.NET).
❑ @Control. Define atributos específicos de control utilizados por el analizador sintác-
tico y el compilador de páginas ASP.NET. Sólo puede incluirse en archivos .ASCX (con-
troles de usuario de ASP.NET).
❑ @Assembly. Vincula un ensamblado de forma declarativa con la página o el control
de usuario actual.
❑ @Implements. Indica de forma declarativa que una página o un control de usuario
implementa una interfaz .NET Framework especificada.
❑ @Import. Importa explícitamente un espacio de nombres en una página o un control
de usuario.
❑ @OutputCache. Controla de forma declarativa la normativa de caché de resultados
de una página o control de usuario.
❑ @Reference. Vincula de forma declarativa una página o un control de usuario a la pá-
gina o control de usuario actual.
❑ @Register. Asocia alias a nombres de espacios de nombres y clases, que permiten la
representación de controles de usuario y controles de servidor personalizados cuando se
incluyen en una página o un control de usuario solicitados.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 413

Una de las directivas de más útilidad es la directiva @Page. Algunos atributos importantes
de esta directiva son los siguientes.

❑ AutoEventWireUp. (Boolean). Indica si los eventos de la página están interconec-


tados de manera automática (True indica que la conexión está habilitada). Los eventos
producidos por los controles Web trabajan de manera diferente a los eventos en los for-
mularios de cliente tradicionales o en aplicaciones Web basadas en cliente. La diferen-
cia se basa principalmente en la separación existente entre el propio evento y el lugar
donde éste se controla. En las aplicaciones basadas en cliente (Windows o ASP Clási-
co), los eventos se producen y controlan en el cliente; en las páginas ASP.NET, los even-
tos se producen en el cliente, pero son controlados en el servidor.
❑ Buffer. (Boolean). Determina si el búfer de respuestas HTTP está habilitado.
❑ CodeBehind. (String). Especifica el nombre del archivo que contiene el código aso-
ciado a la página. Este código será un programa que contendrá una clase que le dará
comportamiento a la página Web; de esta forma puede separarse el código de la inter-
faz. El diseñador de formularios de Visual Studio .NET usa este atributo al desarrollar
una página Web utilizando dicha herramienta.
❑ CompilerOptions. (String). Cadena que contiene opciones del compilador para
compilar la página; se trata de la secuencia de modificadores que utilizaríamos al com-
pilar desde línea de comandos.
❑ Debug. (Boolean). Indica si la página se debe compilar con símbolos de depuración
o no. En ocasiones sólo se obtiene información relevante a los errores aplicando este
atributo. Por omisión tiene el valor False.
❑ EnableViewState. (Boolean). Indica si se mantiene el estado entre solicitudes de
página de manera automática. Si el valor es True, el estado entre las páginas se mane-
jará a través del objeto oculto _VIEWSTATE.
❑ ErrorPage. (String). Define una dirección URL de destino para la redirección cuan-
do se produce una excepción de página no controlada.
❑ Inherits. (String). Define la clase de código en segundo plano que hereda la página. 13
Ésta puede ser cualquier clase derivada de la clase Page.
❑ Language. (String). Especifica el lenguaje utilizado cuando se compilan todos los
bloques de procesamiento en línea (<% %> y <%= %>) y de declaraciones de código
dentro de la página. Los valores pueden representar cualquier lenguaje compatible con
.NET, incluidos Visual Basic (vb), C# (C#) o JScript .NET.

Otra de las directivas útiles es la directiva @Import, que permite importar espacios de nom-
bres para nuestras páginas.
Veamos ejemplos del uso de @Page y @Import.
414 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Para determinar a Visual Basic como el lenguaje para la codificación de código declarativo:

<%@ Page Language=”vb” %>

Para, además, especificar la depuración avanzada:

<%@ Page Language=”vb” Debug=”True” %>

Para determinar el programa MiCodigo.vb como repositorio de nuestro código:

<%@ Page Language=”vb” CodeBehind=”MiCodigo.vb” %>

Para importar el espacio de nombres que se requiere para trabajar con datos:

<%@ Import Namespace=”System.Data” %>

Formulario del servidor


En ASP Clásico incluíamos los objetos para introducción de datos en una etiqueta Form.
Los objetos estaban codificados mediante etiquetas HTML que eran resueltas por el clien-
te; al remitir la información (submit), ésta se trasladaba a la página que la utilizaría.
En ASP.NET la cosa cambia. Ahora los objetos para introducción de datos no los codifica
el desarrollador nosotros; realmente los genera IIS con la ayuda de .NET Framework, al
resolver controles de ASP.NET. Como los objetos son generados de parte del servidor y no
del cliente, el formulario de parte del cliente no es relevante; es necesario contar con un
formulario que maneje los objetos de parte del servidor.
Para que los controles de ASP.NET que introduzcamos en una página puedan utilizarse, es
necesario que se encuentren en lo que se conoce como formulario del servidor, que con-
siste en un bloque Form con la especificación runat=server, como todo en ASP.NET.
El bloque, en su forma primitiva, luce de la siguiente forma:

<Form id=”Forma” runat=”server”>


<!— Controles web del servidor aquí —>
</Form>

Ya que contamos con un formulario del servidor, podemos colocar diversos objetos dentro
de él.
Un formulario del servidor permitirá especificar controles Web del servidor, de tal manera
que puedan ser procesados por .NET Framework en el servidor.
A una página de extensión ASPX que contiene un formulario del servidor dentro del cual se
definen diversos controles del servidor, se le conoce como Web Form.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 415

Controles del servidor

Los controles del servidor son instrumentaciones de funcionalidad basada en etiquetas, a


través de las cuales se le ordena al motor Web y a .NET Framework que construyan con-
tenido HTML dinámico, sensible a eventos y aplicable a un navegador dado.
Los controles del servidor se invocan en las páginas Web a través de etiquetas y pueden ser
de los siguientes tipos básicos:

❑ Controles Web del Servidor (Web Controls). Llamados también intrínsecos; son
los que poseen la máxima funcionalidad brindada por ASP.NET para la construcción de
código HTML dinámico, sensible a eventos.
❑ Controles HTML del Servidor (HTML Controls). Constituyen aquellos cuyo úni-
co propósito es generar una equivalencia estándar de código HTML, en el servidor.
❑ Controles de validación (Input Validation Controls). Son una forma de control
Web complementario, que tiene como objeto validar la entrada de datos en otro control
que consume sus servicios.
❑ Rich Controls. Representan una forma de control Web de alta funcionalidad y com-
plejidad, que pueden incluso estar conformados por varias etiquetas. Este es el caso del
control Calendar.

Los controles Web tienen comportamiento interconstruido (built-in), lo que significa que
poseen sus propios métodos, propiedades y eventos, mismos que se pueden utilizar en pro-
gramación orientada a objetos en la codificación de las páginas. Las propiedades, métodos
y eventos de todos los controles son estándar, por lo que aprender a manejar un control
equivale conocer el manejo de casi todos.
A continuación se verá cómo se integra cada uno de estos controles.
Integrando un control Web (Web Control). La sintaxis que deberá reunir la etique-
ta que llame a un control Web del servidor es la siguiente: 13
<asp:NombreControl
id=”NombreObjeto”
[propiedades]
runat=”server” />

En tal declaración encontramos los siguientes elementos:

❑ Selección del control. Se deberá abrir la etiqueta normal. En el caso de los contro-
les Web y los controles de validación, deberá agregarse la especificación asp:; de esta
416 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

forma, el analizador de la página asociará la etiqueta con el espacio de nombre System.


Web.UI.WebControls. Posteriormente se agrega el nombre del control del servidor que
se desea utilizar. En el ejemplo, NombreControl es el nombre del control del servidor
que se desea invocar. Es necesario especificar qué control del servidor es el que quere-
mos que el servidor resuelva.
❑ Identidad del objeto. Se deberá identificar a cada uno de los controles, a fin de que
sean utilizables de manera programática; esto se logra a través de la propiedad Id, a la
cual se le asigna un nombre válido de objeto (NombreObjeto). No se admiten espacios
en blanco y caracteres especiales; por regla general, inicie los nombres con una letra o
un guión bajo.
❑ Propiedades. Se podrán asignar a un control del servidor diversas propiedades (pro-
piedades), colocando el nombre de la propiedad y su valor, en pares igualados (propie-
dad = valor); las propiedades se separarán entre sí por espacios en blanco.
❑ Referencia de ejecución en el servidor. Es muy importante que al final se inclu-
ya la referencia runat=server, ya que de otra manera el servidor no se dará por
enterado de la existencia de la etiqueta, tratará de resolverla de parte del cliente, sin nin-
gún efecto.
❑ Cerrado de la etiqueta. Se puede cerrar la etiqueta de un control del servidor apli-
cando el cerrado estilo XML (/>), en el caso de los controles Web y de los controles de
validación, y utilizando cerrado tipo HTML (>) en el caso de los controles HTML,
siempre y cuando la etiqueta no vaya seguida por contenido. Para aquellas etiquetas que
afectan un contenido determinado, es decir, que tienen una etiqueta de inicio y una eti-
queta de conclusión, y donde todo lo que está entre ambas se ve afectado por ellas, se
deberá aplicar el cerrado estilo HTML (</etiqueta>).

Sólo siguiendo la sintaxis correcta las etiquetas serán reconocidas como controles.
El siguiente ejemplo muestra cómo sería utilizar un control Web para la creación de un
cuadro de texto:

asp:TextBox id=”Entrada” runat=”server” />

Integración de un control HTML (HTML Control). Integrar un control HTML del


servidor es muy similar a integrar una etiqueta HTML; la única variación es que debe agre-
garse la especificación runat=server dentro de la etiqueta.
Se agrega dicha especificación para garantizar que el servidor IIS, en conjunto con .NET
Framework, se encargue de producir el equivalente HTML funcional para todos los nave-
gadores. Si desarrolla ASP.NET y prueba usando Internet Explorer no notará beneficio, pe-
ro si desea que sus aplicaciones sean globales y funcionales en muchos navegadores, el uso
de controles HTML es casi obligado.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 417

El siguiente ejemplo muestra cómo sería utilizar un control HTML para la creación de un
vínculo (Link/Anchor):
<a
id=”MiLiga”
href=”http://www.aprendapracticando.com”
runat=”server”>
Ir al sitio Aprenda Practicando
</a>

Esta liga generaría un vínculo específico hacia la página determinada para el navegador
que hizo la petición.
Integrando un control de validación (Input Validation Control). Un control de
validación es un tipo especializado de control Web; la diferencia con un control Web es que
los de validación siempre se subordinan a un control Web definido previamente. Un con-
trol de validación generalmente cuenta con una propiedad llamada ControlToValidate,
que contiene el nombre del control que es validado a través del control de validación.
Este tipo de control provoca la generación de etiquetas HTML y scripts en JScript y
VBScript, que se encargarán de garantizar, de parte del cliente, que la entrada de datos sea
válida.
El siguiente ejemplo muestra cómo se generaría un control de validación, que no permitie-
ra omitir el valor del objeto al que llamamos Entrada:

<asp:TextBox ID=”txtEntrada” Runat=”server” />


<asp:RequiredFieldValidator
ID=”ValidadorTexto”
ControlToValidate=”txtEntrada”
ErrorMessage=”No se puede omitir el dato”
Display=”dynamic”
Runat=”server”/>
13

Adición de código a una página: Código declarativo


Una de las ventajas de ASP.NET es que separa el código de las etiquetas de la página Web,
de tal forma que procesamiento y diseño estético se complementan pero no se revuelven.
Esto permite una forma más estructurada de programación.
Lo ideal es que el código se encuentre en un archivo independiente, y que sólo sea referi-
do a través de directivas. A esta capacidad se le llama código separado (code behind, aun-
que la traducción literal no sea exacta).
418 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las páginas no siempre funcionan con código separado. En este caso, los bloques de códi-
go están inmersos en la misma página Web.
En ASP.NET el ideal es que los procedimientos estén claramente diferenciados, a fin de
que el código no pase de porciones ejecutadas por el cliente a porciones ejecutadas por el
servidor. Se le llama código declarativo al código que se declara en una página ASP.NET
definiendo scripts que se ejecutan de parte del servidor.
Los scripts se definen en el área de encabezado de la página, utilizando para ello la etique-
ta script, que será interpretada y ejecutada de parte del servidor; dentro del script podrán
definirse procedimientos en el lenguaje que se haya seleccionado (VB.NET o C#, por
ejemplo). La sintaxis para definir código declarativo es la siguiente:

<Script runat=”server”>
</Script>

La forma de los procedimientos de código declarativo dependerá de los controles Web que
se estén utilizando. Generalmente, la estructura de los procedimientos será muy similar a
la que tienen los procedimientos de eventos en Visual Basic (Sub – End Sub); los argu-
mentos implícitos corresponden generalmente al objeto que produce el evento (sender As
Object), así como a un manejador de eventos (e As EventArgs). Obviamente, dependien-
do del objeto y el evento que se provoca el manejador de eventos puede cambiar.
Éste sería un ejemplo típico de un procedimiento de código declarativo, que ocurre al ha-
cer clic (evento Click) en un botón:

Sub Aceptar_Click(sender As Object, e As EventArgs)


‘ Código a ejecutar
End Sub

En la mayoría de los casos es necesario especificar qué procedimiento es el que se utili-


zará para manejar un determinado evento; esto se realiza generalmente utilizando las pro-
piedades On...; en el caso de nuestro ejemplo, como se está capturando el evento Click,
se utilizaría una propiedad llamada OnClick en la definición del objeto que provoca el
evento.

<asp:Button
ID=”Aceptar”

OnClick=”Aceptar_Click”
Text=”Haz clic”
Runat=”server” />
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 419

Controles comunes en aplicaciones Web


Al igual que las aplicaciones Windows, Visual Studio provee de muchos controles para el
diseño de páginas Web. En Toolbox los grupos más importantes de desarrollo Web son los
siguientes:

Grupo de controles estándar (Standard)


Expone los controles generales de interfaz de usuario de una aplicación Web.
Control Nombre Uso

Label Representa una etiqueta para el


mostrado de datos.

TextBox Representa un cuadro de texto para


introducción de datos.

Button Representa un botón de comando que


ejecuta un procedimiento.

LinkButton Representa un botón con estilo


de vínculo.

ImageButton Representa una imagen que ejecuta un


procedimiento al hacer clic en ella.

HyperLink Representa un vínculo hacia un recurso


Web.

DropDownList Representa un cuadro combinado para


la selección de opciones.

ListBox Representa una lista de opciones de


selección. 13
CheckBox Representa una casilla de verificación.

CheckBoxList Representa una lista de opciones en


donde cada una de ellas es una casilla
de verificación.

RadioButton Representa un botón de opción.

RadioButtonList Representa una lista de botones de opción.

Image Representa una imagen.


420 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ImageMap Representa una imagen con regiones


sensibles.
Table Representa una tabla de contenido
(filas/columnas).
BulletedList Representa una lista de viñetas.
HiddenField Representa un campo oculto.
Literal Representa un espacio estático para
texto en una página.
Calendar Representa un calendario de selección
dinámica de fecha.
AdRotator Representa un control para el desplegado
aleatorio de contenido (publicidad en
banners).
FileUpload Representa un cuadro de texto y un
botón que permiten cargar un archivo al
servidor.
Wizard Representa controles de navegación
entre varias páginas.
Xml Representa un documento XML.
MultiView Representa un contenedor de objetos
View.
Panel Representa un contenedor de controles
Web.
PlaceHolder Representa un almacén de controles que
pueden ser integrados de forma
dinámica a una interfaz.
View Representa un contenedor de controles
Web que forman parte de un contenedor
MultiView.
Substitution Representa una sección de la página
cuyo contenido puede ser reemplazado
dinámicamente.
Localize Representa un espacio reservado para
desplegar texto estático.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 421

Grupo de controles de datos (Data)


Expone los controles a través de los cuales se puede interactuar con bases de datos. A tra-
vés de estos controles se puede disponer del modelo de objeto ADO.NET desde la Web.

Control Nombre Uso

GridView Representa una rejilla de datos,


donde mediante un patrón
bidimensional línea-columna,
se representa el contenido de
un origen de datos.
DataList Representa un control enlazado de
datos (data bound control) que
despliega los elementos con base
en una plantilla.
DetailsView Representa los valores de un solo
registro, tomado de un origen de
datos.
FormView Representa los valores de un solo
registro, tomado de un origen de
datos, atendiendo a una plantilla
definida por el usuario. Este objeto
permite la adición, borrado o
edición de registros.
Repeater Representa un control enlazado de
datos que permite dar un formato
basado en plantillas a cada elemen-
to del conjunto de registros propor-
cionados por el origen.
SqlDataSource Representa una conexión de enlace
para bases en SQL Server.
13
AccessDataSource Representa una conexión de enlace
para bases en Access.
ObjectDataSource Representa un objeto de negocios
que provee los datos a los controles
enlazados, en una aplicación
multicapa.
XmlDataSource Representa un origen de datos
XML para controles enlazados.
SiteMapDataSource Representa un origen de datos útil
para el enlazado con los datos de la
estructura jerárquica de un mapa
de sitio.
422 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Grupo de controles de validación (Validation)


Expone los controles que ayudan a garantizar que los datos introducidos en la interfaz de
usuario sean correctos y estén completos.
Control Nombre Uso

RequiredFieldValidator Representa un validador para


la no omisión de un dato.
RangeValidator Representa un validador
que comprueba que un valor
se encuentre dentro de un
intervalo.
Regular Representa un validador que
ExpressionValidator comprueba que un valor
obedezca a una máscara de
expresión regular.
CompareValidator Representa un validador que
verifica un valor comparati-
vamente con otro valor o con
un tipo de dato.
CustomValidator Representa un validador
persona lizado que actúa
tanto de parte del cliente
como del servidor.
ValidationSummary Representa un resumen de los
resultados de las validaciones
de una interfaz.

Grupo de controles de navegación (Navigation)


Expone los controles que permiten la navegación entre datos y páginas Web, necesarios pa-
ra dar forma a un mapa de sitio.
Control Nombre Uso

SiteMapPath Representa un conjunto de hipervínculos


e imágenes que permiten la navegación
entre las páginas del sito, con el mínimo
consumo de espacio de trabajo en la
pantalla.
Menu Representa un menú en una página Web.

TreeView Representa un árbol jerárquico de datos.


Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 423

Grupo de controles de acceso (Login)


Permiten la implementación visual de los elementos de autenticación y autorización inclui-
dos en ASP.NET Membership.

Control Nombre Uso

Login Representa una interfaz precons-


truida que permite la autenticación
de usuarios.
LoginView Representa la visualización de la
información de usuarios registrados
y usuarios anónimos.
PasswordRecovery Representa la interfaz para recupe-
ración de contraseña, utilizando el
correo electrónico proporcionado al
momento del registro del usuario.
LoginStatus Representa un control informativo
que indica el estado de un usuario
registrado, proporcionando medios
para el ingreso (LogIn) y la salida
(LogOut).
LoginName Representa un control informativo
que muestra el nombre del usuario
actual.
CreateUserWizard Representa la recolección de
información de usuarios nuevos.
ChangePassword Representa la interfaz a través de
la cual los usuarios registrados
pueden cambiar su contraseña.
13
Grupo de controles HTML (HTML)
Contiene los controles HTML del servidor.

Control Nombre Uso

Login Representa una interfaz preconstruida


que permite la autenticación de usuarios.

Input (Button) Representa un botón de comando.


424 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Input (Reset) Representa un botón de comando de


tipo Reset.

Input (Submit) Representa un botón de comando de


tipo submit, que provoca una petición
al servidor.

Input (Text) Representa un cuadro de texto.

Input (File) Representa un cuadro de texto para


selección de un archivo.

Input Representa un cuadro de texto


(Password) con entrada oculta.

Input Representa una casilla de verificación.


(Checkbox)

Input (Radio) Representa un botón de opción.

Input (Hidden) Representa un control oculto.

Textarea Representa un cuadro de texto multilínea.

Table Representa una tabla.

Image Representa una imagen.

Select Representa un cuadro combinado.

Horizontal Rule Representa una línea horizontal.

Div Representa un espacio de contenido que


es reservado en el espacio de trabajo.

Ejercicio 13.1
Creación de una página Web ASP.NET, prueba e identificación
de sus elementos

Desarrollará una aplicación Web que solicita datos generales de los usuarios de un servicio
en Internet. Se pregunta el nombre de una persona, su correo electrónico y su edad. La edad
deberá estar entre 0 y 100 años. También preguntará la fecha en que utilizó el sistema por
primera vez. Los datos no pueden omitirse, el correo electrónico debe tener un formato de
correo electrónico, y debido a que el negocio habría iniciado el 1 de enero de 2002, y ade-
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 425

más estuvo sin operar todo el 2004, las fechas en que se utilizó el sistema por primera vez
debe estar dentro de rangos válidos. En caso de errores, se debe mostrar un resumen de
errores encontrados en la página que deberá aparecer en un cuadro de diálogo.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).

➤ Configuraciones iniciales del diseñador de páginas Web


para las vistas y el posicionamiento de controles

2. El diseñador de páginas Web (HTML Designer, también llamado Web Forms Desig-
ner) tiene dos vistas de trabajo: vista de código fuente (source view) y vista de diseño
(design view). En vista source se puede desarrollar una página manipulando directa-
mente las etiquetas de controles de ASP.NET; la vista design, por su parte, permite tra-
bajar en un ambiente visual con las páginas. Generalmente es más sencillo trabajar en
vista design, pero será frecuente que tengamos que alternar entre una y otra.
3. La forma de alternar entre una y otra es a través de la barra de trabajo que aparece en
la parte inferior de HTML Designer, en la cual aparecen botones de selección de vis-
tas y las etiquetas en las que nos encontremos trabajando.

4. Podemos predeterminar la vista en que queremos que inicie HTML Designer cada vez
que abrimos una página Web. Seleccione la opción de menú Tools – Options, el nodo
HTML Designer, y en Start pages in, seleccione el botón de opción Design view. Con
ello, cada nueva página que abramos mostrará inicialmente la vista de diseño.

13
426 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5. En vista de diseño, se entiende por posicionamiento de controles a la forma en que los


controles adquieren una posición física en la interfaz para mostrarse en tiempo de eje-
cución. Los controles pueden posicionarse de diferentes maneras: posición absoluta,
si la posición en la interfaz no cambia dependiendo del contenido, dado que se esta-
blecen las propiedades HTML z-index, left y top respecto del elemento contenedor;
posición relativa, es similar a la posición absoluta, sólo que las propiedades left y
top se asignan respecto del flujo de la página; posición estática, si el control se colo-
ca de acuerdo con el flujo de la página; y no posicionado, si no se especifican atribu-
tos y la posición se determina por los atributos por omisión correspondientes al ele-
mento en cuestión. Dar a los controles posición absoluta es lo más parecido a trabajar
en ambiente de interfaz Windows, aunque no se recomienda cuando hay objetos de di-
mensión variable, como podrían ser campos con enlazado de datos. Para las interfaces
que contienen objetos con dimensión dinámica, recomendamos el posicionamiento re-
lativo, que por una parte permite el acomodo a discreción en tiempo de diseño, pero
en tiempo de ejecución ajusta las posiciones para que los objetos no se empalmen unos
con otros y mantengan la distancia original entre ellos.
6. Podemos predeterminar el posicionamiento de los controles en HTML Designer.
Seleccione la opción de menú Tools – Options, el nodo HTML Designer – CSS
Positioning, marque la casilla de verificación Change positioning to the following
for controls added using the Toolbox, paste or drag and drop, y en el cuadro com-
binado seleccione Absolutely positioning. Con ello, cada nuevo control integrado
a la interfaz quedará posicionado de forma absoluta. Esto es muy conveniente para
el tipo de interfaz que deseamos desarrollar, puesto que no tiene objetos de longi-
tud variable.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 427

➤ Adición de elementos a un sitio Web

7. En el capítulo 3 (ejercicio 03.03) ya realizamos una página Web básica. El sitio tiene
el nombre http://localhost/APVBNETVS. Seleccione el nodo del sitio APVBNETVS y
despliegue el menú contextual, seleccionando la opción Add New Item. Aparecerán
todos los elementos que pueden agregarse a una aplicación Web. Seleccione Web
Form; en Name escriba Usuario.aspx. Asegúrese de que la casilla de verificación
Place code in separate file esté seleccionada. Haga clic en Add.

8. Con ello se habrá generado una nueva página Web ASPX en el proyecto. En Server Ex-
plorer seleccione el nodo que acaba de agregar (Usuario.aspx), invoque el menú de
contexto y seleccione la opción Set As Start Page, para obligar a que la nueva página
sea la página de arranque del proyecto.
13
➤ Establecimiento de valores generales de formulario

9. Agregue a la interfaz los siguientes elementos: cuatro etiquetas (Label), cuatro


cuadros de texto (TextBox), cuatro validadores de campo requerido (RequiredField-
Validator), un validador de expresión regular (RegularExpressionValidator), un
validador de rango (RangeValidator), un validador de comparación (CompareValida-
tor), un calendario (Calendar), un validador personalizado (CustomValidator) un
botón de comando (Button), una línea horizontal (Horizontal Row) y un hipervínculo
(HyperLink).
428 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La interfaz deberá lucir de la siguiente manera:

NOTA
Por cuestión de notación, cuando hacemos referencia a Clase.Miembro, por ejemplo
Form.Name, nos referimos al miembro de la clase; la explicación será válida para todas las ins-
tancias que se generen de dicha clase. En caso de que un miembro sea aplicable a todos los
objetos que se deriven de una misma clase base, se colocará la referencia de la clase base per-
tinente; por ejemplo, BaseValidator.Display.

Cuando hagamos referencia a Instancia.Miembro, por ejemplo txtNombre.MaxLength,


especificaremos valores y condiciones aplicables a un objeto en particular.

En la mayoría de los casos los controles pertenecen a Web.UI.WebControls.

10. Modifique las siguientes propiedades desde Properties (oprima la tecla F4).
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 429

Propiedad Valor a asignar

Label1.Text Nombre:
Textbox1.ID txtNombre
txtNombre.MaxLength 40
txtNombre.ToolTip Capture aquí su nombre
RequiredFieldValidator1.ControlToValidate txtNombre
RequiredFieldValidator1.Display Dynamic
RequiredFieldValidator1.ErrorMessage El nombre no debe omitirse
RequiredFieldValidator1.Text *
Label2.Text Correo:
TextBox2.ID txtCorreo
txtCorreo.MaxLength 40
txtCorreo.ToolTip Capture aquí su correo electrónico
RequiredFieldValidator2.ControlToValidate txtCorreo
RequiredFieldValidator2.Display Dynamic
RequiredFieldValidator2.ErrorMessage El correo no puede omitirse
RequiredFieldValidator2.Text *
RegularExpressionValidator1.ControlToValidate txtCorreo
RegularExpressionValidator1.Display Dynamic
RegularExpressionValidator1.ErrorMessage Formato de correo electrónico
incorrecto.
RegularExpressionValidator1.Text *

RegularExpressionValidator1.ValidationExpression
Seleccione el formato de correo
electrónico:
13

Haga clic en Ok.


430 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se incluirá la expresión siguiente,


que representa una dirección de
correo electrónico en Internet:
\w+([-+.’]\w+)*@\w+([-
.]\w+)*\.\w+([-.]\w+)*
Label3.Text Edad:
TextBox3.ID txtEdad
txtEdad.MaxLength 3
txtEdad.ToolTip Capture su edad (0 a 100)
RequiredFieldValidator3.ControlToValidate txtEdad
RequiredFieldValidator3.Display Dynamic
RequiredFieldValidator3.ErrorMessage La edad no puede omitirse
RequiredFieldValidator3.Text *
RangeValidator1.ControlToValidate txtEdad
RangeValidator1.Display Dynamic
RangeValidator1.ErrorMessage La edad no está dentro del rango
permitido
RangeValidator1.MaximumValue 100
RangeValidator1.MinimumValue 0
RangeValidator1.Text *
RangeValidator1.Type Integer
CompareValidator1.ControlToValidate txtEdad
CompareValidator1.Display Dynamic
CompareValidator1.ErrorMessage La edad debe ser un número entero
CompareValidator1.Operator DataTypeCheck
CompareValidator1.Text *
CompareValidator1.Type Integer
Label4.Text Inicio:
TextBox4.ID txtInicio
RequiredFieldValidator4.ControlToValidate txtInicio
RequiredFieldValidator4.Display Dynamic
RequiredFieldValidator4.ErrorMessage La fecha de inicio de servicios no
debe omitirse
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 431

RequiredFieldValidator4.Text *
CustomValidator1.ControlToValidate txtInicio
CustomValidator1.Display Dynamic
CustomValidator1.ErrorMessage La fecha de inicio de uso es incorrecta
CustomValidator1.Text *
Calendar1.ID calInicio
Button1.ID btnAceptar
btnAceptar.Text Aceptar datos
Hyperlink1.NavigateURL http://www.aprendapracticando.com
Hyperlink1.Text Ir al sitio de Aprenda Practicando
ValidationSummary1.DisplayMode BulletList
ValidationSummary1.ShowMessageBox True
ValidationSummary1.ShowSummary False

11. Realice los reacomodos necesarios para que la interfaz luzca de la siguiente manera:

13
432 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Haga doble clic en RequiredFieldValidator4. Codifique lo siguiente:

Codificación de Usuario.aspx.vb – CustomValidator1_ServerValidate

1 Partial Class Usuario


2 Inherits System.Web.UI.Page
3
4 Protected Sub CustomValidator1_ServerValidate(
5 ByVal source As Object,
6 ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs)
7 Handles CustomValidator1.ServerValidate
8
9 If Year(args.Value) < 2002 Or Year(args.Value) = 2004 Then
10 args.IsValid = False
11 Else
12 args.IsValid = True
13 End If
14
15 End Sub
16 End Class

13. Observe cómo en la pestaña se hace referencia al programa Usuario.aspx.vb; en sí


es un programa en Visual Basic, independiente de la página Web ASPX. Al hecho de
que el código no esté en la misma página se le conoce como code behind. Tener el
código separado del diseño es muy útil, sobre todo para evitar la modificación invo-
luntaria de trabajo entre diseñadores y codificadores. Vea cómo Visual Studio le
asigna el mismo nombre que la página y le agrega la extensión VB. Al momento de
cargar la página la primera vez, el programa VB se compila formando un DLL que de-
berá colocarse en el directorio \BIN de la aplicación cuando se instale en ambientes
de producción; este directorio es especial, dado que por omisión IIS realiza la bús-
queda de componentes y controles en él, sin necesidad de hacer referencias explíci-
tas en el proyecto. La página permanece sin cambios, mientras que el código queda
oculto.
14. Estando en Text Editor, en el cuadro combinado de objetos seleccione calInicio, y
en el de miembros seleccione SelectionChanged, con el fin de que se precodifique el
procedimiento de evento que ha de ocurrir cuando se seleccione una fecha en el calen-
dario.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 433

Codificación de PrimeraPagina.aspx.vb – calInicio_SelectedDate

1 Protected Sub calInicio_SelectionChanged(ByVal sender As Object,


2 ByVal e As System.EventArgs) Handles calInicio.SelectionChanged
3 txtInicio.Text = calInicio.SelectedDate
4 End Sub

15. En el procedimiento asignará al control txtInicio la fecha que se seleccione en


calInicio. Esto permite la validación del control, dado que Calendar no puede vali-
darse directamente.

Ejecución guiada de PrimeraPagina.aspx


16. La propiedad WebControl.Id de los controles Web es el equivalente a la propiedad Name
de los controles para Windows Forms, y sirve para identificar los controles; cambiar el
Id de los controles es especialmente útil si se van a utilizar programáticamente.
17. El control típico de captura de información es TextBox, pues permite ingresar un va-
lor de tipo String que puede ser convertido en cualquier otro tipo de dato. La propie-
dad TextBox.MaxLength permite limitar el número de caracteres que ha de admitir un
cuadro de texto, independientemente del tamaño del control en la pantalla. La propie-
dad TextBox.ToolTip permite asignar una ayuda textual fugaz para los objetos, que
aparecerá en tiempo de ejecución al colocar el puntero del ratón sobre el control.
18. Los controles de validación son especialmente útiles dado que verifican que los datos
de entrada sean correctos antes de realizar funciones de procesamiento en el servidor.
Los controles de validación derivan de la clase BaseValidator, que define las princi-
pales propiedades comunes para todos los validadores. Fundamentalmente debe espe-
cificarse en dichos controles la propiedad BaseValidator.ControlToValidate, que
indica qué control será validado; la propiedad BaseValidator.ErrorMessage per-
13
mite establecer el texto que ha de mostrarse en el resumen de errores, mientras que
BaseValidator.Text permite establecer el mensaje de error que aparece en la inter-
faz si el control a validar no cumple con los criterios de validación. En caso de que
se asigne BaseValidator.ErrorMessage pero no BaseValidator.Text, el valor de
BaseValidator.ErrorMessage será asignado a BaseValidator.Text de forma auto-
mática. La propiedad BaseValidator.Display de los controles de validación permite
establecer la forma en que se muestran los mensajes de error, que puede ser de forma
dinámica (Dynamic), estática (Static) o no mostrarse (None).
434 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Es importante mencionar que no todos los controles pueden ser validados a través de
los controles de validación. Una forma sencilla de saber si el control permite valida-
ción es comprobar si la clase posee la propiedad WebControl.CausesValidation;
esta propiedad indica si se desea que el control cause validaciones, por lo cual de exis-
tir para el control, indica que las admite. También es importante saber que un mismo
control puede ser sujeto a varias validaciones al mismo tiempo.
20. En lo particular los controles de validación tienen diversas propiedades inherentes a la
función que realizan. Por su simpleza, RequiredFieldValidator es el más sencillo,
ya que realiza la verificación de si un control tiene contenido en su propiedad de va-
lor. Este validador es el primero que se comprueba, dado que los demás tienen senti-
do sólo cuando el control ya tiene un valor. En caso que RequiredFieldValidator re-
porte error, las demás validaciones no se realizan.
21. Un control que sí tiene sus propiedades particulares es RangeValidator, ya que utili-
za la propiedad RangeValidator.MinimumValue para especificar el umbral del rango,
y utiliza la propiedad RangeValidator.MaximumValue para especificar el valor más al-
to dentro del rango. Es muy importante especificar el tipo de dato sobre el que está ba-
sado el rango, dado que de lo contrario se asumirá un rango de valores String que
puede diferir mucho de un comportamiento numérico, por ejemplo. El tipo de dato a
utilizar se especifica utilizando la propiedad RangeValidator.Type.
22. El control CompareValidator por su parte se ocupa de comparar el valor que posee el
control a validar respecto de un valor fijo, el valor que tenga otro control, o verificar
si el dato de entrada pertenece a un tipo de dato específico.

a) Si se desea la comparación sobre un valor fijo, éste se debe especificar a través de


la propiedad CompareValidator.ValueToCompare.
b) Si la comparación es con el valor de otro control, éste debe especificarse en la pro-
piedad CompareValidator.ControlToCompare.
c) La comparación a realizar se hace en términos de un operador de comparación,
representado por la propiedad CompareValidator.Operator y que puede asumir
los siguientes valores: Equal (igual), GreaterThan (mayor que), GraterThanE-
qual (mayor o igual), LessThan (menor que), LessThanEqual (menor o igual),
NotEqual (distinto).
d) En caso de que la comparación sea respecto de un tipo de dato (saber si el control
a validar posee un valor de un determinado tipo de dato), sólo se requiere estable-
cer en CompareValidator.Operator el valor DataTypeCheck, y especificar el ti-
po que esperamos en la propiedad CompareValidator.Type.

23. En el caso de RegularExpressionValidator, la comparación se realiza contra una


expresión regular. Las expresiones regulares son una notación estandarizada para la de-
finición de patrones de coincidencia; en el caso de la implementación de Microsoft
.NET, los patrones guardan mucha semejanza con las reglas definidas en Perl y awk.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 435

La herramienta Regular Expression Editor permite simplificar la determinación de al-


gunos patrones estándar, aunque también es posible construir expresiones regulares
propias.
24. En el caso de CustomValidator la validación está determinada por un procedimiento
que nosotros codificamos. Este tipo de validación se utiliza cuando los demás contro-
les de validación no son suficientes para representar un criterio. En nuestro caso, la fe-
cha de inicio de uso del servicio no puede ser anterior al año 2002, ni dentro de 2004;
como el rango no es continuo, se requiere de programación para manejarla. Una de las
mejores características de este control de validación es que además permite la valida-
ción utilizando procedimientos de parte del cliente, definida a través de la propiedad
CustomValidator.ClientValidationFunction. En el procedimiento de evento de la
validación se puede tener acceso del valor del control a validar mediante la propiedad
args.Value del argumento implícito ServerValidateEventHandler.args. Para indi-
car la existencia de errores, podemos recurrir a la propiedad args.IsValid del argu-
mento implícito ServerValidateEventHandler.args.
25. El código del procedimiento de evento para CustomValidator (CustomValidator1–
ServerValidate()) hace lo siguiente: En la línea 8 se evalúa si la propiedad de va-
lor del control validado (args.Value) es menor a 2002 o igual a 2004, se considera que
el dato no es válido (args.IsValid=False), o de lo contrario si lo es. La propiedad
args. Value asumirá el valor de calInicio.DateSelected, dado que es la propiedad de
valor del control que se está validando. El código del procedimiento de evento para la
selección de fecha de Calendar (calInicio_SelectionChanged()) simplemente asig-
na la propiedad de valor de calInicio a la propiedad de valor de txtInicio.
26. El control ValidationSummary permite mostrar el resumen con todos los errores que
contravienen las restricciones marcadas por los controles de validación de la página.
Una de las propiedades importantes es la propiedad ValidationSummary.Display-Mode,
que puede tener los siguientes valores: BulletList (lista con viñetas), List (lista sin
viñetas), y SingleParagraph (párrafo sencillo). El resumen mostrará en el modo espe-
cificado el conjunto de valores de las propiedades BaseValidator.ErrorMessage de
todos los controles de validación que no se hayan cumplido satisfactoriamente; la po-
sición donde los resultados aparecerán es donde el control se haya colocado. También 13
es posible que los errores aparezcan en un cuadro de diálogo y no en la página; esta
modalidad está disponible si se asigna el valor de True a la propiedad Validation
Summary.ShowMessageBox. Para el caso en que no queramos ver en la página los erro-
res de manera textual, se puede suprimir la visualización colocando la propiedad
ValidationSummary.ShowSummary en False.
27. El control Calendar sirve para seleccionar fechas en un ambiente gráfico. La propie-
dad de valor de este control es Calendar.SelectedDate, que es de tipo DateTime. Es
posible seleccionar más de una fecha; para ello se debe establecer un modo de selec-
ción a través de la propiedad Calendar.SelectionMode, que puede tener los siguien-
tes valores: Day (día), DayWeek (una fecha o toda una semana), DayWeekMonth (una
436 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

fecha, una semana o un mes), o None (no se puede seleccionar nada). En caso de que
se seleccione más de una fecha, éstas son accesibles a través de la colección Calen-
dar.SelectedDates. Por omisión la selección es de tipo Day.
28. Finalmente, el control HyperLink establece un vínculo hacia un recurso Web. El texto
del vínculo está representado por la propiedad HyperLink.Text, y el vínculo hacia el
que se envía el control del navegador se establece en la propiedad HyperLink. Na-
vigateURL.
29. Cuando se involucran controles de validación en un programa, es posible saber si en
la página se tuvieron errores. Para ello podemos recurrir a la propiedad Page.IsValid
de la página, que está representada por el objeto Page.
30. El objeto Button simplemente ejecutará el procedimiento de evento Button.Click
cuando se haga clic en él. El texto que aparece en la cara del botón está representado
por la propiedad Button.Text.
31. Guarde todos los cambios realizados en su solución e inicie la depuración (tecla F5).
Para empezar haga clic en el botón sin ingresar datos. Vea cómo aparecen asteriscos
rojos (propiedades BaseValidator.Text) al lado de los campos que presentan error.
Sólo se muestra el correspondiente a la validación de campos requeridos, dado que no
intenta realizar más validaciones por ausencia de datos. Los mensajes de error (Base
Validator.ErrorMessage) aparecerán en la ventana de diálogo, como una lista con
viñetas.
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 437

32. Introduzca datos válidos para cada uno de los campos, pero procure causar un solo
error a la vez de la siguiente lista, a fin de observar el comportamiento del programa:

a) Colocar un correo electrónico que no tiene el formato adecuado (una palabra, por
ejemplo).
b) Colocar una edad negativa.
c) Escribir letras en la edad.
d) Seleccionar una fecha del 2004.
e) Seleccionar una fecha antes del 2002.

Para asegurarse de que la validación se hace, no olvide hacer clic en el botón. Si ve-
mos la interfaz de usuario quiere decir que .NET Framework en conjunto con IIS ya
nos enviaron el código HTML y los bloques de código script correspondientes a los
controles Web y los controles de validación que indicamos en la página; esto permite
que de parte del cliente se realicen validaciones antes de lanzar la petición. Si no hay
errores de validación esto provoca una petición HTTP al servidor.

➤ Revisión del código generado por el servidor

33. Las validaciones suceden porque el motor de ejecución de ASP.NET, en conjunto con
.NET Framework en el servidor, se encargan de devolver al cliente una página que
contiene bloques de código de parte del cliente para reproducir el comportamiento de-
seado. No es necesario que sepa VBScript o JavaScript: ASP.NET se encarga de codi-
ficar y enviar el código de parte del cliente.
34. En Internet Explorer seleccione la opción Ver – Código Fuente. Vea todo lo que ASP-
.NET codifica por usted. En la página encontrará código de parte del cliente en Java
Script, así como etiquetas HTML optimizadas para su navegador.

13
438 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

35. El código para crear un vínculo que permita ir al sitio de Aprenda Practicando es el
siguiente.
<a id=”HyperLink1” href=”http://www.aprendapracticando.com” style=
”z-index: 118; left: 8px; position: absolute; top: 377px”>Ir al si-
tio de Aprenda Practicando</a>

Sin embargo, sólo tuvimos que agregar un control a la interfaz y modificar propieda-
des en tiempo de diseño. ¿Qué forma de desarrollo preferiría? Aunque la programa-
ción directa es en ocasiones necesaria, si programar de forma artesanal no le agrega
valor al programa, ¿para qué hacer las cosas difíciles?
36. Cierre la aplicación.
FIN DEL EJERCICIO*
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 439

MAPA MENTAL DEL CAPÍTULO

13
440 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA

.css, 409 CodeBehind, 406, Div, 424 LinkButton, 419


.master, 409 413, 417 DropDownList, 419 ListBox, 419
.skin, 409 Código EnableViewState, Literal, 420
@ Master, 409 declarativo, 417 413 Localize, 420
@ Page, 409 separado, 417 ErrorMessage, 429 Login, 423
@Assembly, 412 CompareValidator, ErrorPage, 413 LoginName, 423
@Control, 412 422, 434 Estado de los LoginStatus, 423
@Implements, 412 CompilerOptions, formularios, 405 LoginView, 423
@Import, 412 413 Expresiones Master pages, 404,
@OutputCache, 412 Content pages, 409 regulares, 434 409
@Page, 412 ContentPlaceHolder, eXtensible Markup MasterPageFile, 409
@Reference, 412 409 Language (XML), MaximumValue,
@Register, 412 Control(es) 407 430
AccesDataSource, de acceso, 423 FileUpload, 420 Membresía ASP.NET,
421 de datos, 421 Form-state, 405 407
AdRotator, 420 de navegación, Formulario del Menu, 422
Analizador de 422 servidor, 414 Microsoft Passport,
código, 402 de validación, FormView, 421 407
ASP clásico, 402 415, 422 GridView, 421 MinimumValue,
ASP.NET, 400 de validación, HiddenField, 420 430
membership, 407 416 Horizontal Rule, Modelo petición-
asp:, 415 del servidor, 415 424 respuesta
ASPX, 402 HTML 423 HTML, 423 dinámico
Assembly Cache, Web del http Runtime, 402 orientado a
402 Servidor, 406, HyperLink, 419 eventos, 402
Autenticación 415 IIS, 400 Motor de ejecución
de formularios, ControlToValidate, Image, 419, 424 Web, 400
407 429 ImageButton, 419 MultiView, 420
Windows, 407 Cookie-less, 408 ImageMap, 420 NavigateURL, 431
AutoEventWireUp, Cookies, 408 Inherits, 413 Navigation, 422
413 Copy Development, Input ObjectDataSource,
Bloques 408 Button, 423 421
proveedores de CreateUserWizard, Checkbox, 424 Operator, 430
código, 411 423 File, 424 Output Cache, 402
Buffer, 413 Cross-server session, Hidden, 424 Páginas
BulletedList, 420 408 Password, 424 de apariencia,
Button, 419 CustomValidator, Radio, 424 409
Caché 422 Reset, 424 de contenido,
de ensamblados, CustomValidator, Submit, 424 409
402 435 Text, 424 maestras, 409
de salida, 402 DataList, 421 Validation Panel, 420
Calendar, 420, 435 Debug, 413 Control, 417 Parser, 402
Cascadas de estilos, Delimitadores de Internet PaswordRecovery,
409 contenido, 409 Information 423
ChangePassword, DetailsView, 421 Server (IIS), 400 PlaceHolder, 420
423 Directivas, 412 IsValid, 435 RadioButton, 419
CheckBox, 419 Display, 429 Label, 419 RadioButtonList,
CheckBoxList, 419 DisplayMode, 431 Language, 413 419
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 441

RangeValidator, Select, 424 421 Type, 430


422, 434 Servicios Web XML, SiteMapPath, 422 Validation, 422
RegularExpression 407 Skins, 404, 409 Validation-
Validator, 422, Servidores SOAP, 407 Expression, 429
434 combinados, SqlDataSource, 421 ValidationSummary,
Repeater, 421 408 Substitution, 420 422, 435
RequiredFieldVali- ShowMessageBox, Table, 420, 424 View, 420
dator, 422 431 Temas, 409 Web Parts, 404,
RequiredFieldVali- ShowSummary Text, 429 409
dator, 434 Simple Object Textarea, 424 Wizard, 420
Rich controls, 415 Access Protocol TextBox, 419 XML, 407
runat=server, 414 (SOAP), 407 Themes, 404, 409 Xml (control), 420
Scripting, 409 SiteMapDataSource, TreeView, 422 XmlDataSource, 421

PREGUNTAS
13.1 ¿Cuáles son los motivos que han provocado el auge de las aplicaciones Web?
13.2 Mencione los requerimientos que se tienen para el desarrollo en ASP.NET.
13.3 Enumere las características de ASP.NET.
13.4 Enumere los elementos de una página ASP.NET, y explique para qué sirve cada una.
13.5 Mencione cuáles son los grupos de controles en las aplicaciones ASP.NET.
13.6 ¿Cuales son los 15 controles que usted cree que utilizará con más frecuencia?

13
442 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 443

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. Es el modelo de petición utilizado por ASP.NET
a) Modelo de petición respuesta
b) Modelo de petición respuesta dinámico
c) Modelo de petición respuesta dinámico orientado a eventos

2. Característica que permite separar el código de las etiquetas en ASP.NET


a) Code Behind
b) Managed code
c) Assembly Cache

3. Componentes funcionales que pueden ser utilizados mediante peticiones Web.


a) Servicios Web XML
b) Web Components
c) DHTML

4. Cantidad de esquemas de seguridad que soporta ASP.NET


a) 1
b) 2
c) 3

5. Son implementaciones funcionales basadas en etiquetas, a través de las cuales se obtiene HTML di-
námico, sensible a eventos.
a) Código declarativo
b) Controles Web
c) HTML.NET

Parte 2: Coloque en la línea la letra «F» si la sentencia es falsa, y «V» si la sentencia es


verdadera.
6. ASP.NET soporta el modelo orientado a eventos.

7. El código que se utilliza en las páginas Web ASP.NET es código interpretado.

8. Con ASP.NET se puede indicar que las etiquetas HTML se resuelvan del lado del
servidor.
13
9. Las directivas permiten especificar valores a ser considerados al momento de la com-
pilación que realiza .NET Framework.

10. Los equipos desde los que se llama una página ASP.NET deben tener .NET Frame-
work instalado.
CAPÍTULO 14
Servicios Web XML

Objetivos: Aprender en qué consisten los servicios Web XML, y cómo crear-
los y consumirlos.

1. Conocerá los Servicios Web XML y sus ventajas.


2. Sabrá qué son UDDI, Web Service Discovery y WSDL.
3. Aprenderá a crear un Servicio Web XML.
4. Aprenderá a descubrir un Servicio Web XML.
5. Aprenderá a consumir un Servicio Web XML.

445
446 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Funcionalidad antes de los servicios Web XML . . . . . . . . . . . . . . . . . . . 447
Funcionalidad con servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . 448
Características de los servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . 448
¿Cuándo utilizar servicios Web XML? . . . . . . . . . . . . . . . . . . . . . . . . . . 449
UDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Web Service Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Infraestructura de operación de los Servicios Web . . . . . . . . . . . . . . . . . . . . 453
Elementos para la creación de un Servicio Web XML . . . . . . . . . . . . . . . . . . 454
Procedimiento de consumo desde el navegador . . . . . . . . . . . . . . . . . 454
Creación de un Servicio Web XML y demostración
de su uso desde el navegador . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
➤ Creación de un Servicio Web XML . . . . . . . . . . . . . . . . . 455
➤ Prueba del Servicio Web XML desde el navegador . . . . 457
Consumo programático de un Servicio Web XML desde
una aplicación Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 459
➤ Estableciemiento de la referencia a un Servicio
Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
➤ Consumo programático de un Servicio Web XML . . . . . 461
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Capítulo 14. Servicios Web XML 447

A medida que los negocios se globalizan, las redes de computadoras se han constituido en
un elemento indispensable de las aplicaciones.
14
Las cosas ya no suceden sobre un solo escritorio, sino sobre muchos escritorios dispersos
geográficamente. Conforme pasa el tiempo, el alcance de las redes ha ido variando; hasta
hace algunos años la comunicación era entre equipos de la misma organización, a distan-
cias relativamente manejables. Ahora, las distancias son globales y podemos estar comu-
nicándonos con un equipo que se encuentra en un punto distante del planeta.
No sólo el alcance de las redes ha cambiado; también aquello que viaja por ellas. Al prin-
cipio, lo que se transmitía por las redes eran datos, y la funcionalidad radicaba en un ser-
vidor o en clientes específicos funcionando en alguna plataforma determinada.
En el nuevo escenario global ya no se puede garantizar que equipos y servidores dispon-
gan de las mismas plataformas operativas; ahora no sólo se requiere que los datos viajen,
sino que la funcionalidad pueda distribuirse de manera remota, sin importar las platafor-
mas que tengan los equipos.
Atendiendo a estas necesidades surgen los servicios Web XML.

Servicios Web XML


Los servicios Web XML (XML Web Services) son componentes que funcionan a través de
protocolos estándar para su uso en la Web (XML/SOAP).
El nombre puede ser engañoso. Se dice que son servicios “Web” por la forma en que se
consumen; no porque se trate de aplicaciones Web. El bloque de código que compone un
servicio Web XML se parece más a un programa de consola sin interfaz; se trata de una
clase pública que define principalmente métodos de servicio Web XML (XML Web service
method), que podrán ser invocados por aquellos programas que consuman el servicio.
En cierta forma son la evolución del trabajo basado en componentes COM/DCOM. Tan es
así, que los servicios Web XML han sido llamados con mucha frecuencia “COM basado
en la Web”, aunque ello no sea del todo exacto.

Funcionalidad antes de los servicios Web XML


Anteriormente, cuando se trabajaba en el esquema de Windows DNA, la funcionalidad de
las aplicaciones se desarrollaba en forma de componentes COM.
A través de dichos componentes se codificaban algoritmos y reglas que satisfacían las de-
mandas de la capa de negocios en ambientes multicapa.
448 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Si la aplicación requería un funcionamiento distribuido se utilizaba tecnología DCOM


(Distributed Component Object Model), que permitía el intercambio de paquetes de datos
y la ejecución remota de componentes sin la necesidad de registrarlos en los equipos clien-
tes. El esquema era bueno, pero tenía la limitante de tratarse de tecnología propietaria que
requería una homologación de plataforma entre el cliente y el servidor.
En el nuevo ambiente globalizado, dicha homologación resulta un problema ya que no po-
demos obligar a nuestro socio de negocios en otra parte del mundo a utilizar la misma pla-
taforma operativa que nosotros (Windows, por ejemplo). En otras palabras, seguimos ne-
cesitando que la funcionalidad de los componentes sea distribuida, pero sin la necesidad
de homologación de plataforma.

Funcionalidad con servicios Web XML


Los servicios Web XML, al igual que COM/DCOM, permiten el manejo distribuido de
componentes; la diferencia con aquéllos radica en que la comunicación entre cliente y ser-
vidor se lleva a cabo utilizando protocolos estándar de la Web, tales como HTML, XML y
SOAP; de esa forma todo equipo que funcione con esos protocolos estándar podrá admitir
servicios Web XML. Dicho de manera más contundente, un equipo en Unix o Linux ya po-
drá consumir funcionalidad alojada en componentes desarrollados bajo plataforma Win-
dows.
Los servicios Web XML permiten aprovechar la infraestructura de Internet para la distri-
bución de funcionalidad y paquetes de datos, eliminando los problemas que se daban por
diferencias entre plataformas operativas, lenguajes de programación utilizados o los mode-
los de objetos de programación empleados. Los servicios Web XML son una caja negra
que recibe peticiones y devuelve respuestas, todo ello usando protocolos estándar para la
Web.

Características de los servicios Web XML


Las características principales de los servicios Web XML son las siguientes:

❑ Están basados en protocolos estándar para la Web. Los servicios Web XML
realizan las peticiones y proporcionan las respuestas utilizando protocolos estándar de
la Web, como HTTP (Hyper Text Transfer Protocol), XML (eXtensible Markup Langua-
ge) y SOAP (Simple Object Access Protocol). Toda plataforma que maneje dichos pro-
tocolos podrá aprovechar la funcionalidad de los servicios Web XML.
❑ Comunicación aplicación a aplicación basada en Internet. Al utilizar un servi-
cio Web XML no se tiene una interfaz de usuario visible; realmente se trata de un com-
ponente que puede ser consumido de manera programática de aplicación a aplicación.
Capítulo 14. Servicios Web XML 449

Los servicios Web XML proporcionan una interfaz estándar para la recepción de peti-
ciones y envío de respuestas, denominada contrato (contract); dicho contrato pone a
disposición de los usuarios la información requerida por el componente, describe los
14
comportamientos del mismo y relaciona los datos de entrada/salida del componente.
Mediante el contrato, un servicio Web XML informa a otras aplicaciones cómo interac-
tuar con él.
❑ Independencia de lenguaje. Los servicios Web XML pueden ser consumidos des-
de programas escritos en cualquier lenguaje .NET, por lo que no es necesario aprender
un lenguaje determinado para tener acceso a su funcionalidad.
❑ Independencia de la plataforma. Independientemente de la plataforma que dis-
pongan los clientes de una aplicación, el contrato se encarga de hacer la petición en un
formato estándar y recibir la respuesta correspondiente.
❑ Arquitectura libre del manejo de estados (stateless architecture). Los servi-
cios Web XML no manejan estados de objetos; cada respuesta brindada por un servicio
Web XML es una nueva instancia de un objeto con su estado particular. Lo que una pe-
tición realiza no afecta lo realizado por otras peticiones.
❑ Comunicación sincrónica/asincrónica. El requerimiento de ejecución de un método
de servicio Web XML y el requerimiento de la respuesta son independientes. La aplica-
ción que consume el servicio Web XML y el servicio Web XML mismo pueden operar
con mayor disponibilidad, ya que liberan recursos mientras se está en tiempo de espera.

¿Cuándo utilizar servicios Web XML?


Cuando se requiere compartir funcionalidad libre de interfaz de usuario. Los
servicios Web son útiles cuando se desea consumir la funcionalidad de un componente sin
la intermediación de una interfaz de usuario. Ejemplo de esto es el consumo de servicios
que proporcionan información como tipos de cambio, estado del clima, precios de produc-
tos, disponibilidad de lugares en eventos, etcétera; en muchas ocasiones queremos la infor-
mación sin tener que responder a ninguna interfaz de usuario.
Cuando se quiere comercializar un servicio de uso de software y no un pro-
ducto de software. En la actualidad, adquirir software implica adquirir medios físicos
(CD/DVD) en cajas de cartón. Pero si lo que realmente necesitamos no es el paquete en sí,
incluso no necesitamos los programas: lo que requerimos es lo que los programas hacen,
es decir, sus servicios. También tenemos que lidiar con su instalación, el espacio en disco
que la instalación demanda, los prerrequisitos de instalación, las comprobaciones de con-
vivencia con otras aplicaciones, etcétera. Todo ello no le agrega valor a nuestro trabajo, si-
no complejidad.
En el futuro no se venderá software; la funcionalidad que el software brinde estará dispo-
nible como servicio en la Web; si requerimos de un procesador de palabras, nos enlazare-
450 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mos a un procesador de palabras en línea y pagaremos sólo por el tiempo que utilizamos
dicho procesador; probablemente no almacenaremos los archivos en nuestro disco duro si-
no en un servicio de almacenamiento, en línea también, y así poco a poco requeriremos só-
lo un equipo con buen nivel de comunicaciones y no uno con mucha memoria, procesador
y espacio de almacenamiento.
Microsoft ha empleado con éxito el concepto a través de Microsoft Passport, que es un es-
quema de seguridad y perfiles que puede ser utilizado y contratado por cualquier aplica-
ción. Hay otros ejemplos: el sistema de seguimiento de paquetes de Federal Express
(FedEx Tracker) está disponible como servicio para rastrear un envío con sólo proporcio-
nar el número de guía; Barnes & Noble cuenta con un servicio que proporciona el precio
de venta de un libro, si se proporciona un ISBN (Barnes & Noble Price Quote). De esas
maneras se podrá obtener vía Web servicios como cotizaciones y tipos de cambio, pronós-
ticos del clima, ofertas de productos, etcétera.
Cuando cliente y servidor requieren compartir funcionalidad en Internet, pe-
ro difieren en su plataforma operativa. Sucede cuando los equipos no operan con
la misma plataforma. En la actualidad, por ejemplo, el esquema basado en COM/DCOM
utiliza tecnología de propietario, que no es compatible con otros equipos en Internet, lo que
limita la distribución de la funcionalidad. Si se requiere disponer de funcionalidad entre
plataformas distintas compatibles con los protocolos estándar de la Web, los servicios Web
XML son la solución.

UDDI
Uno de los puntos más importantes de un servicio es su publicidad.
De nada sirve un servicio Web XML que nadie conoce. Así como las empresas de servi-
cios a los consumidores tienen la necesidad de darse a conocer, un servicio Web XML re-
quiere comunicar, de alguna forma, que existe y para qué sirve.
Pensando en ello se ha definido un mecanismo para darles publicidad a los servicios Web
XML que las empresas desarrollan, denominado UDDI (Universal Description Discovery
and Integration).
UDDI está formado por un registro distribuido de información de los servicios Web XML;
dicho registro está implementado en un formato XML y en él se pueden encontrar los ne-
gocios que ofrecen servicios Web XML, así como la descripción de los mismos.
Cada negocio que desarrolla servicios Web XML registra su información a través de un si-
tio Web (http://www.uddi.org/), o a través de herramientas y programas comerciales o que
se desarrollen para tal efecto.
Una vez registrado, el servicio Web XML queda expuesto a la comunidad de desarrollado-
res para su consumo.
Capítulo 14. Servicios Web XML 451

Una buena recomendación es que, antes de desarrollar un servicio Web XML, revise los
servicios Web XML ya desarrollados y disponibles; quizá entre ellos encuentre la solución
de procesamiento con un costo menor.
14

Web Service Discovery

Si queremos utilizar en un programa la funcionalidad de una clase, es necesario especifi-


carle la forma de localizarla.
En el caso de las aplicaciones Web no es práctico establecer referencias a clases utilizan-
do su ruta física. Es necesario disponer de un mecanismo que permita encontrar las clases
que nuestras páginas necesitan de la manera más independiente posible con respecto a su
implementación física.
Se conoce como descubrimiento de servicio Web (Web Service Discovery) al proceso por
medio del cual se localiza un servicio Web XML y su descripción, de tal manera que esté
disponible para los programas que consumen los servicios Web XML.
Disco es un mecanismo que enumera los servicios Web XML disponibles y sus contratos;
este mecanismo es de tecnología propietaria de Microsoft, aunque no se descarta que en el
futuro cercano surja un estándar de la industria, cuando los servicios Web XML tengan ma-
yor demanda.
La forma de descubrir un servicio Web XML y crear archivos que permitan agrupar las re-
ferencias de los recursos ocupados por el servicio, es mediante la utilería Disco.exe, des-
de línea de comandos. Desde luego, si se trabaja con Visual Studio, las labores de descu-
brimiento se hacen de forma automática:

disco URL_Servicio

Donde URL_Servicio es el URL del servicio Web XML.


La ejecución de disco.exe sobre el servicio Web XML producirá archivos de extensión
.WSDL y .DISCO. El archivo de extensión .DISCO contiene la información que permite lo-
calizar el Servicio Web XML y sus componentes requeridos. A este archivo se le denomi-
na discovery document.
Es muy importante realizar el descubrimiento del servicio Web XML antes de generar la
clase proxy usando wsdl.exe, debido a que si no se hace el descubrimiento antes, la des-
cripción del servicio no tendrá la suficiente información para crear una clase proxy.
Es necesario consultar algunos otros parámetros para usar la utilería en las referencias téc-
nicas del producto; también aparecen si se ejecuta la utilería sin argumentos.
452 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

WSDL
No sólo basta encontrar qué servicios Web XML están disponibles; es muy importante co-
nocer también cómo funcionan y cómo los podemos consumir.
Un WSDL (Web Service Description Language) es la especificación estándar de funciona-
miento y datos de un servicio Web XML. WSDL se maneja a través de un contrato, cono-
cido también como Service Description, que es un documento XML que contiene informa-
ción relacionada con el servicio Web XML y los paquetes de datos que el servicio Web
XML maneja, tanto de entrada como de salida.
En cierta forma, WSDL especifica los datos requeridos por el servicio, su comportamien-
to y sus datos de retorno; actúa como un contrato de intercambio de paquetes de datos en-
tre el consumidor de servicios Web XML (Web Service Consumer) y el servicio Web XML.
WSDL también contiene las referencias a las direcciones asociadas con el servicio Web
XML, mismas que dependerán del protocolo utilizado para consumir el servicio (HTTP,
SMTP, etcétera).
El documento WSDL es un documento XML; el elemento raíz es llamado definitions y
contiene cinco nodos hijos que muestran la forma en que está definido el servicio Web
XML. Dichos elementos hijo son los siguientes:

❑ types. Define los tipos de datos utilizados para el intercambio de mensajes entre el
consumidor y el servicio.
❑ message. Describe los mensajes que serán comunicados entre el consumidor y el ser-
vicio.
❑ portType. Identifica el conjunto de operaciones que realiza el servicio y los mensajes
involucrados en dichas operaciones.
❑ binding. Especifica los detalles de protocolo para el intercambio de mensajes entre las
operaciones, describiendo cómo traducir contenido abstracto a un formato estándar.
❑ service. Agrupa aquellos puertos que estén relacionados.

Para generar un WSDL, se utiliza la utilería wsdl.exe, desde la línea de comandos, con la
siguiente sintaxis. Si trabaja en Visual Studio esto se realiza automáticamente:

wsdl /l:Lenguaje /n:NombreNamespace URL_Servicio

Donde Lenguaje es el lenguaje que se desea utilizar, NombreNamespace es el nombre del


espacio de nombres a generarse en el WDSL, y URL_Servicio es el URL del servicio Web
XML a partir del cual se generará WSDL.
La ejecución de wsdl.exe sobre el servicio Web XML producirá un programa generado en
el lenguaje especificado que deberá ser compilado como librería para su uso programáti-
Capítulo 14. Servicios Web XML 453

co. Dicho programa alojará una clase con la misma programación contenida en el servicio
Web XML original, pero además contendrá especificaciones descriptivas que permitirán el
consumo de la funcionalidad de la clase utilizando protocolos abiertos. A esta nueva ver-
14
sión del programa se le conoce como clase proxy.
Es necesario consultar algunos otros parámetros para usar la utilería en las referencias téc-
nicas del producto; también aparecen si se ejecuta la utilería sin argumentos.

Infraestructura de operación
de los Servicios Web
Los Servicios Web XML utilizan una infraestructura que permite localizar y descubrir los
servicios, proporcionar una descripción pública de su funcionalidad, así como proveer
los mecanismos para el uso de protocolos abiertos de comunicación para la distribución de
funcionalidad.
La forma en que un Servicio Web XML expone su funcionalidad a los clientes solicitantes
es la siguiente:

FIGURA 14.1
Infraestructura
de los Servicios
Web XML.

1. El equipo que consume el Servicio Web XML intenta localizar un Servicio Web XML
que le proporcione una funcionalidad específica.
2. Como no sabemos si alguien ya desarrolló un Servicio Web XML que brinde la funcio-
nalidad que requerimos, buscamos en un servidor UDDI; en caso de que ya exista el ser-
454 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

vicio buscado, el servidor enviará la dirección URL en donde se puede solicitar infor-
mación del Servicio Web XML pertinente, que está contenida en discovery document.
3. En caso de que ya sepa dónde encontrar el Servicio Web XML no es necesario acudir
al servidor UDDI para hacer una localización inicial.
4. El consumidor utiliza la información de la ubicación de discovery document y lo re-
cupera. Este documento contiene las referencias a los recursos requeridos por el Ser-
vicio Web XML. El documento informa respecto a la funcionalidad del servicio con
lo que podemos saber si en términos generales nos sirve o no; también proporciona los
elementos para solicitar la descripción del servicio.
5. Si el Servicio Web XML proporciona la funcionalidad que deseamos, se requiere la
descripción del servicio para saber cómo se utiliza y qué información devuelve.
6. Ya con esta información se consume el servicio en los términos que especifica la des-
cripción del servicio.
7. Se recibe la respuesta del servicio.

Elementos para la creación de un servicio


Web XML
Los servicios Web XML, desde el punto de vista de programación, son muy parecidos a un
programa, mientras que en su consumo son más orientados al ambiente Web; de ahí que
proporcionen lo mejor de los dos mundos. Su creación es muy sencilla.
Todo servicio Web XML debe estar constituido por un archivo de extensión .ASMX, y este
archivo debe contener como mínimo lo siguiente:

1. La directiva @WebService.
2. Importar el espacio de nombres System.Web.Services
3. Crear una clase, ya sea dentro de la página o en modo Code Behind.
4. Declarar como <WebMethod()> las funciones del servicio Web XML.

Procedimiento de consumo desde el navegador


Para consumir un servicio Web XML se siguen tres pasos a) publicar; el servicio debe es-
tar disponible; b) encontrar; se debe tener forma de localizar el servicio; c) enlazar; se de-
be tener forma de establecer enlace entre el servicio Web XML y la aplicación que lo con-
sume. A este modelo se le llama Publish/Find/Bind model.
Cuando se realiza el consumo desde el navegador, éste se encarga de todo el proceso:

1. Se debe hacer una solicitud del servicio Web XML utilizando HTTP.
Capítulo 14. Servicios Web XML 455

2. Aparecerá la página de descripción, que expone todos los métodos del servicio.
3. Se selecciona un método del servicio.
4. Se proporcionan los datos que el método requiere.
14
5. Se reciben los resultados del método en formato XML.

El protocolo HTTP es textual y es incapaz de manejar objetos complejos. Como este tipo
de consumo del servicio Web XML se realiza utilizando el protocolo HTTP, la respuesta
sólo puede ofrecerse mediante XML.
Si se desea que el servicio Web XML devuelva objetos complejos, como lo es un DataSet,
por ejemplo, se requerirá el manejo del protocolo SOAP, para lo cual se necesitará la in-
termediación de un proxy.

Ejercicio 14.1
Creación de un Servicio Web XML y demostración de su uso
desde el navegador

Desarrollará un servicio Web XML que contenga un método. En sí el ejercicio es bastante


pequeño, pues sólo trata de explicar las formalidades de la construcción de un servicio Web
XML; ya tendrá la oportunidad de codificar algoritmos más complejos en los servicios que
desarrolle. Se demostrará la forma en que se puede probar el Servicio Web XML desde el
navegador.
En el caso del desarrollo de Servicios Web XML con Visual Studio, todo el proceso de des-
cubrimiento, generación del proxy y exposición se realizan de forma automática.

➤ Creación de un Servicio Web XML

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-


chivo de extensión sln).
2. En el Solution Explorer seleccione la solución, invoque el menú de contexto y selec-
cione la opción Add – New Web Site. En la ventana Add New Web Site seleccione la
plantilla ASP.NET Web Service. En Location debe especificar el protocolo HTTP y
la página http://localhost/Aritmetica. Haga clic en Ok.
456 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

3. Como sabe, los Servicios Web XML no tienen interfaz de usuario, dado que son un
componente de consumo vía protocolos de Internet. En ese sentido, realmente se tra-
ta de una clase especial que permite su consumo a través de peticiones Web. En Visual
Studio la página ASMX, aunque existe, sirve sólo para definir la directiva @WebService
y hacer referencia al código en donde realmente se programa el servicio.
4. Codifique lo siguiente:

Codificación de Aritmetica – App_Code/Service.vb

1 Imports System.Web
2 Imports System.Web.Services
3 Imports System.Web.Services.Protocols
4
5 <WebService(Namespace:=”http://tempuri.org/”)> _
6 <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
7 <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
8 Public Class Service
9 Inherits System.Web.Services.WebService
10 txtInicio.Text = calInicio.SelectedDate
11 <WebMethod(Description:=”Suma de dos números”)> _
12 Public Function Suma(ByVal N1 As Integer, ByVal N2 As Integer) _
13 As Integer
14
15 Return (N1 + N2)
16
17 End Function
18
19 End Class
Capítulo 14. Servicios Web XML 457

Ejecución guiada de Aritmetica.asmx 14


5. De la línea 1 a la 3 se establecen los espacios de nombre requeridos por el Servicio
Web XML; queda claro que es un servicio que está basado en Web y que utilizará pro-
tocolos de Internet para el transporte.
6. La clase tiene el nombre Service de manera predeterminada. El nombre de clase pue-
de cambiarse siempre y cuando la referencia en el archivo ASMX también se modifique
(línea 8).
7. En la línea 12 se define un método Web al cual le especificamos una descripción in-
formativa de lo que hace. El método Web (WebMethod) se compone por una función
que recibe dos argumentos (números enteros) y devuelve un número entero, producto
de la suma de los dos argumentos que se proporcionen. En lugar de una simple suma,
usted puede recibir otro tipo de datos e incluso devolver objetos completos, como pue-
de ser un arreglo o una base de datos en memoria (DataSet).

➤ Prueba del Servicio Web XML desde el navegador


8. En Solution Explorer seleccione la página Service.asmx, del proyecto http://
localhost/Aritmetica/. Despliegue el menú contextual y seleccione View in brow-
ser. Aparecerá una página de consumo del servicio, que muestra el nombre de la cla-
se y una lista de los métodos codificados.
458 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. Aparecerá una lista de los métodos expuestos por el servicio, de acuerdo con la des-
cripción del mismo. Vea cómo aparece Suma con la descripción que colocamos en el
código para el método. Haga clic en el vínculo Suma. Aparecerá una interfaz que pre-
gunta los argumentos requeridos por el servicio.

10. En N1 proporcione el número 20, y en N2 proporcione el número 30. Haga clic en In-
voke. Con ello se realizará el procesamiento correspondiente y la respuesta se devol-
verá utilizando un paquete de datos mediante XML.

FIN DEL EJERCICIO *


Capítulo 14. Servicios Web XML 459

Ejercicio 14.2
14
Consumo programático de un Servicio Web XML desde
una aplicación Windows

En este ejercicio comprobará la forma en que se puede consumir programáticamente un


Servicio Web XML desde una aplicación que no es Web. Se requiere haber desarrollado el
ejercicio anterior.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Windows Application, llamado Consu-
meWS. Deberá aparecer un formulario en el diseñador de formularios, que de manera
predeterminada recibe el nombre de Form1.
3. Diseñe una interfaz con los siguientes elementos: tres etiquetas (Label), tres cuadros
de texto (TextBox) y un botón (Button). Modifique las propiedades necesarias para
que la interfaz luzca de la siguiente manera:

Propiedad Valor a asignar

Form1.Text Consumo de servicio


Label1.Text N1:
Label2.Text N2
Label3.Text Suma:
TextBox3.ReadOnly True
Button1.Text Invocar Servicio Web XML
460 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Establecimiento de la referencia a un Servicio Web XML

4. Seleccione el proyecto ConsumeWS en Solution Explorer. Despliegue el menú contextual


y seleccione Add Web Reference, con lo que aparecerá la ventana Add Web Reference.

5. Desde la ventana Add Web Reference se pueden agregar referencias a Servicios Web
que se encuentran en la misma solución, en el equipo local o en los servidores UDDI
de la red local. Haga clic en el vínculo Web services in this solution. Con ello apare-
cerán los servicios Web disponibles en la solución.
Capítulo 14. Servicios Web XML 461

6. Cómo sólo tenemos definido un servicio en la solución, es lo único que aparece. Haga
clic en el vínculo del nombre del servicio, que se llama Service. Aparecerá el víncu-
lo hacia el servicio, la lista de métodos, así como el nombre de referencia del servidor
14
Web (localhost). Haga clic en el botón Add Reference para establecer la referencia
al recurso Web.

➤ Consumo programático de un Servicio Web XML

7. En modo de diseño, haga doble clic en el botón Invocar Servicio Web XML, a fin de co-
dificar el procedimiento de evento del botón. La codificación debe quedar como sigue:

Codificación de ConsumeWS – Form1.vb

1 Public Class Form1


2
3 Private Sub Button1_Click(ByVal sender As System.Object,
4 ByVal e As System.EventArgs) Handles Button1.Click
5
6 Dim wsAritmetica As New localhost.Service()
7 TextBox3.Text = wsAritmetica.Suma( _
8 CType(TextBox1.Text, Integer), _
9 CType(TextBox2.Text, Integer) )
10
11 End Sub
12
13 End Class
462 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de ConsumeWS

8. En la línea 6 se declara una variable objeto (wsAritmetica) a través de la cual podre-


mos utilizar la funcionalidad de la clase Service, que está disponible a través de la re-
ferencia localhost.
9. Ya que declaramos la variable, utilizamos a través de ella el método Web Suma(). Pa-
ra ello le asignamos el resultado del método a la propiedad Text de TextBox3 (línea
7). Vea cómo se coloca la variable de trabajo, el método Web y, entre paréntesis, los
argumentos que requiere el servicio.
10. Establezca el proyecto como proyecto de arranque. Guarde todos los cambios realiza-
dos en su solución e inicie la depuración (oprima la tecla F5). Proporcione los valores
20 y 30 en N1 y N2, y haga clic en Invocar Servicio Web XML.

11. Al hacer clic se invoca el Servicio Web XML, se le proporcionan los argumentos al mé-
todo Web y se utiliza el resultado del servicio.
12. Cierre la aplicación.
FIN DEL EJERCICIO *
Capítulo 14. Servicios Web XML 463

MAPA MENTAL DEL CAPÍTULO


14
464 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA
Add Web Disco.exe, 451 UDDI, 450 Discovery, 451
Reference, 460 Discovery Universal <WebMethod()>,
.ASMX, 454 document, 454 Description 454
binding, 452 message, 452 Discovery and WSDL, 452
Clase proxy, 453 portType, 452 Integration wsdl.exe
definitions, 452 service, 452 (UDDI), 450 XML Web Service,
Descubrimiento de Servicios Web XML, Web Service 447
servicio Web, 451 447 Description
Disco, 451 types, 452 Language, 452

PREGUNTAS
14.1 ¿Qué son los Servicios Web XML y cuáles son sus características principales?
14.2 ¿En qué consiste UDDI y para qué sirve?
14.3 ¿En qué consiste WSDL y para qué sirve?
14.4 ¿En qué casos se recomienda el uso de los Servicios Web XML?
14.5 Mencione en qué casos cree usted que podría utilizar Servicios Web XML en su ám-
bito profesional.
Capítulo 14. Servicios Web XML 465

Notas: 14
466 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Son bloques de código ejecutable expuestos a través de protocolos estándar para su uso en la Web
(XML / SOAP).
a) Servicios Web XML
b) XML Web Forms
c) Métodos de Servicio XML

2. Es un registro distribuido de información de los servicios Web XML ofrecidos por las compañías
desarrolladoras.
a) WSDL
b) DDL
c) UDDI

3. Proceso por medio del cual se localiza un Servicio Web XML y su descripción, de tal manera que es-
té disponible para los programas que consumen los Servicios Web XML.
a) Contrato Service Description
b) Descubrimiento del Servicio Web
c) DDL

4. Es el tipo de archivo que se genera al aplicar WSDL.EXE sobre un Servicio Web XML.
a) .wsdl
b) .wsdl y .disco
c) .vb y .cs

5. Es una entidad que actúa como intermediaria de otra entidad.


a) Service Description
b) Class
c) Proxy

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Los Servicios Web XML pueden ser ejecutados desde aplicaciones de Consola,
Windows y Web.

7. Los Servicios Web XML aprovechan el protocolo HTTP, SOAP y TCP/IP para dis-
tribuir la funcionalidad y paquetes de datos.

8. Para utilizar un Servicio Web es necesario registrarlo primero en UDDI.


9. Un Servicio Web sólo puede ser ejecutado desde el navegador de Internet.

10. Los Servicios Web son ideales para compartir, vía Web, funcionalidad sin necesi-
dad de interfases.
Capítulos:
15 Manejo de bases de datos
con ADO.NET
Parte 5
16 Manejo de bases de datos
desde aplicaciones Windows Manejo de Bases de datos
17 Manejo de bases de datos con ADO.NET
desde aplicaciones Web
18 Colecciones genéricas En esta parte del libro aprenderemos a desarrollar
(generics) aplicaciones que manejen bases de datos de alto
rendimiento.

Herramientas de Visual El objetivo principal es que aprenda a desarrollar


Studio revisadas: aplicaciones capaces de actualizar almacenes de
1. Server Explorer datos físicos, aprovechando al máximo las herra-
mientas que proporciona Visual Studio.
2. Query Designer
3. Output
En esta parte culmina todo lo aprendido en el li-
4. Data Sources bro: utilizamos la programación general en Visual
5. Command and Basic para la elaboración de los procesos y procedi-
Parameter Editor mientos, además de dar la estructura a las aplica-
6. Query Builder ciones; también utilizamos las técnicas para el de-
sarrollo de interfaces complejas Windows y Web;
trabajamos con Visual Studio al máximo, y pone-
Otras herramientas: mos en práctica la capacidad de entender el código
que la herramienta genera, gracias a nuestro cono-
1. ildasm.exe
cimiento del modelo de programación orientada a
2. Visual Studio 2005 objetos.
Command Prompt
Desarrollar actualizadores que insertan, modifican,
eliminan y muestran registros desde los tres princi-
pales tipos de interfaz (Consola, Windows y Web)
puede parecer pretencioso. La ventaja es que, en
cierta forma, es necesario ser pretencioso para lle-
gar hasta este punto.
Si en este mundo globalizado somos simples datos,
garantizar el almacenamiento fiel de los datos
de éstos significa garantizarnos un poco de
perpetuidad.
CAPÍTULO 15
Manejo de bases de datos
con ADO.NET
Objetivos: Aprenderá las generalidades del modelo de objetos de ADO.NET, y
aprenderá los diversos modos en que podemos trabajar con dicho modelo para
manipular y recuperar información de bases de datos.

1. Revisará el proceso evolutivo de las bases de datos, desde las librerías


nativas hasta ADO.NET
2. Conocerá las diferencias entre bases de datos conectadas y desconec-
tadas, y podrá decidir cuál es la estrategia óptima para sus aplicaciones.
3. Se familiarizará con el modelo de objetos ADO.NET
4. Conocerá las particularidades de los Data Provider Objects.
5. Conocerá las particularidades de los DataSet Objects.
6. Aprenderá a desarrollar aplicaciones de actualización de bases de datos
en forma conectada.

469
470 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Historia del acceso a los almacenes de datos . . . . . . . . . . . . . . . . . . . . . . . . . 472
Formas de trabajo con bases de datos en .NET . . . . . . . . . . . . . . . . . . . . . . . 477
Bases de datos conectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Bases de datos desconectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Modos de trabajo con ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Proveedores de datos de .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Uso de consultas y procedimientos almacenados con
Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
➤ Adiciónde una conexión a Server Explorer . . . . . . . . . . . 482
➤ Visualización de los datos de una tabla desde
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
➤ Adición de una vista a la base de datos con
Query Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
➤ Adición y prueba de un stored procedure con
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Modelo de objetos de ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
DataSet Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Cómo realizar la conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Objeto Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Miembros más utilizados en Connection . . . . . . . . . . . . . . . . . . . . . . . 497
Propiedad ConnectionString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Cerrado de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Proceso de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Establecimiento de una conexión a base de datos de
forma programática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Miembros más utilizados en Command . . . . . . . . . . . . . . . . . . . . . . . . 504
Tipos de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Tipos de ejecución de los comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Uso de comandos para ejecutar procedimientos
almacenados y uso de DataReader . . . . . . . . . . . . . . . . . . . . . . . 507
Altas, bajas, cambios y consultas en modo conectado . . . . . . . . 510
Consumo de cadenas de conexión de app.Config . . . . . . . . . . . . 514
➤ Compilación de un proyecto para liberación (Release) . 515
➤ Crackeado de un usuario y contraseña usando ILDASM . 516
➤ Adición de un archivo de configuración para la
aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
➤ Consumo de valores desde el archivo de configuración . 518
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Capítulo 15. Manejo de bases de datos con ADO.NET 471

ADO.NET
ADO.NET es un conjunto de clases que forman parte de la biblioteca de .NET Framework
y permite a las aplicaciones tener acceso a bases y otros almacenes de datos con fines de
lectura, adición o actualización, ya sea de manera conectada o desconectada.
ADO.NET no es un producto en sí mismo; forma parte de .NET Framework, pero es tal su
importancia que merece ser estudiado de manera particular. 15
Antes de entender la forma en que ADO.NET trabaja es necesario comprender que una ba-
se de datos sirve para almacenar y recuperar información. Surgen entonces dos preguntas:
¿Almacenarla dónde?, ¿recuperarla de dónde?
Independientemente de si trabajamos con Access, SQL Server, Oracle, Informix, MySQL
o cualquier otra base de datos del mercado, los datos terminan siempre en archivos que se
almacenan en diversos medios de almacenamiento permanente (disco duro, cinta, cartucho,
etcétera).
Los manejadores de bases de datos permiten administrar y organizar la estructura de las
bases de datos, facilitando la labor de almacenamiento, actualización y recuperación; sin
embargo, a fin de cuentas siempre terminamos con un archivo al que debemos leer y en el
que debemos escribir de una manera específica. A estos archivos les damos el nombre de
almacén de datos u orígenes de datos.
Los almacenes de datos pueden estar a nuestra disposición ya sea mediante el uso de sis-
temas manejadores de bases de datos (DBMS/Data Base Management System), programas
que proporcionan una interfaz de acceso al almacén de datos y que en la actualidad poseen
incluso lenguajes de manipulación de datos (DML/Data Manipulation Language), e inter-
faces gráficas intuitivas, llenas de asistentes y generadores de código. Ejemplos de este ti-
po de sistemas son Access, Visual FoxPro, SQL Server, Oracle, etcétera.
Otra forma de acceder a estos archivos es mediante programación, a través de componentes
y librerías que permiten el enlace con los almacenes de datos, así como su manipulación y
recuperación. Dependiendo de la tecnología que estemos utilizando, hablamos de librerías,
controladores y proveedores de datos. Ejemplos de esto son DAO, ADO, ADO.NET,
OLEDB, ODBC, etcétera.
472 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 15.1
Manejo de bases
de datos mediante
programación.

Dado el carácter de este libro, nos interesa el acceso a los almacenes de datos de manera pro-
gramática, a través de componentes y librerías, y específicamente utilizando ADO.NET.
Para todo desarrollador profesional, en su labor de desarrollo de aplicaciones amplias pa-
ra organizaciones, es indispensable saber hacer que una interfaz de usuario se comunique
con almacenes de datos mediante programación; esto lleva a la necesidad de conocer los
elementos del lenguaje que permitan manipular las bases de datos. En el caso de .NET, es
necesario familiarizarse con el modelo de objetos ADO.NET, que precisamente sirve para
eso.
A través de programación es posible crear accesos rápidos, eficientes y confiables. Cierta-
mente no seremos los primeros en intentarlo, pero sí los que menos problemas enfrentare-
mos para hacerlo, ya que ADO.NET es una plataforma sorprendentemente potente y sen-
cilla; además, si disponemos de Visual Studio, la codificación se realiza prácticamente
sola. La historia nos dice que somos afortunados; muchos quisieron ver lo que nuestros
ojos están por ver.

Historia del acceso a los almacenes de datos


Realicemos un breve recorrido por las diferentes formas en que hemos tenido acceso a los
datos desde una interfaz de usuario.
Capítulo 15. Manejo de bases de datos con ADO.NET 473

FIGURA 15.2
Cronología de
los manejadores
de base de datos.

Historia de
15
acceso a los
almacenes de
datos

Década de 1990 Década de 2000

Librerías nativas de acceso a datos. Al principio, la diferencia entre plataformas y la


diversidad de medios de conexión no era problema porque no había alternativas. El acce-
so a las bases de datos se realizaba a través de librerías nativas que funcionaban sólo para
un manejador de base de datos específico en una plataforma operativa específica. Ejemplos
de ello fueron DBLib para SQL Server y OCI (Oracle Call Interface) para Oracle. Las li-
brerías nativas son librerías ejecutables de tecnología propietaria que sirven para enlazar
a un solo tipo de almacén de datos en particular en una plataforma específica.
El enlace con las bases de datos era tan rápido como limitado; en virtud de que no había
intermediación entre base de datos y código nativo, el acceso a la base de datos era direc-
to y, por tanto, muy veloz. Sin embargo, las librerías funcionaban sólo con el manejador
de base de datos específico en una plataforma operativa; otra desventaja era que el desa-
rrollador debía aprender a manejar tantas librerías nativas como manejadores de bases de
datos utilizara en su aplicación. Si por alguna razón el usuario decidía usar otro manejador
de bases de datos, no sólo se tenía que cambiar el manejador, sino también era necesario
modificar el código fuente de las aplicaciones, lo que en ocasiones generaba una inversión
alta en tiempo y dinero. Ésa fue la razón por la que muchas empresas no cambiaban ma-
nejador de base de datos, aun cuando no fuera el más adecuado para su negocio.
ODBC. Al inicio de la década de 1990, Microsoft y otras empresas desarrollaron un es-
tándar, denominado ODBC (Open Data Base Connectivity/Conectividad abierta de bases
de datos). La idea era proporcionar una capa de acceso a datos común a través de la cual
474 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

pudiera tenerse acceso a cualquier motor de base de datos, siempre y cuando estuviera ba-
sada en el modelo relacional. Dichos motores, llamados motores de base de datos relacio-
nales (RDBMS/Relational Data Base Management System), tales como SQL Server, Ora-
cle, e Informix, utilizarían para el enlace unos controladores ODBC (ODBC drivers) que
servían como protocolos de comunicación entre las aplicaciones y la base de datos.
ODBC agregó un elemento intermedio entre la base de datos y las aplicaciones, llamado
Manejador de controladores ODBC (ODBC Driver Manager), que se ocupaba de cargar y
administrar los controladores ODBC.
En ese contexto, la aplicación se comunicaba mediante instrucciones de bajo nivel con el
manejador de controladores ODBC, quien a su vez se comunicaba con la base de datos a
través de las API (Application Programming Interface), que constituyen un conjunto de de-
finiciones que permiten a un programa comunicarse con otro. En teoría, si se cambiaba el
manejador de base de datos, por ejemplo de Oracle a SQL Server, ya no sería necesario
cambiar el código de la aplicación, dado que bastaría con utilizar un controlador distinto.
Cambiar de manejador de base de datos sería como cambiar la impresora o el monitor: se
conecta el dispositivo, se instalan los controladores y listo.

NOTA
Esto es sólo en teoría, ya que los manejadores de base de datos admiten diferentes dialectos
del lenguaje SQL, como ya veíamos en el capítulo anterior, lo que no permite una compatibi-
lidad tan transparente.

Con ODBC nace el concepto de orígenes de datos, que vienen siendo el acceso a almace-
nes de datos por intermediación de un manejador de controladores, y el uso de un contro-
lador.
Con respecto a la velocidad de acceso, el que se agregara una capa de intermediación entre
la aplicación y la base de datos, naturalmente, redujo un poco la rapidez.
DAO. Lenguajes como C++ facilitaban el trabajo de bajo nivel que requería ODBC. En
cierta forma, el proceso de interacción con el manejador de controladores ODBC era algo
natural. Sin embargo, con la aparición de Visual Basic surgió la necesidad de comunicar-
se con las bases de datos en un ambiente más orientado a objetos, capaz de asumir muchas
cosas.
ODBC era demasiado complejo de implementar en un ambiente de desarrollo cuyo princi-
pal atractivo era la simplicidad. En la versión 3 de Visual Basic apareció DAO (Data Ac-
cess Objects), que proporcionaba un modelo de objetos que permitía tener acceso con el
motor de base de datos Jet, la tecnología utilizada por Microsoft Access.
Capítulo 15. Manejo de bases de datos con ADO.NET 475

Aun cuando era posible tener acceso a bases de datos en Access a través de ODBC, DAO
rápidamente cobró popularidad; en primer lugar, porque era mucho más sencillo, de acuer-
do con la filosofía de desarrollo de Visual Basic, y segundo, debido a que por ser un mo-
tor optimizado para Jet, era (y sigue siendo) la forma más rápida de tener acceso a las ba-
ses de datos en Access.
Aunque está optimizado para bases de datos basadas en Jet (Access), DAO también acep-
ta otras bases de datos a través de ODBC. De esa forma, se dispone de la simplicidad de
DAO y el poder de ODBC.
15
RDO. El problema con DAO es que al querer utilizarlo con bases de datos no basadas en
Jet, es decir, cuando utilizaba orígenes de datos ODBC, se volvía muy lento.
Buscando remediar eso, Microsoft creó RDO (Remote Data Objects), que es un modelo de
objetos similar a DAO pero optimizado para ODBC.
No obstante los cambios, la velocidad de conexión no mejoró mucho. Sólo se logró tener
un poco menos de los mismos problemas.
OLE DB. Para resolver el problema de la velocidad, ya en un contexto lleno de diferentes
manejadores de bases de datos y condiciones de conectividad, surgió OLE DB.
OLE DB es similar a ODBC, en el sentido de que utiliza una especie de controladores,
llamados proveedores de datos (OLE DB Providers), que implementaban un conjunto de
interfaces COM que permitían el acceso a las bases de datos en un formato estándar
de línea-columna. A las aplicaciones que utilizan OLE DB se les denomina OLE DB Con-
sumer.
En un esquema COM, OLE DB extendió el número de servicios disponibles para el mane-
jo de los datos a través de librerías de fácil utilización, permitiendo el manejo de transac-
ciones, persistencia de datos, manipulación de parte del cliente, conjuntos de registros je-
rárquicos, etcétera.
Con OLE DB, Microsoft estableció su estrategia UDA (Universal Data Access), que por
primera vez reconocía que los datos no sólo pueden estar en bases de datos, sino en mu-
chos otros lugares y formatos como mensajes de correo electrónico, hojas electrónicas, ar-
chivos de texto simple, etcétera.

NOTA
En este libro optamos por enfocarnos en los almacenes de datos por esta razón. No siempre
hablamos de bases de datos; podemos hablar también de archivos de texto u hojas electróni-
cas, por ejemplo. Todas las bases de datos son almacenes de datos, pero no todos los almace-
nes de datos son bases de datos.
476 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La desventaja de OLE DB es que seguía siendo complejo; por tratarse de una interfaz ba-
sada en COM, su manejo implicaba la interacción con librerías y no con un modelo de ob-
jetos sencillo, que formara parte del sistema operativo.
ADO.ADO (ActiveX Data Objects) es un OLE DB Consumer que proporciona acceso a
los orígenes de datos OLE DB a través de un modelo de objetos sencillo. Brinda la velo-
cidad de OLE DB, sin la complejidad derivada de lidiar con librerías COM, ya que propor-
ciona un modelo de objetos tan sencillo como DAO.
La desventaja de ADO, no obstante su potencia, flexibilidad y sencillez sigue siendo la ve-
locidad; no debemos olvidar que agrega una capa de intermediación, adicional a la que
agrega OLE DB, por lo que entre la aplicación y la base de datos está ADO y OLE DB,
que hacen más lento el enlace.
ADO.NET. Como ya lo definimos, es un conjunto de clases que forman parte de la biblio-
teca de clases de .NET Framework, y que permiten a las aplicaciones tener acceso a bases
de datos y otros almacenes de datos con fines de lectura, adición o actualización de datos,
ya sea de manera conectada o desconectada.
ADO.NET permite el enlace con los almacenes de datos a través de los proveedores de da-
tos de .NET (.NET Data Providers). Estos controladores están diseñados para aligerar el pe-
so de las capas que hay entre el almacén de datos y la interfaz, lo que mejora el desempeño.
Dentro de las ventajas que ofrece ADO.NET, están las siguientes:

❑ Maneja copias locales de datos y permite el manejo de bases de datos desconectadas.


❑ Utiliza XML como formato para la transmisión de datos entre el almacén de datos y la
copia local de datos; esto garantiza que los datos son autodescriptivos.
❑ Proporciona un modelo de objetos que permite programar de manera sencilla el mane-
jo de bases de datos.
❑ La capacidad de manejar bases de datos desconectadas permite sustentar de manera efi-
ciente las aplicaciones de computación móvil.
❑ El esquema de bases de datos desconectadas permite una mayor escalabilidad debido a
que el uso de recursos es por petición, y no constante y concurrente.
❑ Maneja sus propios controladores de datos, que con el tiempo se irán mejorando para
que su rendimiento sea mejor.

Además, la versión 2.0 de ADO.NET ofrece lo siguiente:

❑ MARS (Multiple Active Result Sets). Permite tener abiertos más de un conjunto de re-
gistros en una misma conexión abierta (no sólo uno, como sucedía en versiones 1.0 y
1.1).
❑ Operaciones asíncronas. A través de nuevos métodos disponibles para las cases Con-
nection y Command, es posible ejecutar operaciones de dos vías (asíncrónicas).
Capítulo 15. Manejo de bases de datos con ADO.NET 477

❑ Actualizaciones por lotes (batch updates). Es posible reproducir en el almacén de datos


físico las afectaciones realizadas a un conjunto de registros de una base de datos desco-
nectada. Anteriormente los cambios se reproducían registro por registro.

Formas de trabajo con bases de datos


en .NET 15
Bases de datos conectadas
Durante mucho tiempo, las aplicaciones de bases de datos podían ser de una sola forma:
conectadas.
Una base de datos conectada es la forma de acceso a base de datos en la cual la aplicación
está continuamente conectada al almacén de datos. Este modo de trabajo obedece al mo-
delo petición respuesta, clásico del esquema Cliente/Servidor.
Las ventajas de una base de datos conectada son:

❑ La seguridad del acceso a los datos es fácil de mantener.


❑ El acceso concurrente a los datos es fácil de controlar.
❑ Los datos se encuentran actualizados todo el tiempo.

Las desventajas de una base de datos conectada son:

❑ La conectividad entre la aplicación y la base de datos debe ser permanente.


❑ Cada conexión a la base de datos requiere recursos para ser mantenida, lo que implica
que la escalabilidad no es muy buena. Cada conexión utiliza recursos, independiente-
mente de si se están realizando operaciones con la base de datos o no.

Las bases de datos conectadas se recomiendan para aquellas aplicaciones en donde los da-
tos actualizados en tiempo real son críticos, en donde se tienen usuarios concurrentes y
donde la información debe estar actualizada para todos todo el tiempo, como puede ser un
sistema bancario, un sistema de control de la producción o un sistema financiero para el
control de movimientos en la bolsa.
478 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 15.3
Forma de trabajo
con bases de
datos conectadas.

La forma de trabajo es muy similar a la forma en que trabaja actualmente el modelo clien-
te/servidor:

1. En el momento en que se requiere interactuar con el almacén de datos se establece una


conexión.
2. Al abrir una conexión, se envía al manejador de bases de datos una instrucción SQL u
otra que se desee ejecutar en el servidor.
3. El servidor ejecuta la instrucción y, en su caso, devuelve datos a través de la conexión
que se encuentra todavía abierta.
4. Al haberse concluido el trabajo, la conexión se cierra.

Bases de datos desconectadas


Con el uso de Internet, la escalabilidad se vio comprometida en los esquemas de bases de
datos conectadas; simplemente, no era posible escalar los servidores de base de datos de-
bido a que el modelo de base de datos no era eficiente en el manejo de conexiones concu-
rrentes. En una aplicación en Internet no sabemos cuántos usuarios desearán conectarse (y
mantenerse conectados).
De esto derivan las bases de datos desconectadas, aplicaciones de base de datos en las cua-
les la aplicación y el almacén no están permanentemente conectados. En este esquema, la
aplicación toma sólo el conjunto de datos mínimos que requiere para trabajar y los almace-
na en una memoria temporal (caché) en su equipo. Sobre esos datos, la aplicación realiza
consultas y modificaciones; cuando termina, se procede a actualizar el almacén de datos.
Las ventajas del esquema desconectado son:

❑ Se puede trabajar todo el tiempo, sin la preocupación de estar consumiendo recursos en


el servidor, pues el acceso a las bases de datos es por petición.
❑ Mientras no utilizamos la conexión, otros usuarios pueden hacer uso de ella.
❑ La escalabilidad se mantiene de manera eficaz, ya que el uso concurrente de la base de
datos se mantiene al mínimo.
Capítulo 15. Manejo de bases de datos con ADO.NET 479

Las desventajas de las bases de datos desconectadas son:

❑ Los datos no están permanentemente actualizados.


❑ Los conflictos relacionados con la modificación de los mismos datos por diferentes
usuarios deben resolverse, de tal forma que no se pierdan transacciones.

Las bases de datos desconectadas se recomiendan para aquellas aplicaciones donde la ac-
tualización de datos que realizan los usuarios no es necesariamente concurrente, donde no
se requiere la información actualizada todo el tiempo y donde se tienen pocos recursos de
15
cómputo y almacenamiento. Por ejemplo, en el caso de una agenda en línea, correo elec-
trónico, control de gastos personales y en toda la gama de aplicaciones ideales para dispo-
sitivos móviles, como celulares o palm-tops.

FIGURA 15.4
Forma de trabajo
con bases de da-
tos desconectada.

La forma en que trabaja el esquema desconectado es muy distinta a la forma de trabajar ba-
jo el modelo cliente/servidor. Para empezar, no es necesario que exista un almacén de da-
tos, aunque lo común es que sí exista.
En este esquema:

1. Se realiza una conexión, de igual forma que en esquema conectado.


2. La aplicación, en lugar de ejecutar instrucciones sobre el almacén de datos, toma el
conjunto de datos mínimos que la aplicación requiere para trabajar.
3. Se cierra la conexión.
480 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

4. Los datos extraídos se almacenan en una memoria temporal (caché) en el equipo que
hizo la petición (copia local de datos).
5. Sobre la copia local de datos, la aplicación realiza consultas y modificaciones.
6. Cuando así se considere oportuno, se reproducen en el almacén de datos las modifica-
ciones realizadas en la copia local.

Modos de trabajo con ADO.NET


Dependiendo el uso que hagamos de los Data Provider Objects y los DataSet Objects, po-
demos distinguir los siguientes modos de trabajo con ADO.NET:

❑ Modo conectado. Si trabajamos sólo con objetos que pertenecen a Data Provider
Objects, utilizando una conexión a un almacén de datos para cada operación que reali-
cemos.
En este esquema no se aprovechan los principios del modelo relacional, ya que sólo se
trabaja con matrices bidimensionales de datos (filas/columnas); la definición de llaves,
relaciones y dependencias entre tablas debe ser manejada de manera programática.
❑ Modo parcialmente conectado. Cuando trabajamos con Data Provider Objects y
DataSet Objects; en este modo se establece una conexión con el almacén de datos para
leer datos y definiciones, y cargarlos en DataSet; una vez que tenemos una copia de los
datos en memoria local, trabajamos con los datos ya en el DataSet. Cuando hemos con-
cluido las modificaciones a los datos, actualizamos el almacén de datos, de tal forma
que considere las modificaciones realizadas en el DataSet.
En este esquema se aprovecha la capacidad de almacenamiento de los manejadores de
bases de datos, así como sus definiciones del modelo de datos; además, se aprovecha la
compatibilidad de DataSet con el modelo relacional por parte del cliente, por lo que las
llaves, relaciones y dependencias que se tienen en el manejador de bases de datos pue-
den ser reproducidas de manera local.
❑ Modo totalmente desconectado. Es cuando trabajamos sólo con objetos que per-
tenecen a DataSet Objects y no establecemos conexión alguna con los almacenes de da-
tos. Generalmente el trabajo en este modo es virtual, para efectos de procesamiento.
En este esquema se aprovecha la compatibilidad con el modelo relacional que tiene Da-
taSet, pero como no hay enlace con ningún almacén de datos, no se pueden adquirir de-
finiciones y se hace necesario programar todas las especificaciones del modelo de da-
tos de manera local.

Los capítulos siguientes se especializan en cada uno de los diferentes modos de trabajo; se
hará especial énfasis en el modo parcialmente conectado, pues es el modo más frecuente
de trabajo, tanto en aplicaciones Web como en aplicaciones de escritorio y cliente/servidor.
Capítulo 15. Manejo de bases de datos con ADO.NET 481

Esta preferencia por el modelo parcialmente conectado no es una casualidad, ya que en él


convive el manejador de bases de datos y ADO.NET, obteniéndose lo mejor de los dos
mundos.

Proveedores de datos de .NET Framework


Un proveedor de datos .NET Framework (.NET Framework Data Provider) es un conjun- 15
to de clases de .NET Framework que permiten la conexión a una base de datos en particu-
lar, así como la ejecución de comandos sobre ésta y la recuperación de datos. El acceso a
las bases de datos a través de ADO.NET se lleva a cabo de manera optimizada, de tal ma-
nera que se utiliza la mínima intermediación posible, al mismo tiempo que se proveen re-
cursos para el manejo de datos en un esquema orientado a objetos.
.NET Framework incluye los siguientes proveedores de datos:

Proveedor Uso en

.NET Framework Data Provider for SQL Server proporciona el acceso a bases de
datos Microsoft SQL Server 7.0 y posteriores.
Namespace: System.Data.SqlClient
.NET Framework Data Provider for OLE DB Proporciona el acceso a bases de datos
expuestas a través de OLE DB. Se reco-
mienda para el acceso a SQL Server 6.5 y
Access.
Namespace: System.Data.OleDb
.NET Framework Data Provider for ODBC Proporciona el acceso a bases de datos
expuestas a través de ODBC.
Namespace: System.Data.Odbc
.NET Framework Data Provider for Oracle Proporciona el acceso a bases de datos
Oracle versión 8.1.7 y posteriores.
Namespace: System.Data.OracleClient

Prácticamente es posible conectarse desde .NET a cualquier plataforma de bases de datos.


Los proveedores de datos de .NET Framework permiten interactuar con los manejadores de
bases de datos utilizando Visual Studio como herramienta de desarrollo y depuración, in-
cluso en ambientes que no son de programación.
482 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 15.1
Uso de consultas y procedimientos almacenados con Server Explorer

Aprenderá a utilizar la herramienta Server Explorer.


1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).

➤ Adición de una conexión a Server Explorer

2. Abra la herramienta Server Explorer, que permite establecer conexión a bases de da-
tos en tiempo de diseño. Seleccione la opción View - Server Explorer (oprima las te-
clas CTRL-ALT-S). Aparecerá la siguiente herramienta:

FIGURA 15.5
Server Explorer.

3. La herramienta tiene su propia barra de herramientas, que incluye botones para refres-
car el árbol de conexiones, detener el proceso de refrescado y establecer la conexión a
una base de datos.
4. Suponga que tiene una instancia de SQL Server de nombre APRENDAWS. Imagine que
quiere establecer una conexión con la base de datos de prueba Pubs y que se enlazará
utilizando la cuenta de administración sa, cuya contraseña es secreto.
5. Ésta es una parte del diagrama de entidad relación de la base de datos Pubs:
Capítulo 15. Manejo de bases de datos con ADO.NET 483

15

6. Las tablas contienen lo siguiente:

Tabla Resumen de contenido

titles Contiene información de los títulos (libros) que pueden ser comer-
cializados.
publishers Contiene la información de las casas editoriales que comercializan
los títulos.
employee Contiene la información de los empleados de las casas editoriales.
jobs Contiene la información de los puestos de trabajo que los empleados
de las editoriales pueden tener.
authors Contiene la información de los autores que tienen obras publicadas.
titleauthor Contiene la información de qué autores escribieron qué títulos.
sales Contiene la información de las ventas de los títulos.
stores Contiene la información de los establecimientos (tiendas/librerías)
en donde se realizan las ventas de los títulos.
484 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7. Haga clic en el botón Connect to Database de la barra de herramientas de


Server Explorer. Aparecerá un asistente para la conexión.

8. En Data source especifique el tipo de proveedor de datos con el que desee trabajar. En
este caso utilizaremos SqlClient, dado que nos estamos enlazando a una base de da-
tos SQL Server 2000. En Server name especifique el nombre de la instancia a la que
desea enlazarse, que en este caso es APRENDAWS. En Log on to the server seleccione el
uso de autenticación basada en SQL Server (Use SQL Server Authentication); escriba
en User name la cuenta sa y en Password secreto. En Connect to a database, espe-
cifique en Select or enter a database name el nombre de la base, Pubs. Proporciona-
dos estos datos, haga clic en el botón Test Connection, con lo que comprobará si la in-
formación que ha proporcionado es correcta. Si todo es correcto, aparecerá un mensaje
de alerta como el siguiente:
Capítulo 15. Manejo de bases de datos con ADO.NET 485

9. La base de datos y todos los elementos manejables a través de Visual Studio son mos-
trados en el árbol de conexiones.
15

➤ Visualización de los datos de una tabla desde Visual Studio

10. Uno de los aspectos más sobresalientes de Visual Studio es que se integra de manera
plena con algunos manejadores de bases de datos, como es el caso de SQL Server.
11. Seleccione en el árbol de conexiones el nodo correspondiente a la tabla authors de la
base de datos Pubs. Despliegue el menú contextual y seleccione Show Table Data. Con
ello se deberá mostrar y editar los datos de la tabla seleccionada.
486 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Cierre el documento donde aparecen los resultados de la consulta.

➤ Adición de una vista a la base de datos con Query Designer

13. En el árbol de conexiones seleccione el nodo Views de la base de datos Pubs. Despliegue
el menú contextual y seleccione Add New View. Realizaremos una vista que contenga
la consulta de un listado de ventas, en donde aparezca el nombre de la tienda (stores.
stor_name), el título vendido (titles.title), el precio unitario (titles. price), la
cantidad vendida (sales.qty) y el monto de la venta (sales.qty * titles.price)
de las ventas realizadas en el estado de California (stores.state=’CA’). Inicialmen-
te aparecerá la ventana Add Table, en donde se seleccionan todas las tablas involucra-
das; en nuestro caso son stores, titles y sales. Seleccione cada una de las tablas
haciendo clic sobre el nombre de la misma y luego en Add. Cuando haya agregado to-
das, haga clic en Close. También puede presionar la tecla Ctrl mientras selecciona las
tres tablas. Haga clic en los botones Add y Close.
Capítulo 15. Manejo de bases de datos con ADO.NET 487

14. Aparecerá el asistente de consultas (Query Designer), en el que se seleccionarán sólo


los campos que nos interesan: stores.stor_name, titles.title, stores.state,
titles.price, sales.qty.

FIGURA 15.6
Query Designer.

15

15. Los cambios que realice en la selección visual de columnas se reflejarán de manera au-
tomática en los atributos de columna y en la instrucción SQL.
16. En los atributos de columna, en el atributo Filter del campo state, escriba la condi-
ción «= ‘CA’». Vea cómo la instrucción SQL cambia automáticamente.

17. Ahora agregaremos el campo calculado a nuestra consulta. En los atributos de colum-
na, después de la columna state, escriba sales.qty*titles.price en Column y Ven-
tasTotales en el atributo Alias.
488 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Revise la sintaxis, haciendo clic en el botón Verify SQL Syntax .


19. Ejecute la consulta haciendo clic en el botón Execute SQL , para ver si los resul-
tados son correctos. Los resultados deben aparecer en el área de resultados.

20. Si todo está correcto, guarde la vista en la base de datos, oprimiendo las teclas Ctrl-S
y asignando el nombre de VentasCA.

21. Cierre Query Designer.


22. Compruebe que en la base de datos ya se ha agregado una vista más.

➤ Adición y prueba de un stored procedure con Visual Studio

23. Visual Studio es una excelente herramienta para la edición de procedimientos almace-
nados, conocidos también como Stored Procedures, que son instrucciones precompi-
ladas de SQL que se almacenan en la misma base de datos. Una de sus mayores ven-
tajas es que podemos agregar puntos de interrupción en el código, así como probar los
procedimientos de una manera sencilla.
24. Realizaremos un procedimiento almacenado que devuelva las ventas realizadas en un
estado determinado.
25. Seleccione en el árbol de conexiones el nodo Stored Procedures de la base de datos
Pubs. Despliegue el menú contextual y seleccione Add New Stored Procedure.
26. Aparecerá, precodificado en Text Editor, un procedimiento almacenado.
Capítulo 15. Manejo de bases de datos con ADO.NET 489

15

27. Modifique el código para que quede como el siguiente. Vea cómo Text Editor delimi-
ta las instrucciones SQL mientras codifica.

Codificación de dbo.StoredProcedures.AprendaWS.Pubs.

1 CREATE PROCEDURE dbo.TitulosVendidosEstado


2 (
3 @state char(2)
4 )
5 AS
6 BEGIN
7 select titles.title from sales, titles, stores
8 where titles.title_id = sales.title_id and
9 sales.stor_id = stores.stor_id and
10 stores.state = @state
11
12 END
13
14 RETURN

28. El procedimiento espera que se proporcione como parámetro el estado del que se de-
sea obtener información (línea 3). Con base en ello, se extraerán los nombres de los
títulos que hayan sido vendidos en el estado proporcionado. Al guardar el procedi-
miento almacenado (oprima las teclas Ctrl-S) se realizará una verificación de sintaxis
y se almacenará el procedimiento en la base de datos. La instrucción cambiará auto-
máticamente, de CREATE PROCEDURE a ALTER PROCEDURE, para futuros cambios.
490 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA
Para adquirir el dominio en la codificación de procedimientos almacenados, adquiera el libro
Aprenda Practicando Microsoft SQL Server 2000, del mismo autor de esta obra, en donde se
aborda la programación avanzada de Transact SQL, así como la administración básica de ba-
ses de datos SQL Server.

29. Colóquese en cualquier parte del procedimiento almacenado que esté editando y des-
pliegue el menú contextual, seleccionando la opción Execute.

30. Como el procedimiento almacenado requiere valores en los parámetros, se desplegará


la ventana Run Stored Procedure, solicitando los valores correspondientes. Proporcio-
ne como valor CA y haga clic en Ok.
Capítulo 15. Manejo de bases de datos con ADO.NET 491

31. La consulta se realizará, mostrando el resultado en Output de Visual Studio.

15

32. Cierre Text Editor.


FIN DEL EJERCICIO *

Modelo de objetos de ADO.NET


El modelo de objetos de ADO.NET se divide en dos grandes bloques:

❑ Data Provider Objects. Son aquellos objetos que se encargan del manejo eficiente
del flujo de datos desde el almacén de datos hasta la copia local de datos (caché).
❑ DataSet Objects. Son aquellos objetos que, una vez que se tiene la copia local de da-
tos, permiten agregar, modificar o recuperar información de la copia local de manera
desconectada. Para el uso de estos objetos se requiere la compatibilidad con XML de
.NET Framework.

Los DataSet Objects son útiles sólo si pretende manejar bases de datos desconectadas (lo
que no es siempre necesario en una aplicación).
La primera decisión que debe llevar a cabo al momento de desarrollar una aplicación con
manejo de base de datos es determinar si requiere o no manejar bases de datos desconecta-
das. En caso de optar por la respuesta afirmativa, identifique en qué funciones de la aplica-
ción serán utilizadas.
El manejo de bases de datos desconectadas es muy potente, pero también es complejo y exi-
ge un volumen considerable de recursos.
492 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Data Provider Objects


Los objetos relacionados con los controladores de datos .NET, llamados Data Provider
Objects, son aquellos que se encargan de la comunicación de paquetes de datos entre el al-
macén de datos y la copia local de datos (a utilizar de manera desconectada).
Estos objetos se encargan de respetar los convencionalismos de la base de datos, de comu-
nicarse con ella en el formato en que ésta reconozca los paquetes de datos, generando una
copia local de datos en el cliente de la aplicación.

FIGURA 15.7
DataProvider
Objects.

Básicamente, los Data Provider Objects de ADO.NET son los siguientes:


Objeto Función

Connection Permite establecer la conexión con un almacén de datos.


Se debe definir un objeto Connection por cada enlace a almacén de datos
requerido por la aplicación. Los objetos DataReader, DataAdapter y
Command requieren de un objeto Connection para funcionar.

Command Ejecuta comandos SQL y, opcionalmente, devuelve datos del almacén


de datos.
Se requiere un objeto Command para cada instrucción a enviar al almacén
de datos. DataReader requiere de un objeto Command para realizar la lec-
Capítulo 15. Manejo de bases de datos con ADO.NET 493

tura; DataAdapter requiere un objeto Command por cada operación a


realizar (SELECT, INSERT, UPDATE y DELETE). En caso de que Data
Adapter no realice alguna de las operaciones de actualización, no
será necesario definir Command.
DataReader Permite generar un flujo de datos (data stream) de sólo lectura con el
almacén de datos.
El objeto DataReader se puede utilizar para lecturas sólo hacia delante; 15
no es requerido por ningún objeto, por lo que su uso es opcional.
DataAdapter Permite generar un flujo de datos (data stream) de lectura/escritura entre
la copia local de datos y el almacén de datos. Se encarga de cargar
datos del almacén de datos en el DataSet (SELECT) y de reproducir
en el almacén de datos los cambios realizados en el DataSet (INSERT,
UPDATE, DELETE) de manera desconectada. Se requiere si se desea
la interacción entre un DataSet y un almacén de datos.

En el momento en que DataReader o DataAdapter poseen datos, ya se tiene una copia lo-
cal de datos en el equipo cliente.
Los Data Provider Objects son llamados así porque, dependiendo del proveedor o contro-
lador de datos que se utiliza, se les antepone un prefijo que determina su origen.

Para SQL Server Para otras bases Para Oracle


Objeto (SqlClient) de datos (OleDb) (Oracle)

Connection SqlConnection OleDbConnection OracleConnection

DataReader SqlDataReader OleDbDataReader OracleDataReader

DataAdapter SqlDataAdapter OleDbDataAdapter OracleDataAdapter

Command SqlCommand OleDbCommand OracleCommand

En manuales y guías de estudio, suele referirse a los objetos como xxxCommand o xxx-
DataReader, de tal forma que, en caso de que aparezcan nuevos controladores y provee-
dores de datos, usted sólo tenga que aprender el prefijo que desea aplicar, aprovechando
así el conocimiento del modelo de objetos que ya tiene.
Dependiendo del controlador de datos .NET que se desee utilizar, el nombre de los obje-
tos varía.
494 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Además de estos objetos, .NET Framework también provee los siguientes objetos relacio-
nados con el proveedor de datos (dependiendo del manejador de bases de datos utilizados,
estarán disponibles o no).

Objeto Función

Transaction Permite listar comandos como parte de una transacción


para el origen de datos.
CommandBuilder Permite generar automáticamente propiedades de comandos
y parámetros, con base en la información de DataAdapter.
ConnectionStringBuilder Permite crear y manejar cadenas de conexión.
Parameter Define valores de entrada, salida y retorno para comandos
y procedimientos almacenados.
Exception Representa errores que ocurren en el origen de datos.
Error Expone información de los errores que ocurren en el
origen de datos.
ClientPermission Permite establecer los atributos de seguridad y control de
acceso a los recursos de datos.

DataSet Objects
El hecho de que se tenga un flujo de datos con el almacén de datos no implica que poda-
mos manejar los datos tal y como si dispusiéramos de la base de datos en nuestro equipo.
Para poder hacerlo, requerimos de un conjunto de objetos que nos permitan disponer de la
copia local de datos, con todas las particularidades de una base de datos; nos referimos a
DataSet Objects.
DataSet se compone de un conjunto de datos locales de parte del cliente y permite operar
sobre ellos con toda la funcionalidad de un manejador de base de datos, lo cual posibilita
la adición y modificación de registros, y la realización de consultas, por ejemplo, respetan-
do las reglas de las bases de datos originales y con la ventaja de que todo sucede de mane-
ra desconectada.
Si lo que vamos a desarrollar son aplicaciones conectadas, tal y como lo habíamos hecho
siempre, probablemente DataSet no nos resultará tan maravilloso. Sin embargo, creemos
que al igual que todo el mundo, usted tiene interés en las aplicaciones Web y, por tanto, le
interesan las bases de datos desconectadas.
Capítulo 15. Manejo de bases de datos con ADO.NET 495

Si usted conoce las bases de datos relacionales, verá que DataSet y sus objetos asociados
son prácticamente una base de datos relacional.

FIGURA 15.8
DataSet Objects.

15

Básicamente, los DataSet Objects son los siguientes:

Objeto Función

DataSet Representa la copia local y desconectada de datos, residentes en memoria.


Se requiere un objeto DataSet por cada modelo de datos a representar
de manera local.
DataTable Representa una tabla dentro del modelo de datos. Se organiza a través
de la colección Tables, que depende de DataSet.
Se requiere un objeto DataTable por cada tabla del modelo de datos a
representar de manera local.
DataView Representa una vista personalizada de los datos de un DataTable, per-
mitiendo ordenamiento, filtrado, búsqueda, edición y navegación.
DataColumn Representa una columna o campo perteneciente a una tabla determinada.
Se organiza a través de la colección Columns, que depende de DataTable.
Se requiere un objeto DataColumn por cada columna o campo del modelo
de datos a representar de manera local.
DataRow Representa una fila o un registro perteneciente a una tabla determinada.
Se organiza a través de la colección Rows, que depende de DataTable.
496 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se requiere un objeto DataRow por cada registro del modelo de datos a


representar de manera local.
Constraint Representa una restricción de valor único o llave foránea, que se aplica
a una tabla determinada. Se organiza a través de la colección Cons-
traints, que depende de DataTable.

Se requiere un objeto Constraint por cada restricción de valor único


(generalmente, esto es aplicable a las llaves primarias, aunque no nece-
sariamente), y también uno por cada llave foránea definida en el modelo
de datos a representar de manera local.
DataRelation Representa una relación entre tablas. Se organiza a través de la colec-
ción Relations, que depende de DataSet.
Se requiere un objeto DataRelation por cada relación entre tablas
existente en el modelo de datos a representar de manera local.

DataSet se apoya fuertemente en el manejo de colecciones. Como todas las colecciones,


se puede referir el contenido a través de Items o bien, señalando el identificador de ele-
mento que corresponda de manera explícita.

Cómo realizar la conexión


Realizar la conexión consiste en establecer un enlace para el flujo de datos entre el alma-
cén de datos y el modelo de objetos de ADO.NET. Para realizarlo, requerimos el objeto
Connection, que forma parte de los Data Provider Objects.

Objeto Connection

El objeto Connection sirve para establecer y abrir un flujo de datos entre la interfaz de
usuario y el almacén de datos de un determinado tipo.
Cuando utilizamos el objeto Connection, debemos especificar a qué tipo de almacén de
datos nos vamos a conectar y proporcionar toda la información necesaria para establecer
el enlace. Cuando establecemos el enlace, se dice que tenemos una conexión abierta.
Otros objetos pertenecientes a Data Provider Objects, como DataReader y DataAdapter,
dependen de la existencia previa de una conexión abierta; esto resulta lógico si considera-
mos que si no hay una conexión abierta con un almacén de datos, no puede haber lectura
ni intercambio de datos e instrucciones.
Capítulo 15. Manejo de bases de datos con ADO.NET 497

El objeto Connection tiene diferentes implementaciones y varía dependiendo del tipo


de almacén de datos con el que nos queramos conectar; sin embargo, tiene un cuadro de
miembros básicos aplicables a todas las diferentes implementaciones.
A continuación se mencionan los miembros comunes a todos los diferentes tipos de alma-
cén de datos.

Miembros más utilizados en Connection 15


Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes
miembros:

Propiedades
Propiedad Utilidad

ConnectionString Devuelve o establece la cadena utilizada para abrir una base de


datos.
ConnectionTimeout Devuelve el tiempo de espera para intentar establecer una cone-
xión antes de detenerse y generar un error. El tiempo es expre-
sado en segundos.
Database Devuelve el nombre de la base de datos actual o de la que se va
a utilizar una vez que se abre la conexión.
DataSource Devuelve el nombre de la instancia de SQL Server con la que
se va a establecer la conexión.
ServerVersion Obtiene una cadena que contiene la versión del servidor a la
que se conecta el cliente.
State Obtiene el estado actual de la conexión.

Métodos

Método Acción que realiza

BeginTransaction BeginTransaction()

Inicia una transacción de base de datos.


BeginTransaction(aislamiento)

Inicia una transacción de base de datos con el valor IsolationLevel


actual. El argumento aislamiento es el nivel de aislamiento de tran-
sacción de la conexión.
498 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Close Close()

Cierra la conexión al origen de datos. Éste es el método recomen-


dado para cerrar conexiones abiertas.
CreateCommand CreateCommand()

Crea y devuelve un objeto Command asociado con Connection.


Dispose Dispose()

Libera los recursos utilizados.


Open Open()

Abre una conexión de base de datos con los valores de propiedad que especifica
ConnectionString.

Eventos

Evento Causas que lo originan

Disposed Se produce cuando el objeto ha sido eliminado.


StateChanged Se produce cuando el estado de la conexión cambia.

Se requiere al menos una conexión por cada almacén de datos utilizado por nuestro pro-
grama, aunque los almacenes de datos pertenezcan a distintos tipos.
Para establecer un enlace, es necesario que se proporcione información relativa al
almacén de datos a través de la cadena de conexión, representada por la propiedad
ConnectionString; una vez especificada la cadena de conexión se puede intentar estable-
cer el enlace utilizando para ello el método Open. Para no saturar los canales de comunica-
ción, el enlace se intenta establecer en un tiempo determinado en segundos, que se puede
especificar a través de la propiedad ConnectionTimeout; si no se especifica el tiempo,
de manera predeterminada será de 15 segundos.
Cuando se utilizan modelos de datos específicos para una base de datos, como SqlClient
y OracleClient, no queda duda del tipo de almacén de datos con el cual nos queremos
conectar; el caso de OleDb es diferente, ya que se puede intentar un enlace con todas aque-
llas bases de datos compatibles con OLE DB. De esto deriva la necesidad de aclararle al
sistema qué comportamiento deseamos para el proveedor de datos (Provider).
Capítulo 15. Manejo de bases de datos con ADO.NET 499

Propiedad ConnectionString
La más importante propiedad de Connection es ConnectionString, ya que proporciona
información que identifica al almacén de datos y le proporciona información requerida pa-
ra la conexión, utilizando para ello parámetros textuales, en forma de igualaciones separa-
das por punto y coma («;»). Al valor asignado a ConnectionString se le ha llamado ca-
dena de conexión.
15
El formato sería el siguiente:

Connection.ConnectionString=”parámetro=valor;parámetro=valor…;”

El valor de la propiedad puede cambiarse sólo si no se tiene la conexión abierta.


Los parámetros a utilizar al elaborar una cadena de conexión son:

Parámetro Función

Provider Es útil sólo si se está utilizando OleDb. Establece el nombre del


controlador que sustenta la conexión.
Connection Timeout Establece el tiempo en segundos que se intentará establecer cone-
xión con el almacén de datos. Initial Catalog Establece el nombre
de de la base de datos o almacén de datos con el que nos queremos
conectar. En el caso de bases de datos basadas en archivo físico,
como Access, es el nombre físico del archivo de bases de datos.
Data Source Nombre del almacén de datos. En el caso de SQL Server, es el
nombre del servidor de base de datos; en el caso de otras bases de
datos (por ejemplo una base de datos en Access), es el nombre físico
del archivo que constituye el almacén de datos.
Password Contraseña de la cuenta SQL Server, para permitir el acceso a la
base de datos.
User ID Cuenta de SQL Server, para permitir el acceso a la base de datos.
Integrated Security Establece si la conexión será segura o no. Acepta los valores True y
False.

Connection Pooling
ADO.NET administra las conexiones de manera eficiente, pues posee un concepto denomi-
nado Connection Pooling, que se encarga de revisar constantemente el uso que se le da a
500 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

una conexión. En caso de que una conexión no sea utilizada, procederá a la desconexión
automática, reactivándola en el momento en que se intente la utilización del flujo de datos,
siempre y cuando los objetos sigan vigentes.
Se recomienda, sin embargo, cerrar las conexiones de manera explícita, ya que no hay más
eficiencia que eso. Connection Pooling se encarga de nuestro trabajo si somos descuidados
en nuestra técnica de programación; como no lo somos, no tendrá mucho trabajo con nues-
tra forma de programar.
Si desea ir más allá, puede no sólo cerrar la conexión; también puede liberar los recursos
utilizados en el servidor para mantener la conexión a través del método Dispose.

Cerrado de conexión
Aunque ADO.NET cerrará las conexiones que estén inactivas durante cierto tiempo, dejan-
do latente la conexión mediante Connection Pooling, no hay nada más preciso que hacer
uno mismo la tarea de cerrado de conexión.
Para cerrar una conexión abierta puede utilizar el método Close. La conexión se cerrará y
reducirá considerablemente los recursos utilizados en el equipo para mantener la conexión.
Sin embargo, se mantiene la conexión en estado latente (connection pooling) hasta que el
objeto es desechado por completo. El mantener la conexión en estado latente consume re-
cursos, aunque pocos.
Si definitivamente ya no utilizará la conexión, lo recomendable es cerrarla y desechar el
objeto definitivamente, utilizando para ello el método Dispose.

Proceso de conexión
Generalmente el proceso consiste en lo siguiente:

1. Asegurarse de que se ha importado el namespace requerido para tener acceso al pro-


veedor de datos correspondiente.
2. Declarar variables objeto basadas en el objeto Connection del proveedor de datos se-
leccionado.
3. Instanciar el objeto Connection.
4. Establecer propiedades de conexión; la propiedad indispensable es ConnectionString,
que especificará el almacén de datos con el cual nos enlazaremos.
5. Abrir la conexión, aplicando el método Open.
6. Abierto el flujo de datos se hace lo que se requiere hacer con los datos: adición, mo-
dificación, eliminación o consulta de registros.
7. Se cierra la conexión usando el método Close.
Capítulo 15. Manejo de bases de datos con ADO.NET 501

Ejercicio 15.2
Establecimiento de una conexión a base de datos de forma programática

En este ejercicio realizaremos una conexión a una base de datos SQL Server mediante pro-
gramación. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Ima-
gine que desea establecer una conexión con la base de datos de prueba Pubs y que se en-
lazará utilizando la cuenta de administración sa, cuya contraseña es secreto.
15
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Conecta.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de Conecta – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As SqlConnection
10 conn = New SqlConnection()
11 conn.ConnectionString = “Data Source=aprendaws;” & _
12 “Initial Catalog=pubs;Persist Security Info=True;” & _
13 “User ID=sa;Password=secreto”
14 conn.Open()
15 Console.WriteLine(conn.State.ToString())
16 conn.Close()
17
18 Console.Write(“Pulse INTRO para continuar”)
19 Console.ReadLine()
20
21 End Sub
22
23 End Module

Ejecución guiada de Conecta – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
502 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el


comportamiento de su programa (tecla F5).
5. En la línea 4 se importa el espacio de nombres requerido para un enlace a una base de
datos en SQL Server. El procedimiento de conexión se realiza de la siguiente forma:
se declara una variable a través de la cual se manejará programáticamente la conexión
(línea 9), se genera una instancia de Connection sobre la variable (línea 10), se esta-
blece la cadena de conexión (línea 11) y se abre el flujo de datos con el almacén de
datos (línea 14).
6. La línea 15 muestra de forma textual el estado de la conexión. Si la conexión fue exi-
tosa, se desplegará Open.
7. Finalmente se cierra la conexión (línea 16) para evitar el consumo innecesario de re-
cursos.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Open
Pulse INTRO para continuar

8. Aprovechando la flexibilidad de Visual Basic, se puede hacer más compacto el códi-


go. Vea las siguientes equivalencias posibles:

Declaración, instanciación y asignación de cadena de conexión por separado.

1 Dim conn As SqlConnection


2 conn = New SqlConnection()
3 conn.ConnectionString = “CadenaDeConexión”
4 conn.Open()

Declaración, instanciación y asignación de cadena de conexión por separado.

1 Dim conn As New SqlConnection()


2 conn.ConnectionString = “CadenaDeConexión”
3 conn.Open()

Declaración, instanciación y asignación de cadena de conexión juntas.

1 Dim conn As New SqlConnection(“CadenaDeConexión”)


2 conn.Open()
Capítulo 15. Manejo de bases de datos con ADO.NET 503

La versión más compacta de nuestro programa sería la siguiente:

Codificación de Conecta – Module1.vb

1 Option Explicit On
2
3
Option Strict On
15
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As New SqlConnection(“Data Source=aprendaws;” & _
10 “Initial Catalog=pubs;Persist Security Info=True;” & _
11 “User ID=sa;Password=secreto”
12 conn.Open()
13 Console.WriteLine(conn.State.ToString())
14 conn.Close()
15
16 Console.Write(“Pulse INTRO para continuar”)
17 Console.ReadLine()
18
19 End Sub
20
21 End Module

9. Para implementar la conexión en cualquier otro manejador basta con especificar el es-
pacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y co-
locar una cadena de conexión apropiada.

FIN DEL EJERCICIO *

Command
Comando. El objeto Command permite ejecutar comandos sobre un almacén de datos so-
bre el cual mantenemos conexión; opcionalmente, un comando puede también retornar da-
tos extraídos del almacén de datos.
Un objeto Command siempre actúa sobre una conexión abierta (Connection), es de una natu-
raleza o tipo específico (CommandType), ejecuta una instrucción determinada (CommandText)
y realiza la ejecución de una manera específica que determina los efectos producidos por
el comando.
504 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Miembros más utilizados en Command


Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes
miembros:

Propiedades

Propiedad Utilidad

CommandText Devuelve o establece el procedimiento almacenado, la instruc-


ción de SQL o la tabla de la que se extraerán datos. Su contenido
depende de lo que se especifique en la propiedad CommandType.
CommandType Obtiene o establece un valor que indica cómo se interpreta la
propiedad CommandText.
Connection Obtiene o establece el objeto Connection que utiliza esta ins-
tancia de objeto Command.
Parameters Obtiene el objeto ParameterCollection.
Transaction Obtiene o establece del objeto la Transaction en la que se eje-
cuta el objeto Command.
UpdateRowSource Obtiene o establece la manera en que se aplican los resultados
de comando a DataRow cuando lo utiliza el método Update del
DataAdapter.

Métodos

Método Acción que realiza

Cancel Cancel()

Intenta cancelar la ejecución del objeto Command.


CreateParameter CreateParameter ()

Crea una nueva instancia de un objeto Parameter.


Dispose Dispose()

Libera los recursos utilizados por Component.


Capítulo 15. Manejo de bases de datos con ADO.NET 505

Eventos

Evento Causas que lo originan

Disposed Se produce cuando el objeto ha sido eliminado.

La siguiente sección describe algunas particularidades de los comandos para cada uno de 15
los proveedores de datos más comunes. También muestra el control por medio del cual los
podemos invocar desde Toolbox en Visual Studio.

Tipos de comandos
Los tipos de comando que se tienen son los siguientes:

Tipo de comando Descripción

StoredProcedure Si lo que se va a ejecutar es un procedimiento almacenado (Stored


Procedure) de SQL Server o de Oracle, en la propiedad CommandText
debe especificarse el nombre del procedimiento almacenado a eje-
cutar.
El procedimiento almacenado puede devolver o no valores.
TableDirect Si se desea recuperar el contenido de una tabla o tablas, en la pro-
piedad CommandText debe especificarse el nombre de la tabla o
tablas a recuperar. Si son más de una, debe proporcionarse la lista
de tablas, separadas por comas, lo que producirá como resultado su
unión (Join).
Text Si se desea ejecutar una instrucción SQL, en CommandText debe
especificarse una instrucción SQL válida. Dependiendo del mane-
jador de base de datos, es posible que el dialecto SQL cambie; de-
berá ajustarse a las instrucciones SQL reconocidas por el maneja-
dor de bases de datos que esté utilizando.

En caso de que un comando devuelva valores, es necesario que éstos se almacenen en un


objeto contenedor de datos. Un objeto contenedor de datos es aquél que puede almacenar
datos extraídos a través de un flujo de datos en una conexión abierta.
Son objetos contenedores de datos DataSet y DataReader.
506 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Tipos de ejecución de los comandos


Los tipos de ejecución que permite Command son:
Tipo de comando Descripción

ExecuteReader Método que ejecuta una consulta que retorna un flujo de datos en
forma de registros. Este tipo de ejecución utiliza a DataReader como
contenedor de datos.
ExecuteScalar Método que ejecuta una consulta de valor simple, es decir, un solo
dato. Este tipo de ejecución devuelve sólo una fila y una columna;
al igual que ExecuteReader, utiliza a DataReader como contenedor
de datos.
ExecuteNonQuery Método que ejecuta una instrucción SQL que no devuelve valores,
como puede ser INSERT, DELETE o UPDATE.

DataReader
Lector de datos. Los Data Provider Objects proporcionan un objeto que permite la lec-
tura de datos sólo hacia delante, llamado DataReader.
En virtud de que ADO.NET es muy extenso, no profundizaremos en las particularidades
de DataReader más allá de lo que requerimos en este momento para comprobar nuestro
trabajo con las bases de datos.
DataReader es específico para cada proveedor de datos, por lo cual tendremos SqlData-
Reader, OleDbDataReader, OracleDataReader y así sucesivamente. DataReader trabaja
sobre una conexión abierta a través de un comando que deberá ser ejecutado bajo el méto-
do ExecuteReader.
En el caso de SQL Server 2000, se puede ejecutar ExecuteXMLReader, aprovechando la
compatibilidad con XML que provee el manejador de bases de datos.
Cuando ya tenemos el DataReader trabajando en conjunto con una conexión y un coman-
do, podemos leer los datos a través de un método llamado Read.
DataReader lee registros de un almacén de datos uno tras otro. Cada registro que lee es
puesto en un área temporal de caché, desde donde los datos pueden ser tomados propor-
cionando el nombre de los campos a recuperar.
El método Read tiene una doble función: primero, evalúa si es posible cargar un registro al
área de caché; de ser así, carga el registro, y al mismo tiempo devuelve True. Si no es po-
sible cargar un registro al área de caché, significa que ya hemos llegado al fin de archivo;
en ese caso Read no cargará nada al caché y devolverá False.
Capítulo 15. Manejo de bases de datos con ADO.NET 507

Un aspecto importante es que DataReader utiliza totalmente la conexión, de tal forma que
no se puede ejecutar sobre la conexión ninguna otra operación mientras DataReader está
en proceso de lectura.

Ejercicio 15.3
Uso de comandos para ejecutar procedimientos almacenados y uso de
DataReader 15
En este ejercicio realizaremos una conexión a una base de datos SQL Server mediante pro-
gramación y ejecutaremos un comando con el fin de poblar un DataReader y mostrar el
contenido. Utilizará gran parte del código del ejercicio anterior y además consumiremos
el procedimiento almacenado TitulosVendidosEstado.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Lee-
Datos.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de LeeDatos – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9
10 Dim Estado As String
11 Console.Write(“Siglas del estado: “)
12 Estado = Console.ReadLine()
13
14 Dim conn As SqlConnection
15 conn = New SqlConnection()
16 conn.ConnectionString = “Data Source=aprendaws;” & _
17 “Initial Catalog=pubs;Persist Security Info=True;” & _
18 “User ID=sa;Password=secreto”
19 conn.Open()
20
21 Dim cmd As SqlCommand
22 cmd = New SqlCommand()
23 cmd.CommandText = _
24 String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, Estado)
508 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

25 cmd.Connection = conn
26
27 Dim Lector As SqlDataReader
28 Lector = cmd.ExecuteReader
29
30 Do While Lector.Read()
31 Console.WriteLine(Lector(“title”))
32 Loop
33
34 Lector.Close()
35 conn.Close()
36
37 Console.Write(“Pulse INTRO para continuar”)
38 Console.ReadLine()
39
40 End Sub
41
42 End Module

Ejecución guiada de LeeDatos – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. La conexión se realiza de la misma forma que en el ejercicio anterior.
6. En la línea 21 se declara la variable a través de la cual se ha de manejar el comando. En
la línea 22 se asigna una instancia de SqlCommand a la variable que acabamos de de-
clarar. En la línea 23 se asigna la instrucción SQL que deseamos que se ejecute a tra-
vés del comando, y en la línea 25 especificamos sobre qué conexión se ha de ejecutar
el comando.
7. En la línea 27 se declara una variable para el manejo del lector de datos (DataReader)
que, como podrá observar, no requiere ser instanciado de forma explícita. En la línea
28 decimos que el resultado de ejecutar el comando provee de datos al lector.
8. En la línea 30 comienza la exploración del lector de datos. Mientras el lector pueda
leer un registro de datos, se estará mostrando la columna title.
9. Proporcione como dato de entrada CA. Al ejecutarse el procedimiento almacenado, de-
volverá todos los títulos vendidos en el estado de California; los datos se asignarán al
DataReader. Se muestra el contenido en el Do While.
Si todo ocurrió como se esperaba, la salida será la siguiente:

Siglas del estado: CA


Secrets of Silicon Valley
Is Anger the Enemy?
Is Anger the Enemy?
Capítulo 15. Manejo de bases de datos con ADO.NET 509

Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean


Fifty Years in Buckingham Palace Kitchens
Sushi, Anyone?
Straight Talk About Computers
Silicon Valley Gastronomic Treats
You Can Combat Computer Stress!
Pulse INTRO para continuar

10. Aprovechando la flexibilidad de Visual Basic se puede hacer más compacto el código.
15
Vea las siguientes equivalencias posibles:

Declaración, instanciación y asignación de cadena de conexión por separado.

1 Dim cmd As SqlCommand


2 cmd = New SqlCommand()
3 cmd.CommandText = _
String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, Estado)
4 cmd.Connection = conn
5 Dim Lector As SqlDataReader
6 Lector = cmd.ExecuteReader()

Declaración, instanciación y asignación de comando y conexión juntas.

1 Dim cmd As New SqlCommand( _


String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, _
Estado),conn)
2 Dim Lector As SqlDataReader = cmd.ExecuteReader()

La versión más compacta de nuestro programa sería la siguiente:

Codificación de LeeDatos – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As New SqlConnection(“Data Source=aprendaws;” & _
10 “Initial Catalog=pubs;Persist Security Info=True;” & _
11 “User ID=sa;Password=secreto”
12 conn.Open()
13 Dim cmd As New SqlCommand( _
14 String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, _
15 Estado),conn)
16 Dim Lector As SqlDataReader = cmd.ExecuteReader()
17
18 Do While Lector.Read()
510 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19 Console.WriteLine(Lector(“title”))
20 Loop
21
22 Lector.Close()
23 conn.Close()
24
25 Console.Write(“Pulse INTRO para continuar”)
26 Console.ReadLine()
27
28 End Sub
29
30 End Module

11. Para implementar la conexión en cualquier otro manejador basta con especificar el es-
pacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y co-
locar una cadena de conexión apropiada.
FIN DEL EJERCICIO *

Ejercicio 15.4
Altas, bajas, cambios y consultas en modo conectado

En este ejercicio realizaremos un actualizador (Alta, Baja, Cambio, Consulta) para la tabla
Jobs. Aprovecharemos lo que hemos aprendido para realizar operaciones en modo conec-
tado.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Act-
Puestos.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de ActPuestos – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Dim conn As SqlConnection
Capítulo 15. Manejo de bases de datos con ADO.NET 511

9 Dim mJob_id As Integer


10 Dim mJob_desc As String
11 Dim mMin_lvl As Byte
12 Dim mMax_lvl As Byte
13
14
15 Sub Main()
16 Try
17
18 Call AbreConexion() 15
19
20 Dim Opcion As String
21
22 Do While Opcion <> “X”
23 Console.WriteLine(“**************************”)
24 Console.WriteLine(“Opciones de la aplicación:”)
25 Console.WriteLine(“A - Alta de registros”)
26 Console.WriteLine(“M - Modificación de registros”)
27 Console.WriteLine(“E - Eliminación de registros”)
28 Console.WriteLine(“C - Consulta de registros”)
29 Console.WriteLine(“X - Salir del programa”)
30 Console.Write(“Qué opción desea:”)
31 Opcion = Console.ReadLine()
32
33 Select Case Opcion
34 Case “A”
35 Call AgregarRegistro()
36 Case “M”
37 Call ModificarRegistro()
38 Case “E”
39 Call EliminarRegistro()
40 Case “C”
41 Call ConsultarRegistros()
42 Case “X”
43 Exit Do
44 End Select
45
46 Console.WriteLine(“**************************”)
47 Loop
48
49 Call CerrarRecursos()
50
51 Catch ex As Exception
52 Console.WriteLine(“Ha ocurrido un error”)
53 Console.WriteLine(ex.Message)
54 Exit Sub
55 End Try
56
57 End Sub
58
59 Sub AbreConexion()
512 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

60 conn = New SqlConnection(“Data Source=aprendaws;” & _


61 “Initial Catalog=pubs;Persist Security Info=True;” & _
62 “User ID=sa;Password=secreto”)
63 conn.Open()
64 End Sub
65
66 Sub AgregarRegistro()
67 Console.Write(“Descripción de puesto:”)
68 mjob_desc = Console.ReadLine()
69 Console.Write(“Nivel mínimo:”)
70 mMin_lvl = CType(Console.ReadLine(), Byte)
71 Console.Write(“Nivel máximo:”)
72 mMax_lvl = CType(Console.ReadLine(), Byte)
73
74 Dim OrdenSQL As String
75 OrdenSQL = String.Format(“INSERT INTO Jobs (Job_desc, “ & _
76 “Min_lvl, Max_lvl) VALUES (‘{0}’, {1}, {2})”, _
77 mJob_desc, mMin_lvl, mMax_lvl)
78 Dim cmd As New SqlCommand(OrdenSQL, conn)
79 cmd.ExecuteNonQuery()
80 End Sub
81
82 Sub ModificarRegistro()
83 Console.Write(“ID de puesto:”)
84 mJob_id = CType(Console.ReadLine(), Integer)
85 Console.Write(“Descripción de puesto:”)
86 mJob_desc = Console.ReadLine()
87 Console.Write(“Nivel mínimo:”)
88 mMin_lvl = CType(Console.ReadLine(), Byte)
89 Console.Write(“Nivel máximo:”)
90 mMin_lvl = CType(Console.ReadLine(), Byte)
91
92 Dim OrdenSQL As String
93 OrdenSQL = String.Format(“UPDATE Jobs SET Job_desc=’{0}’,” & _
94 “Min_lvl={1}, Max_lvl={2} WHERE Job_id={3}”, _
95 mJob_desc, mMin_lvl, mMax_lvl, mJob_id)
96 Dim cmd As New SqlCommand(OrdenSQL, conn)
97 cmd.ExecuteNonQuery()
98 End Sub
99
100 Sub EliminarRegistro()
101 Console.Write(“ID de puesto:”)
102 mJob_id = CType(Console.ReadLine(), Integer)
103 Dim OrdenSQL As String
104 OrdenSQL = String.Format(“DELETE Jobs WHERE Job_id={0}”, _
105 mJob_id)
106 Dim cmd As New SqlCommand(OrdenSQL, conn)
107 cmd.ExecuteNonQuery()
108 End Sub
109
110 Sub ConsultarRegistros()
Capítulo 15. Manejo de bases de datos con ADO.NET 513

111 Dim Lector As SqlDataReader


112 Dim OrdenSQL As String
113 OrdenSQL = “SELECT * FROM Jobs”
114 Dim cmd As New SqlCommand(OrdenSQL, conn)
115 Lector = cmd.ExecuteReader
116 Do While Lector.Read
117 Console.WriteLine(String.Format(“{0}, {1}, {2}, {3}”, _
118 Lector(0), Lector(1), Lector(2), Lector(3)))
119 Loop
120 Lector.Close() 15
121 End Sub
122
123 Sub CerrarRecursos()
124 If conn.State = ConnectionState.Open Then
125 conn.Close()
126 End If
127 End Sub
128 End Module
129

Ejecución guiada de ActPuestos – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. El procedimiento principal se encarga de llamar al procedimiento AbreConexion(),
que se encarga de abrir la conexión a la base de datos. Posteriormente, utilizando un
Do While propone un menú de opciones. Dependiendo de la selección que se haga, se
ejecutará el procedimiento AgregarRegistro(), que se encarga de agregar un registro
a la tabla Jobs; ModificarRegistro() que se encarga de modificar los datos de un re-
gistro existente; EliminarRegistro(), que se encarga de eliminar un registro existen-
te, y ConsultarRegistros(), que se encarga de mostrar el contenido de la tabla Jobs.
Dependiendo de la operación a realizar, se preguntarán los datos necesarios, y se cons-
truirá la sentencia SQL apropiada.
6. Seleccione la opción C y vea los registros que actualmente tiene la tabla.
7. Seleccione la opción A y agregue el puesto Vendedor Senior, con nivel mínimo 100
y nivel máximo 175. Vea cómo no se proporciona valor de ID, dado que es Identity y
el manejador SQL Server lo asignará automáticamente.
8. Seleccione la opción C y compruebe que el programa agregó el registro.
9. Vea cómo no se proporciona valor de ID, dado que es Identity y el manejador SQL
Server lo asignará automáticamente.
514 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Seleccione la opción M y cambie la descripción por Vendedor Senior Jr, con nivel
mínimo 120 y nivel máximo 175. Deberá proporcionar el número de ID que automá-
ticamente el manejador le proporcionó a su registro.
11. Seleccione la opción C y compruebe que el programa modificó el registro.
12. Seleccione la opción E y elimine el registro que acaba de agregar. Tendrá que propor-
cionar el número de ID que automáticamente le asignó el manejador.
13. Seleccione la opción C y compruebe que el programa eliminó el registro.
14. Esta misma interfaz puede realizarse en Windows o en Web. Finalmente las operacio-
nes terminarán siendo ADO.NET y el manejo es el mismo.
15. Cierre su aplicación.
FIN DEL EJERCICIO *

Ejercicio 15.5
Consumo de cadenas de conexión de app.Config

En este ejercicio analizaremos la forma en que se consumen las cadenas de conexión en


aplicaciones Windows y Consola, con la finalidad de asegurar el código. Trabajará con el
ejercicio 15.2, realizado con anterioridad.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Uno de los problemas de seguridad es la exposición de información delicada en una
cadena de conexión, principalmente nombre de usuario y contraseña.
3. La recomendación general es que utilice la seguridad integrada de Windows; de esa
manera, los procesos de autenticación (reconocer al usuario) y autorización (darle per-
misos al usuario reconocido) quedan bajo el control del sistema operativo.
4. Para implementar este tipo de autenticación es necesario agregar en la cadena de co-
nexión el argumento:
Integrated Security=SSPI;

En lugar de:
User ID=usuario;password=contraseña;

5. La desventaja es que se debe realizar trabajo de asociación de cuentas de sistema ope-


rativo con las bases de datos y sus objetos. Eso implica que todos los que se conectan
a los datos deben poder firmarse en el equipo, lo cual abre otras posibilidades de inse-
guridad, además de que se requiere una minuciosa administración de cuentas. Como
podrá imaginarse, en Web ese esquema no es funcional.
Capítulo 15. Manejo de bases de datos con ADO.NET 515

6. Otra desventaja de integrar textualmente la cadena de conexión en nuestros programas


es que en caso de que cambie el nombre del servidor, del usuario o la contraseña, ten-
drán que modificarse todos los programas, y recompilarse. Lo ideal es tener la infor-
mación en un archivo externo de configuración, que en el caso de aplicaciones de con-
sola y Windows se llama app.config; desde ahí la información puede consumirse a
través de programación. En caso de cambios, se modifica el archivo de configuración
que se aplica para todos los programas y automáticamente todo se actualiza sin nece-
sidad de recompilar. 15
➤ Compilación de un proyecto para liberación (Release)

7. Nuestro proyecto Conecta está escrito como sigue. Como vemos, expone de forma
textual la cadena de conexión, y con ello el usuario y la contraseña:

Codificación de Conecta – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As SqlConnection
10 conn = New SqlConnection()
11 conn.ConnectionString = “Data Source=aprendaws;” & _
12 “Initial Catalog=pubs;Persist Security Info=True;” & _
13 “User ID=sa;Password=secreto”
14 conn.Open()
15 Console.WriteLine(conn.State.ToString())
16 conn.Close()
17
18 Console.Write(“Pulse INTRO para continuar”)
19 Console.ReadLine()
20
21 End Sub
22
23 End Module

8. Generalmente, Visual Studio compila en modo depuración las aplicaciones (Debug)


con lo cual nos asiste en la corrección de problemas. Cuando el programa ya no cau-
sa errores y estamos listos para liberarlo, se recomienda construir el programa (Build)
en modo liberación (Release), para proceder a la distribución.
516 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. En Solution Explorer haga doble clic en el nodo Conecta – Module1.vb. En la barra


de herramientas cambie el modo de compilación a Release.

10. En Solution Explorer seleccione el nombre del proyecto Conecta. Despliegue el me-
nú contextual y seleccione Rebuild, para reconstruir el ensamblado en modo Release.
11. El ensamblado para distribución habrá quedado en el directorio Bin\Release del pro-
yecto. Como el ensamblado ya es un archivo EXE y no se puede abrir desde un editor
de texto, podemos sentirnos seguros de que nadie conocerá la información de usuario
y contraseña de la base de datos ¿No es cierto?

➤ Crackeado de un usuario y contraseña usando ILDASM


12. Nuestro ensamblado es un ensamblado .NET, y existe una herramienta de línea de co-
mando, llamada ILDASM.EXE, que permite desensamblar los programas. Veamos qué
tan fácil sería descifrar el usuario y la contraseña de nuestra base.
13. En Windows, en el grupo de programas de Visual Studio 2005, seleccione Visual Stu-
dio Tools – Visual Studio 2005 Command Prompt. Escriba lo siguiente en la línea de
comandos:

1 cd\
2 cd\APVBNETVS\Ejercicios\Conecta\Bin\Release
3 ildasm Conecta.exe

14. Aparecerá la herramienta de desensamblado de .NET.


Capítulo 15. Manejo de bases de datos con ADO.NET 517

15. Expanda el árbol de elementos hasta que ubique el elemento method Main: void(),
que es el procedimiento en el que habíamos codificado la cadena de conexión. Haga
doble clic sobre el elemento y se mostrará el código en su forma administrada (ma-
naged).

15

16. Vea en la ilustración la línea IL_0007, en donde aparece la cadena de conexión, total-
mente legible para el ojo curioso, no siempre bien intencionado.
17. Cierre ILDASM.

➤ Adición de un archivo de configuración para la aplicación

18. Los archivos de configuración (Configuration Files) son archivos en formato XML
que contienen elementos reconocidos por la plataforma .NET, y son utilizados por
CLR en tiempo de ejecución para producir los efectos del programa y definir los apo-
yos de depuración y seguridad. En el caso de aplicaciones Windows (Consola y Win-
dows), el archivo tiene el nombre app.Config, mientras que en las aplicaciones ASP-
.NET tiene el nombre Web.Config.
19. Generalmente, al crear una aplicación de consola no se genera en automático el archi-
vo de configuración. Para crearlo, seleccione el nodo Conecta en Solution Explorer,
despliegue el menú contextual y seleccione Add – New Item, con lo que aparecerá la
ventana Add New Item. Seleccione la plantilla Application Configuration Template
y haga clic en Add. Con ello se agregará al proyecto Conecta un archivo de configu-
ración.
518 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

20. En Solution Explorer haga doble clic sobre el nodo app.config del proyecto Conec-
ta. Con ello se editará el archivo de configuración.
21. Dentro del elemento <configuration> agregue un elemento <connectionString> y
dentro de éste, una cadena de conexión. Las primeras líneas del archivo deben quedar
así:

Codificación de Conecta – app.config (parte)

1 <?xml version=”1.0” encoding=”utf-8” ?>


2 <configuration>
3 <connectionStrings>
4 <add name=”conn” connectionString=”Server=aprendaws;Initial √
Catalog=Pubs;User Id=sa;passwrod=secreto”/>
5 </connectionStrings>
6 <system.diagnostics>
7 <sources>
8 <source name=”DefaultSource” switchName=”DefaultSwitch”>
9 ...

22. El nombre conn asignado al valor de configuración podrá ser invocado programática-
mente.

➤ Consumo de valores desde el archivo de configuración


23. Para consumir un valor del archivo de configuración, éste debe encontrarse en el mis-
mo directorio que el ensamblado. En el programa lo que debe hacerse es importar el
espacio de nombres System.Configuration. Para obtener todas las clases del espacio
de nombres es necesario hacer referencia a System.Configuration.dll.
Capítulo 15. Manejo de bases de datos con ADO.NET 519

24. Seleccione el nodo Conecta en Solution Explorer y despliegue el menú contextual.


Seleccione Add Reference y en la pestaña .NET de la ventana Add Reference selec-
cione System.Configuration; haga clic en Ok. Con ello se agrega la referencia a
System.Configuration.dll.
25. Modifique el programa para que quede de la siguiente forma:

Codificación de Conecta – Module1.vb


15
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5 Imports System.Configuration
6
7
8 Module Module1
9
10 Sub Main()
11 Dim conn As SqlConnection
12 conn = New SqlConnection()
13 Dim Settings As ConnectionStringSettings
14 Settings = ConfigurationManager.ConnectionStrings(“connStr”)
15 conn.ConnectionString = Settings.ConnectionString
16
17 conn.Open()
18 Console.WriteLine(conn.State.ToString())
19 conn.Close()
20
21 Console.Write(“Pulse INTRO para continuar”)
22 Console.ReadLine()
23
24 End Sub
25
26 End Module
27

26. En la línea 5 se importó el espacio de nombres System.Configuration, necesario pa-


ra poder disponer de los elementos de app.config.
27. En la línea 14 se declara una variable que nos servirá para leer los valores almacena-
dos en el archivo de configuración. A la variable le asignamos el valor almacenado en
un elemento llamado connStr, dentro de la sección connectionString del archivo de
configuración (línea 15). Todos los elementos que hayan sido agregados en la sección
a través de Add podrán ser recuperados del archivo de configuración. En la línea 16,
finalmente, se recupera la cadena de conexión de la variable de trabajo, y se le asigna
520 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

a la propiedad Connection.ConnectionString del objeto de conexión conn. Sobra


decir que es posible almacenar más de una cadena de conexión.
28. Suponga que diez programas utilizan la misma cadena de conexión y ya han sido com-
pilados. Si cambia cualquier cosa en la cadena de conexión, sólo basta con modificar-
la en el archivo de configuración para que todos los programas funcionen sin modifi-
caciones; en este caso, no sería necesario recompilar los programas.
29. Construya en modo Release el proyecto Conecta, establézcalo como proyecto de ini-
cio (StartUp Project) e inicie la depuración. El programa debe ejecutarse sin proble-
mas.
30. En la ventana Visual Studio 2005 Command Prompt (línea de comandos), aplique el
comando Dir y vea cómo en modo Release se agregó un archivo de configuración es-
pecífico para el proyecto, llamado Conecta.exe.config.
31. La conexión se realiza, sin que la cadena de conexión esté expuesta en el ejecutable.
Queda claro que ahora está expuesta en el archivo de configuración, que es un archi-
vo textual XML, y que puede ser encriptado utilizando las clases del espacio de nom-
bres System.Security.Cryptography.Xml.
32. Cierre su aplicación, así como Visual Studio 2005 Command Prompt.
FIN DEL EJERCICIO*
Capítulo 15. Manejo de bases de datos con ADO.NET 521

MAPA MENTAL DEL CAPÍTULO

15
522 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA
Actualizaciones por Source, 499 Motor de base de Proveedor de datos
lotes, 477 DataAdapter, 493 datos Jet, 474 .NET Framework,
ADO, 476 Database, 497 Multiple Active 481
ADO.NET, 476 DataColumn, 495 Result Sets, Proveedores de
app.config, 515 DataReader, 493, 476 datos de .NET,
Base de datos 506 .NET Data 476
conectada, 477 DataRelation, 496 Provoders, 476 Provider, 499
desconectada, DataRow, 495 .NET Framework Query Designer, 487
478 DataSet Objects, Data Provider, RDO, 475
Batch updates, 477 491 481 Release, 515
BeginTransaction, DataSet, 495 OCI, 473 Remote Data
497 ODBC, 473 Objects, 475
Datasource, 497
Cancel, 504 OLE DB, 475 Server Explorer, 482
DataTable, 495
Client, 494 Consumer, 475 SqlCommand, 493
DataView, 495
Close, 498 OleDbCommand, SqlConnection, 493
DBLib, 473
Command, 492, 503 493 SqlDataAdapter,
Dispose, 498, 504
Builder, 494 OleDbConnection, 493
Disposed, 498, 505
CommandText, 504 493 SqlDataReader,
Error, 494
CommandType, 504 OleDbDataAdapter, 493
Exception, 494
Connection, 492, 493 State, 497
ExecuteNonQuery,
504 OleDbDataReader, StateChanged, 498
506
Pooling, 499 493 Stored Procedures,
ExecuteReader, 506
StringBuilder, Open, 498 488
ExecuteScalar, 506
494 OracleCommand, StoredProcedure,
ILDASM.EXE, 516
Timeout, 499 493 505
Integrated Security,
ConnectionString, OracleConnection, SuperVersion, 497
499
497 493 TableDirect, 505
Lector de datos, OracleData
ConnectionTimeout, Text, 505
506 Adapter, 493
497 Transaction, 494,
Constraint, 496 Liberación, 515 OracleDataReader, 504
CreateCommand, MARS, 476 493 UDA, 475
498 Modo Parameter, 494 Universal Data
CreateParameter, conectado, 480 Parameters, 504 Access, 475
504 parcialmente Password, 499 UpdateRowSource,
DAO, 474 conectado, 480 Permission, 494 504
Data totalmente Procedimientos User ID; 499
Provider Objects, desconectado, almacenados, Web.Config, 517
491 480 488
Capítulo 15. Manejo de bases de datos con ADO.NET 523

PREGUNTAS
15.1 ¿Cuáles son las fases evolutivas del acceso a las bases de datos en forma programá-
tica?
15.2 Explique cuáles son las diferencias entre el esquema conectado y el esquema desco-
nectado de bases de datos.
15.3 Explique los objetos Data Provider Objects. 15
15.4 Explique los objetos DataSet Objects.

15.5 Explique los tipos de comando y los tipos de ejecución del objeto Command.
15.6 ¿Para qué sirve DataReader?
524 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:
Capítulo 15. Manejo de bases de datos con ADO.NET 525

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Es el motor de base de datos óptimo para manejar bases de datos en Access:
a) DAO
b) ADO
c) RDO

2. Es el tipo de acceso en donde la aplicación mantiene una conexión permanente con el almacén de da-
tos:
15
a) Bases de datos de conexión persistente
b) Bases de datos conectadas
c) Bases de datos desconectadas

3. Son los espacios de nombre asociados con ADO.NET:


a) .Data-Related Namespaces
b) .ADO.NET Namespaces
c) System.Data y System.Xml

4. Es la opción ideal para las aplicaciones que requieren manejo de bases de datos centralizadas y en tiempo
real:
a) Bases de datos de conexión persistente
b) Bases de datos conectadas
c) Bases de datos desconectadas

5. Es el modelo de objetos que permite tener un manejo total y flexible de la copia local de los datos:
a) Data Provider Objects
b) DataSet Objects
c) Command Objects

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.

6. Las librerías nativas de acceso a datos son más rápidas que ODBC.

7. Una desventaja de las bases de datos desconectadas es que los datos no están perma-
nentemente actualizados.

8. Los sistemas manejadores de bases de datos son componentes y librerías que nos per-
miten tener acceso a los almacenes de datos mediante programación.

9. RDO es la tecnología que permite la simplicidad de programación de DAO, pero con


mejor desempeño en comparación con bases de datos que utilizan un motor de datos
distinto a JET.

10. A los DataSet Objects se les debe anteponer un prefijo que indique el tipo de base de
datos con el cual se establece conexión.
CAPÍTULO 16
Manejo de bases de datos
desde aplicaciones Windows
Objetivos: Aprender el manejo de bases de datos en modo parcialmente co-
nectado usando DataSet para el desarrollo de aplicaciones de base de datos.

1. Conocerá los objetos que forman el modelo de objetos DataSet.


2. Entenderá cómo se organizan los objetos de DataSet en colecciones.
3. Aprenderá a utilizar las colecciones de manera directa y a través de la
estructura de control For Each.
4. Aprenderá a utilizar el objeto DataAdapter y la forma de poblar un
DataSet con datos.

5. Aprenderá a utilizar el objeto DataSet para crear actualizadores usando


Visual Studio.

527
528 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Modelo de objetos DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Funcionalidad de las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
For Each y la lectura de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Independencia de DataSet respecto del almacén de datos . . . . . . . . . 534
Alternativas para poblar de datos un DataSet . . . . . . . . . . . . . . . . . . . . . . . . 534
DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Miembros más utilizados en DataAdapter . . . . . . . . . . . . . . . . . . . . . . 536
DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Miembros más utilizados en DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Categorías de objetos de DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
DataSet y XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Cargado de datos en un DataSet de forma programática . . . . . 542
Uso de Data Sources, Typed Datasets y relaciones padre-hijo . . 545
➤ Creación de un origen de datos (Data Source) . . . . . . . . 545
➤ Creación de una aplicación de navegación de datos
desde Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
➤ Adición de registros en modo desconectado
y duplicación de modificaciones al almacén de datos . . 554
➤ Generación de interfaz con registros padre-hijo en
tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Actualizador de registros con Data Sources y enlazado
de datos a un cuadro combinado . . . . . . . . . . . . . . . . . . . . . . . . 556
➤ Personalización de cuadros combinados de tablas
relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 529

Uno de los rasgos que caracteriza a toda base de datos es la forma en que maneja las rela-
ciones entre sus tablas. El concepto es tan importante que permite clasificarlas en las que
son relacionales y las que no lo son.
El manejo de relaciones es fundamental e implica el reconocimiento de llaves primarias y
foráneas, la existencia de campos de coincidencia y la existencia de reglas de integridad
entre las tablas. Si no somos capaces de trabajar todos esos conceptos al momento de pro-
gramar, podemos decir que estamos desarrollando aplicaciones de bases de datos, pero no
podremos decir que programamos aplicaciones de bases de datos relacionales.
No obstante que las bases de datos, bajo el esquema conectado, permiten un manejo directo y
sencillo de los datos, tienen una desventaja que resulta crítica: no tienen la capacidad de ma-
nejar bases de datos en su dimensión relacional. Si lo analiza detenidamente, se dará cuenta
de que trabajamos sólo con matrices bidimensionales de datos (tablas, filas/columnas), y que
todo manejo relativo a la dependencia entre tablas, restricciones de integridad, manejo de lla- 16
ves, etcétera, debemos controlarlo a través de programación. Esto equivale a desperdiciar la
capacidad de control que el manejador de base de datos relacional posee, por lo que sería igual
cargar los datos en Access, SQL Server, un archivo en Excel o un archivo de texto simple.
Para aprovechar todo el poder de las bases de datos relacionales es necesario utilizar el ob-
jeto DataSet, sobre el que recae la posibilidad de manejo de bases de datos desconectadas
en ADO.NET.
Al usar DataSet dispondremos automáticamente de un modelo de base de datos relacional
de parte del cliente, independiente del almacén de datos.

Modelo de objetos DataSet


La figura 16.1 muestra los objetos que componen el modelo de objetos DataSet (DataSet
Objects).

FIGURA 16.1
DataSet Objects.
530 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Exploraremos cada uno de los objetos que componen el modelo de objetos DataSet de ma-
nera detallada.
A nivel modelo de objetos es importante lo siguiente:

1. En resumen, tenemos un modelo de base de datos (DataSet) que se compone de ta-


blas (DataTable) relacionadas entre sí (DataRelation); las tablas se componen a su
vez de campos (DataColumn), de los cuales tendremos ocurrencias o filas (Rows) que
deberán atender algunas restricciones (Constraint).
2. En el plano específico la organización está basada en colecciones:
a) Todo el modelo se subordina al DataSet.
b) Las tablas se almacenan en una colección perteneciente a DataSet llamada DataTable
Collection.
c) Cada tabla contiene su colección para almacenar sus columnas (DataColum
Collection), filas (DataRowCollection) y restricciones (ConstraintCollection).
d) Las relaciones entre tablas pertenecen al modelo de datos, no a las tablas, y se al-
macenan en una colección llamada DataRelationCollection.
e) Aunque no son parte necesaria del modelo, se pueden tener vistas parciales de las
tablas, especificando columnas y filtros específicos, utilizando el objeto Data-
View.

Un DataSet puede tener muchas tablas (objetos DataTable), que se organizan en una co-
lección llamada DataTableCollection; cada tabla se compone de un conjunto de campos
(objetos DataColumn), que se organizan en una colección llamada DataColumCollection.
Cada tabla puede contener uno, varios o ningún registro; sin importar cuantos registros se
tengan, cada registro es un objeto DataRow que se almacena en una colección llamada Da-
taRowCollection asociado a la tabla.

Una vez que existen las tablas es posible establecer restricciones aplicables a sus campos
(objetos Constraint), a efecto de que se respete la integridad referencial del modelo de da-
tos. Las restricciones se organizarán en una colección llamada ConstraintCollection.
También es posible establecer dependencia padre/hijo entre tablas (DataRelation) al es-
pecificar relaciones entre ellas; éstas se organizarán en una colección llamada DataRela-
tionCollection.

Si se desea tener una vista parcial de los datos de una tabla, se puede utilizar el objeto
DataView.

Para mayor simplicidad en el código, las colecciones tienen alias.


Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 531

Colección Alias

DataTableCollection Tables

DataColumnCollection Columns

DataRowCollection Rows

DataRelationCollection Relations

Funcionalidad de las colecciones


Si no entiende el concepto de las colecciones, el modelo de objetos DataSet será como pa-
sar caminando por todos los círculos del Infierno de Dante, ya que las colecciones lo son 16
todo en DataSet. Aprenderlas no es difícil; conocer cómo funciona una colección permite
saber cómo funcionan todas.
Las colecciones comparten propiedades y métodos comunes para todas las colecciones en
Visual Basic; aquí reseñamos algunos de los miembros más comunes, a fin de que los uti-
lice en el presente capítulo.

Propiedades Eventos Métodos

Count Add
Item Clear
Contains
CopyTo
Remove

Con el uso de propiedades podemos saber cuántos elementos componen la colección


(Collection.Count), así como extraer cualquiera de ellos y disponer de sus propiedades
particulares (Collection.Item).
Mediante el uso de métodos podemos agregar objetos a la colección (Collection.Add),
eliminar todos los elementos de la colección (Collection.Clear), copiar los elementos a
un arreglo (Collection.CopyTo), y eliminar cualquier elemento (Collection.Remove).
Si queremos saber si un elemento existe o no, podemos utilizar (Collection.Contains).
Las colecciones almacenan referencias a un determinado tipo de objeto; cada objeto refe-
rido a una colección constituye un elemento (Item), que se organiza en la colección en for-
ma de un arreglo de base cero.
Suponga que tiene un DataSet de nombre dsBasica; suponga también que dicho DataSet
se compone de cuatro tablas llamadas Clientes, Proveedores, Movimientos e Histórico.
532 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Todo es un objeto en .NET: dsBasica es un objeto DataSet y cada una de las tablas es un
objeto DataTable.
En ese sentido, la colección Tables almacena la referencia de los cuatro objetos DataTable.
La siguiente línea nos despliega en la consola cuántos elementos existen en la colección
Tables de dsBasica:

Console.WriteLine(dsBasica.Tables.Count())

La salida sería la siguiente:

Devuelve un valor de 4 pues existen cuatro objetos DataTable referidos en la colección.


Como la colección almacena los elementos con base cero, los subíndices de referencia se-
rían 0, 1, 2 y 3.
Para conocer el nombre de cada una de las tablas almacenadas en Tables podríamos recu-
rrir al siguiente código:

Console.WriteLine(dsBasica.Tables.Item(0).TableName)
Console.WriteLine(dsBasica.Tables.Item(1).TableName)
Console.WriteLine(dsBasica.Tables.Item(2).TableName)
Console.WriteLine(dsBasica.Tables.Item(3).TableName)

La salida sería la siguiente:

Clientes
Proveedores
Movimientos
Histórico

Cada una de las líneas mostró la propiedad TableName del elemento especificado a través
del subíndice proporcionado, que deberá estar entre 0 y el máximo subíndice posible, es
decir, el número de elementos menos uno. Como puede ver es una forma poco adecuada
para examinar la colección; si la colección hiciera referencia a 1000 objetos en lugar de 4,
el código sería bastante ineficaz.

NOTA
Un error común es utilizar el número de elementos (Count) como subíndice, lo que provoca
error en tiempo de ejecución. Si la colección tiene cinco elementos (n), y el primero tiene un
subíndice de cero que aumenta progresivamente sobre base entera, el máximo subíndice po-
sible será el total de elementos menos uno (n-1).
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 533

También podemos recurrir al siguiente código, que sería la automatización del anterior, y
que proporcionaría los mismos resultados:

Dim i As Integer
For i=0 To (dsBasica.Tables.Count() – 1)
Console.WriteLine(dsBasica.Tables.Item(i).TableName)
Next i

Es sencillo, con la salvedad de que el código puede ser bastante complejo y las líneas bas-
tante largas.
Podemos simplificar un poco más el código asignando la colección a un objeto:

Dim i As Integer
Dim MisTablas As DataTableCollection = dsBasica.Tables 16
For i=0 To (MisTablas.Count() – 1)
Console.WriteLine(MisTablas.Item(i).TableName)
Next i

El hecho de que un objeto haga las veces de una colección permite ver al código en térmi-
nos más sencillos. Esa posibilidad da paso a la estructura de control For Each.

For Each y la lectura de colecciones

La estructura de control For Each trabaja sobre colecciones.


Para poder trabajar, For Each requiere de una variable de trabajo de la misma naturaleza
que los objetos referidos por la colección.
Continuando con nuestro ejemplo, el código para mostrar el nombre de cada uno de los
elementos de la colección sería el siguiente:

Dim TablaEnColeccion As DataTable


For Each TablaEnColeccion In dsBasica.Tables
Console.WriteLine(TablaEnColeccion.TableName)
Next TablaEnColeccion

Lo que hace For Each es que cada elemento de la colección se asigna a la variable de tra-
bajo; dentro del bloque de código entre For Each y Next se puede utilizar la variable de
trabajo como si estuviéramos trabajando con el elemento de la colección. Si la colección
tiene 1 o 1000 elementos, el código es el mismo.
El código anterior es equivalente al siguiente, que es marcadamente más complejo:
534 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dim TablaEnColeccion As DataTable


TablaEnColeccion = dsBasica.Tables.Item(0)
Console.WriteLine(TablaEnColeccion.TableName)

TablaEnColeccion = dsBasica.Tables.Item(1)
Console.WriteLine(TablaEnColeccion.TableName)

TablaEnColeccion = dsBasica.Tables.Item(2)
Console.WriteLine(TablaEnColeccion.TableName)

TablaEnColeccion = dsBasica.Tables.Item(3)
Console.WriteLine(TablaEnColeccion.TableName)

Escoja la forma más conveniente. Imagine que son 500 elementos en la colección, ¿cuál
opción le conviene?

Independencia de DataSet respecto del almacén


de datos
Contrario a lo que sucedía con los Data Provider Objects, el modelo de objetos DataSet
tiene sólo una implementación totalmente independiente al proveedor de datos que se utilice.
El modelo de objetos DataSet y los datos contenidos en el modelo se representan en la me-
moria del equipo local mediante lenguaje XML.
Para DataSet no es relevante si utilizamos OleDbClient, SQLClient, OracleClient u otro,
ya que en realidad DataSet no se entiende con dichos objetos.
El encargado de resolver las particularidades de cada almacén de datos es el objeto
DataAdapter; habrá un DataAdapter por cada proveedor de datos que se tenga en .NET.

Alternativas para poblar de datos un DataSet


Antes de analizar los objetos DataSet es importante saber que éstos son independientes de un al-
macén de datos; es decir, que se puede tener un modelo de bases de datos en memoria aunque
no se disponga de un manejador de base de datos o un almacén de datos físico en el equipo.
Los datos de un DataSet pueden provenir de diferentes partes:

1. Interfaz de usuario. Por la utilización de una interfaz de usuario que, a través de


programación, se encarga de agregar, modificar o eliminar registros o filas.
2. Almacén de datos. De un almacén de datos compatible con ADO.NET; en ese ca-
so, es necesario extraer los datos del almacén con el apoyo de un objeto de tipo
DataAdapter, que es un objeto Data Provider, y que se encarga del diálogo entre el
DataSet y el almacén de datos resolviendo discrepancias.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 535

3. XML. Si los datos provienen de estructuras de datos XML válidas. Este tipo de alma-
cén de datos es muy utilizado en aplicaciones de cómputo móvil, ya que no es nece-
sario consumir recursos para almacenar y recuperar datos.

Dependiendo de las necesidades de la aplicación, se puede tener una combinación de dife-


rentes orígenes a fin de incrementar la confiabilidad y el tiempo de respuesta de la aplica-
ción.

DataAdapter
Adaptador de datos. El objeto DataAdapter, es un conjunto de comandos y conexio-
nes que sirve de interfaz entre el almacén de datos y DataSet. 16
DataSet no interactúa de ninguna forma con el almacén de datos de manera directa; Data
Adapter actúa como puente entre DataSet y el almacén de datos para efectuar cualquier
operación de recuperación o escritura.
En caso de que los datos que han de poblar un DataSet provengan de un almacén de da-
tos, primero se cargan en el DataAdapter para luego trasladarse al DataSet mediante el uso
del método Fill.
Fill define una tabla dentro del DataSet, trasladando los datos contenidos en la tabla más
la definición básica de los campos. Inicialmente, la definición de los campos incluye sólo
el nombre del campo y el tipo de dato, dejando fuera importantes cuestiones como la lon-
gitud máxima permitida, la capacidad de permitir valores nulos, etcétera.
Debido a lo básico de la definición de campos realizada por Fill, se dice que se tiene un
DataSet sin tipos (Untyped DataSet).
El método FillSchema se emplea para trasladar las especificaciones de tipo, longitud y res-
tricciones al DataSet, de tal manera que la representación de la base de datos en memoria
y en el almacén físico de datos concuerde. Cuando DataSet representa de manera comple-
ta los atributos del modelo de datos en el almacén físico, se dice que se tiene un DataSet
con tipos (Typed DataSet). La especificación generalmente se hace a través de XML y
XSD.
Es importante aclarar que los datos que han de poblar un objeto DataSet no siempre pro-
vienen de un almacén de datos; es posible, incluso, que DataSet pueda generarse de ma-
nera programática en forma totalmente independiente de cualquier almacén de datos. En
ese entendido, es posible utilizar DataSet sin su correspondiente objeto DataAdapter, si es
que la aplicación nada tiene que ver con un almacén de datos; en ese escenario, también
saldría sobrando una conexión.
536 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dependiendo del proveedor de datos se utilizará un diferente DataAdapter (SqlDataAdapter,


OleDbDataAdapter, OracleDataAdapter). En este libro lo consideraremos de forma ge-
nérica.

Miembros más utilizados en DataAdapter


Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes
miembros:

Propiedades

Propiedad Utilidad

AcceptChangesDuringFill Obtiene o establece un valor que indica si debe


llamarse al método AcceptChanges en DataRow
después de agregarse a DataTable durante cualquiera
de las operaciones Fill.
DeleteCommand Obtiene o establece un procedimiento almacenado o
una instrucción de Transact-SQL para eliminar registros
de un conjunto de datos.
InsertCommand Obtiene o establece un procedimiento almacenado o
una instrucción de Transact-SQL para insertar nuevos
registros en el origen de datos.
SelectCommand Obtiene o establece un procedimiento almacenado o
una instrucción de Transact-SQL para seleccionar
registros en el origen de datos.
UpdateCommand Obtiene o establece un procedimiento almacenado o
una instrucción de Transact-SQL para actualizar los
registros del orien de datos.

Las propiedades DeleteCommand, InsertCommand, SelectCommand y UpdateCommand


son denominadas propiedades de ejecución; usualmente se debe definir como mínimo
Select Command (propiedad por omisión de DataAdapter); el resto de las propiedades de
ejecución se pondrán en funcionamiento al aplicar el método Update, mismo que reprodu-
cirá las modificaciones realizadas en DataSet en el almacén de datos.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 537

Métodos
Método Acción que realiza

Dispose Dispose()

Libera los recursos utilizados por Component.


Fill Fill(dataSet As DataSet)

Agrega filas a DataSet o las actualiza para que coincidan con las
filas del origen de datos. Este método devuelve el número de
filas actualizadas correctamente en el DataSet.
Fill(dataset As DataSet, nombre As String)

Agrega filas a DataSet o las actualiza para que coincidan con las 16
filas del origen de datos. dataSet es el nombre del objeto DataSet
al cual se le agregarán los datos, mientras que nombre es el
nombre bajo el cual se identificará en DataTable en el que se car-
garán los datos.
Este método devuelve el número de filas actualizadas correcta-
mente en el DataSet.
FillSchema FillSchema(dataSet, esquema As SchemaType)
Agrega un DataTable a un DataSet y configura el esquema para
hacerlo coincidir con el del origen de datos.
El esquema determina la fuente de definiciones para los elemen-
tos de la base de datos de parte del cliente. Puede ser SchemaType.
Mapped, si se desea que se apliquen las asignaciones del
DataAdapter; esta es la opción por omisión, y hace coincidir el
modelo de datos entre el almacén de datos y la copia local.
También puede ser SchemaType.Source, si se desea hacer caso
omiso a las definiciones en DataAdapter.
GetFillParameters GetFillParameters()
Obtiene los parámetros establecidos por el usuario al ejecutar una
instrucción SELECT de SQL.
Update Update(dataSet)
Llama a las instrucciones INSERT, UPDATE o DELETE respec-
tivas para cada fila insertada, actualizada o eliminada en DataSet.
Este método devuelve el número de filas actualizadas
correctamente en el almacén de datos.
538 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Finalize Finalize()

Permite que un objeto Object intente liberar recursos y realizar


otras operaciones de limpieza antes de que el objeto Object sea
reclamado por el recolector de elementos no utilizados.
En C# y C++, los finalizadores se expresan mediante la sintaxis
del destructor.
OnFillError OnFillError()

Provoca el evento FillError.

Eventos

Evento Causas que lo originan

Disposed Se produce cuando el objeto ha sido eliminado.


FillError Se devuelve cuando se produce un error durante una operación de relleno.
RowUpdated Se produce durante Update después de que se ejecute un comando en
el origen de datos. Se hace un intento de actualización, de manera que
se inicia el evento.
RowUpdating Se produce durante Update antes de que se ejecute un comando en el
origen de datos. Se hace un intento de actualización, de manera que
se inicia el evento.

DataSet
Conjunto de datos. El objeto DataSet es el elemento más poderoso de ADO.NET y re-
presenta la copia local y desconectada, residente en memoria, de datos organizados bajo el
modelo relacional.
Al área en memoria donde se almacena la copia local y desconectada de los datos del
DataSet se le llama caché. En dicho espacio, DataSet permite almacenar un pequeño mo-
delo relacional en la memoria del equipo local; su organización se basa en colecciones
Tables, Rows, Columns, Constraints y Relations que simulan lo que en los manejadores de
base de datos relacional se almacena en las tablas del sistema.
A toda la información que especifica cómo se han de almacenar los datos en memoria y a
las restricciones pertinentes se le denomina esquema (schema). Mantener el control del es-
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 539

quema produce muchos beneficios en el ámbito relacional, pero hace que trabajar con
DataSet sea más complejo que trabajar con DataReader. DataSet agrega una capa más de
objetos, lo que exige más recursos del equipo; si su aplicación no amerita trabajar con ba-
ses de datos desconectadas, procure evitar el uso de DataSet.

Miembros más utilizados en DataSet


Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes
miembros:

Propiedades
16
Propiedad Utilidad

CaseSensitive Obtiene o establece un valor que indica si las comparaciones de


cadena en los objetos DataTable distinguen entre mayúsculas y
minúsculas.
EnforceConstrains Obtiene o establece un valor que indica si se siguen las reglas
de restricción al intentar realizar cualquier operación de actua-
lización.
Relations Obtiene la colección de relaciones que vincula las tablas y per-
mite el desplazamiento desde las tablas primarias a las secun-
darias.
Tables Obtiene la colección de tablas incluidas en DataSet.

Métodos
Método Acción que realiza

Clear Clear()

Borra cualquier dato de DataSet mediante el procedimiento de


quitar todas las filas de todas las tablas.
Clone Clone()

Copia la estructura de DataSet, incluidos todos los esquemas,


relaciones y restricciones de DataTable. No copia ningún dato.
540 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Copy Copy()

Copia la estructura y los datos para este DataSet.


Dispose Dispose()

Libera los recursos utilizados por MarshalByValueComponent.


GetXml GetXml()
Devuelve la representación XML de los datos almacenados en
DataSet.

GetXmlSchema GetXmlSchema()

Devuelve el esquema XSD para la representación XML de los


datos almacenados en DataSet.
ReadXml ReadXml()

Lee el esquema y los datos XML del DataSet.


ReadXmlSchema ReadXmlSchema()
Lee un esquema XML en el DataSet.
Reset Reset()

Restablece el estado original del DataSet. Las subclases


deben reemplazar a Reset para restaurar el estado original de un
DataSet.

WriteXml WriteXml()

Escribe datos XML y, de forma opcional, el esquema del


DataSet.

WriteXmlSchema WriteXmlSchema()

Escribe la estructura del DataSet como un esquema XML.

Eventos

Evento Causas que lo originan

Disposed Se produce cuando el objeto ha sido eliminado.


Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 541

Categorías de objetos de DataSet


Las colecciones involucradas con DataSet permiten organizar los objetos para el manejo
de los datos que se encuentran en memoria; dichos objetos se dividen en dos categorías:

❑ Objetos de esquema. Son los que tienen por objeto definir la estructura que alma-
cenará los datos. Se responde a la pregunta, ¿dónde y cómo se guardarán los datos?
a) DataTable
b) DataColumn
c) Constraint
d) Relation
❑ Objetos de datos. Son los que tienen por objeto almacenar los datos. 16
e) DataRow

DataSet y XML
DataSet está muy vinculado a XML por ser éste el convencionalismo utilizado para co-
municar paquetes de datos y organizar el contenido de los objetos en caché. Los datos
en DataSet no se almacenan en formato binario o en tecnología propietaria, sino en
lenguaje XML. Ese hecho permite una universalidad que sin duda facilitará la imple-
mentación de los lenguajes .NET en plataformas distintas a los sistemas operativos de
Microsoft.
Esta vinculación hace necesario establecer la referencia hacia la librería System.Xml.dll
al momento de compilar cualquier programa que haga uso de intercambio de datos con
DataSet. Sobra decir que al trabajar con Visual Studio no es necesario establecer las refe-
rencias manualmente, dado que al detectarse el uso de elementos que requieren la librería,
ésta es incluida.
Los métodos que permiten la funcionalidad XML de DataSet son los siguientes:

❑ GetXML. Devuelve la representación XML de los datos almacenados en DataSet.


❑ GetXMLSchema. Devuelve el esquema XSD para la representación XML de los da-
tos almacenados en DataSet.
❑ ReadXML. Lee el esquema y los datos XML del DataSet.
❑ ReadXMLSchema. Lee un esquema XML en el DataSet.
❑ WriteXML. Escribe datos XML y, de forma opcional, el esquema del DataSet.
❑ WriteXMLSchema. Escribe la estructura del DataSet como un esquema XML.
542 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 16.1
Cargado de datos en un DataSet de forma programática

En este ejercicio realizaremos la carga de datos de un objeto DataSet utilizando un adap-


tador de datos. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS.
Imagine que desea establecer una conexión con la base de datos de prueba Pubs y que se
enlazará utilizando la cuenta de administración sa, cuya contraseña es secreto. La tabla
de la que queremos ver los datos es la tabla Jobs.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Windows Application, llamado Ver-
Puestos.
3. Agregue una rejilla de datos (DataGridView).
4. Distribuya los objetos de la siguiente forma:

5. Modifique las siguientes propiedades:

Propiedad Valor a asignar

Form1.Text Catálogo de Puestos


DataGridView1.Name dgvPuestos
dgvPuestos.ReadOnly True
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 543

La propiedad DataGridView.ReadOnly hace que los objetos sean de sólo lectura, con lo
que evitamos modificaciones inesperadas en el programa.
Haga doble clic en la barra de herramientas del formulario y modifique el programa para
que luzca de la siguiente manera:

Codificación de VerPuestos – Module1.vb

1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6
16
7 Public Class Form1
8
9 Private Sub Form1_Load(ByVal sender As System.Object,
10 ByVal e As System.EventArgs) Handles MyBase.Load
11
12 Dim conn As SqlConnection
13 conn = New SqlConnection()
14 conn.ConnectionString = “Data Source=aprendaws;” & _
15 “Initial Catalog=pubs;Persist Security Info=True;” & _
16 “User ID=sa;Password=secreto”
17 conn.Open()
18
19 Dim Datos As New DataSet
20 Dim Adaptador As New SqlDataAdapter( _
21 “select * from jobs”, conn)
22 Adaptador.Fill(Datos, “Puestos”)
23
24 conn.Close()
25
26 dgvPuestos.DataSource = Datos.Tables(“Puestos”)
27 dgvPuestos.Refresh()
28
29 End Sub
30 End Class

Ejecución guiada de VerPuestos – Module1.vb

8. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
9. De la línea 12 a la 17 se hace una conexión común a la base de datos.
544 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. En la línea 19 se declara un objeto DataSet. En la línea 20 se declara un objeto


DataAdapter, que se encargará de resolver las discrepancias entre la forma en que
DataSet y SQL Server representan el mismo modelo de datos. El constructor recibe
dos parámetros: primeramente se proporciona una consulta de referencia que se alma-
cena directamente en la propiedad SelectCommand de DataAdapter y determina el
contenido de un miembro contenido en DataSet; posteriormente se proporciona la co-
nexión sobre la que se intentarán las operaciones. DataSet constituye para nuestro ob-
jeto DataGridView un origen de datos (data source) en sí mismo y todas sus tablas
constituyen un miembro de datos (data member), que en caso de ser más de uno, de-
berá especificarse de manera explícita.
11. Al aplicar el método DataAdapter.Fill de nuestro adaptador (línea 22), se cargan los
datos contenidos en el almacén de datos a la copia local (DataSet). El constructor re-
cibe dos argumentos: el nombre del DataSet al que será agregado el resultado de la
consulta y el nombre de miembro que se desea asignar a dicho resultado. A fin de
cuentas, al DataSet llamado Datos se le agregó un DataTable que representa el miem-
bro Puestos.
12. Vea cómo la conexión se cierra en la línea 24, pero eso ya no importa, dado que ya te-
nemos los datos de la base en nuestra copia local. Todas las operaciones que podíamos
realizar con el almacén de datos también son posibles ahora en nuestra copia local.
13. En la línea 26 se especifica que el origen de datos de nuestra rejilla es el miembro
Puestos de nuestro DataSet.
14. En la línea 27 se refresca la rejilla de datos a fin de que muestre los datos finales. Si
todo funcionó bien, nuestro programa mostrará los datos.

15. Cierre la aplicación.


FIN DEL EJERCICIO *
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 545

Ejercicio 16.2
Uso de Data Sources, Typed Datasets y relaciones padre-hijo

En este ejercicio realizaremos un actualizador de puestos utilizando las facilidades visua-


les que Visual Studio nos ofrece para el trabajo con bases de datos desconectadas. La tabla
de la cual queremos editar los datos es la de puestos (Jobs); cada registro de la tabla pue-
de estar siendo utilizado por empleados que tienen asignado un puesto (employee), por lo
que entre las tablas existe una relación padre-hijo. Este ejercicio requiere que se haya rea-
lizado el ejercicio 16.1, que definía una conexión a base de datos, que en nuestro caso se
llama aprendaws.pubs.dbo, y en su caso se llamará instancia.pubs.dbo, donde instancia
es el nombre de su servidor SQL Server.
16
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Windows Application, llamado Pues-
tos.
3. Modifique las siguientes propiedades:

Propiedad Valor a asignar

Form1.Text Actualizador de puestos

➤ Creación de un origen de datos (Data Source)

4. Los orígenes de datos (Data Sources) son orígenes de datos basados en DataSet con
tipos (typed DataSet), que pueden ser definidos en tiempo de diseño. Para agregar
un origen de datos, seleccione la opción Data – Show Data Sources (oprima las te-
clas Mayús-Alt-D) y fije la herramienta en el área de trabajo de Visual Studio. Al
crear un origen de datos se agrega al proyecto un archivo XSD, que contendrá la re-
presentación formal del modelo de datos que queremos utilizar en nuestro progra-
ma, en formato XML. Por el momento, nuestro proyecto no posee ningún origen de
datos.
546 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5. En Data Sources haga clic en el vínculo Add New Data Source..., o seleccione la op-
ción Data – Add New Data Source, para agregar un origen de datos al proyecto. Apa-
recerá el asistente Data Source Configuration Wizard, que permite seleccionar entre
diferentes fuentes de datos para el origen de datos: Database, si se trata de una cone-
xión a un almacén físico de datos; Web Service, si se trata de una petición de datos vía
Web, u Object, si se trata de cualquier contenedor de datos reconocido y existente, co-
mo podría ser un objeto de negocio. Lo más común es una base de datos. Seleccione
Database y haga clic en Next>.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 547

6. El asistente nos permitirá seleccionar una conexión de las definidas en nuestra solución.
Seleccione la conexión instancia.pubs.dbo. Nuestra conexión se realiza utilizando la
cuenta sa y la contraseña secreto. En producción es una muy mala práctica utilizar
la cuenta sa de SQL Server; pero peor aún es incluir la contraseña de dicha cuenta en la
cadena de conexión. Por cuestiones de simplicidad incluimos esta práctica, pero en en-
tornos reales no lo haga (más adelante le diremos cómo manejar la conexión en forma
segura). Haga clic en el botón de opción Yes, include sensitive data in the connection
string. Si hace clic en [+] Connection String se dará cuenta de que la cadena de cone-
xión expone información sensible (usuario y contraseña). Haga clic en el botón Next.

16

7. El asistente permitirá almacenar la cadena de conexión en el archivo de configuración


de la aplicación. Por lo pronto tome nota del nombre que le asigna a la conexión en el
archivo de configuración: pubsConnectionString. Haga clic en el botón Next.
548 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

8. El asistente mostrará los elementos de la base de datos que se pueden representar en


un Data Source. Expanda el nodo Tables y seleccione las tablas Employee y Jobs. Vea
cómo el DataSet recibirá el nombre de pubsDataSet. Haga clic en el botón Finish.

9. Al hacer clic Visual Studio generará un Data Source y lo incluirá en su proyecto bajo
la extensión XSD. Además de eso, agregará un archivo de configuración de la aplica-
ción llamado, en el caso de las aplicaciones Windows, app.config. En ese archivo se
agregará la cadena de conexión, para en un futuro poder utilizar la referencia a la cons-
tante que determinamos (pubsConnectionString), y que el usuario y la contraseña de
la conexión no estén expuestos en el código.
10. Vaya a Solution Explorer, identifique el archivo pubsDataSet.xsd y haga doble clic
en él. Aparecerá la representación gráfica del modelo de datos que actualmente tene-
mos en memoria. Como vemos, incluye los campos de las tablas seleccionadas, pero
no sólo eso, ya que además reconoce una relación entre ellas; esto es un gran paso, ya
que en el esquema conectado la representación de relaciones no era posible, dado que
todo era un arreglo bidimensional de datos. Vea cómo también hay reconocimiento de
llaves primarias.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 549

16

11. En Solution Explorer haga doble clic sobre el nodo app.config y compruebe que en
el elemento <configuration> existe otro elemento llamado <connectionStrings>,
que incluye la definición de nuestra cadena de conexión.
12. Vea cómo Data Sources ha experimentado cambios.
550 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Creación de una aplicación de navegación de datos desde


Data Sources

13. Haga doble clic en Puestos – Form1.vb para regresar al formulario en modo de di-
seño.
14. Vea cómo al agregar un origen de datos al proyecto, Data Sources obtiene conte-
nido.

FIGURA 16.2
Data Sources.

15. En Data Sources aparece el DataSet que se definió y, en forma jerárquica, aparecerán las
tablas y las columnas que lo componen. Cada nodo de tabla y campo posee un selector de
estilo que permite determinar la forma en que el objeto aparecerá en una interfaz gráfica. En
el caso de los nodos que representan tablas, se puede seleccionar entre vista de rejilla (Da-
taGridView), detalle de registro individual (Details) o no darle forma en interfaz (None).
16. Seleccione el nodo Jobs y especifique el estilo Details.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 551

16

17. En el caso de los nodos que representan columnas, los estilos disponibles son los si-
guientes:

a) TextBox, para un cuadro de texto


b) ComboBox, para una lista desplegable de opciones
c) Label, para que aparezca como etiqueta
d) LinkLabel, para que aparezca como vínculo
e) ListBox, para que aparezca como una lista de selección
f) DateTimePicker, en el caso de campos de fecha
g) None, en caso de que no queramos que aparezca en la interfaz.

18. Seleccione Jobs.min_lvl y el estilo NumericUpDown. Haga lo mismo con Jobs.


max_lvl. Finalmente seleccione Job_id y seleccione el estilo Label para asegurarnos
que no se modificará directamente la llave primaria. Es recomendable proteger las
llaves primarias, particularmente cuando su modificación implica la necesidad de
cambiar también datos en tablas relacionadas.
552 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Arrastre el nodo Jobs de Data Sources a su formulario y vea lo que pasa.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 553

20. Acaba de crear una interfaz de edición y navegación de datos sin haber utilizado una
sola línea de código. Por cada columna se agregaron objetos que permiten la visuali-
zación y edición de datos; a partir de estos objetos puede modificar propiedades. Por
ejemplo, para el caso de la ilustración anterior, seleccionamos el objeto tipo Label en
el que se mostrará Job_id y le cambiamos la propiedad Label.BorderStyle a
Fixed3D.
21. Vea cómo en la parte baja aparecen los objetos que no tienen representación gráfica en
la interfaz. Se colocó el DataSet que ya teníamos creado (PubsDataSet) y se creó un
manejador de enlace de datos (BindingSource) de nombre JobsBindingSource. Se
creó también un BindingNavigator, de nombre JobsBindingNavigator, que permite
la navegación entre registros. Finalmente tenemos un DataAdapter que permitirá que
los cambios que realicemos en el DataSet de forma desconectada puedan ser envia-
dos al almacén de datos al aplicar el método DataAdapter.Update.
22. Se le llama data bound controls a los elementos de la interfaz involucrados en opera-
16
ciones de enlazado de datos con una fuente de datos; a esto se le conoce como Data
Binding. Al proporcionar un estilo a los elementos en Data Sources, cada elemento
puede ser integrado con un simple arrastrar y colocar en la interfaz; dependiendo del
estilo, se asumirán propiedades estándar que pueden ser modificadas. Si ya se tiene un
control y se desea que opere como data bound control, basta con arrastrar el elemen-
to a enlazar al control, para que la asociación se realice.
23. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
24. La barra de navegación (BindingNavigator) sirve para la navegación entre los regis-
tros de un DataSet y se compone de la siguiente manera:

FIGURA 16.3
Binding
Navigator.
554 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

25. Vaya al final, retroceda cuatro registros y vaya al inicio. Compruebe la forma en que
los registros están asociados a la barra de navegación.
26. Cierre la aplicación.

➤ Adición de registros en modo desconectado y duplicación


de modificaciones al almacén de datos

27. Todo lo que haga con los registros en su interfaz sucederá en la copia local de datos,
es decir, en el DataSet. Cada registro en su DataSet es en realidad un objeto DataRow
que se integra en la colección Rows de algún objeto DataTable. Cada DataRow tiene
una propiedad DataRow.RowState, que puede tener los siguientes valores: Added, si el
registro fue agregado; Deleted, si el registro fue borrado del DataSet; Modified, si
el registro ha sido modificado, y Unchanged, si el registro se mantiene sin cambios.
28. Las tablas de un DataSet pueden reproducir los cambios hechos de forma desconec-
tada a través de un DataAdapter. El DataAdapter posee cuatro propiedades de co-
mando:

a) DataAdapter.SelectCommand
b) DataAdapter.UpdateCommand
c) DataAdapter.DeleteCommand
d) DataAdapter.InsertCommand

Al aplicar el método DataAdapter.Update se hará una revisión de los objetos Data-


Row de la tabla; si DataRow.RowState es Added, se ejecutará el comando establecido
en DataAdapter.InsertCommand sobre el almacén de datos; si es Deleted, se ejecu-
tará el comando DataAdapter.DeleteCommand; si es Modified, se ejecutará el coman-
do DataAdapter.UpdateCommand.
29. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
30. Vea el número de registros que reporta la barra de navegación.

31. Haga clic en agregar (Add new) , en la barra de navegación. Vea cómo en la ba-
rra de navegación se reporta un nuevo registro. En Job desc, coloque Vendedor Se-
nior, en min lvl coloque 70 y en max lvl coloque 100. Este nuevo registro (DataRow)
tendrá un estado (RowState) de agregado (Added).

32. Haga clic en guardar cambios (Save data) , en la barra de navegación. Se dispa-
rará el método DataAdapter.Update del adaptador que controla la información de la
tabla; el proceso revisará el estado de todos los registros que tienen el estado Unchanged.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 555

Sólo encontrará un registro con estado Added, que provocará que se ejecute sobre el
almacén de datos el comando guardado en DataAdapter.InsertCommand. El almacén
de datos estará actualizado, y no hemos tenido la necesidad de codificar nada.
33. Cierre la aplicación.

➤ Generación de interfaz con registros padre-hijo en tiempo


de diseño

34. Colóquese en tiempo de diseño en el formulario.


35. Vea cómo en Data Sources, en la tabla Jobs aparece un nodo que hace referencia a
Employees. Esto quiere decir que de acuerdo con el modelo de datos existe una rela-
ción padre-hijo entre Jobs y Employees.
36. Para incluir en nuestra interfaz la información de los empleados que tienen un deter-
minado puesto, basta con arrastrar a la interfaz el nodo Employee que se encuentra en
16
Jobs. Es importante notar que el estilo que tiene asignado el nodo corresponde a Da-
taGridView, por lo que se agregará a la interfaz en forma de rejilla.
37. Desde Data Sources, arrastre el nodo Employee que se encuentra en Jobs, abajo de los
controles de detalle que la interfaz ya tiene. Acomode los objetos de su interfaz de tal
forma que luzca de la siguiente manera:
38. Vea cómo se agregó un manejador de enlace de datos de empleados (EmployeeBin-
556 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

dingSource), así como un DataAdapter, por si se editan los datos desde la rejilla de
datos que acabamos de agregar.
39. Construya la solución (oprima las Ctrl-Mayús-B). Establezca el nuevo proyecto co-
mo proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado
en la solución (Ctrl-Mayús-S). Inicie la depuración para comprobar el comporta-
miento de su programa (F5).
40. Utilice la barra de navegación a discreción y vea la manera en que se enlazan dinámi-
camente los registros de ambas tablas. En caso de que existan empleados con un de-
terminado puesto, se mostrarán en la rejilla, cuando el puesto que tiene esté en los
campos de detalle.
41. Nuestra interfaz se ve de la siguiente manera:

FIN DEL EJERCICIO *

Ejercicio 16.3
Actualizador de registros con Data Sources y enlazado de datos a un
cuadro combinado

En este ejercicio realizaremos un actualizador de ventas de títulos, utilizando Data Sour-


ces. Se verá la forma en que se pueden agregar expresiones a un origen de datos. Este ejer-
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 557

cicio requiere que se haya realizado el ejercicio 16.1, que definía una conexión a base de
datos, que en nuestro caso se llama aprendaws.pubs.dbo, y en su caso se llamará instan-
cia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Windows Application, llamado Ven-
tas.
3. Modifique las siguientes propiedades:

Propiedad Valor a asignar

Form1.Text Registro de ventas

4. Agregue el origen de datos que requiere el programa. Abra la herramienta Data Sour- 16
ces, con la opción Data – Show Data Sources (oprimas las teclas Mayús-Alt-D); fije
la herramienta en el área de trabajo de Visual Studio.
5. En Data Sources haga clic en el vínculo Add New Data Source..., o seleccione la op-
ción Data – Add New Data Source, para agregar un origen de datos al proyecto. Apa-
recerá el asistente Data Source Configuration Wizard. Seleccione Database y haga
clic en Next>.
6. Seleccione la conexión instancia.pubs.dbo. Haga clic en el botón de radio Yes, inclu-
de sensitive data in the connection string. Haga clic en el botón Next.
7. El asistente permitirá almacenar la cadena de conexión en el archivo de configuración de
la aplicación. Deje el nombre que se propone por omisión y haga clic en el botón Next.
8. El asistente mostrará los elementos de la base de datos que se pueden representar en un
Data Source. Expanda el nodo Tables y seleccione las tablas Sales, Stores y Titles.
Vea cómo el DataSet recibirá el nombre de pubsDataSet. Haga clic en el botón Finish.

➤ Personalización de cuadros combinados de tablas relacionadas

9. En Data Sources deberán aparecer las tablas que se seleccionaron. Modifique el es-
tilo de Sales a Detail y modifique el estilo de sales.stor_id a ComboBox. Los es-
tilos deben quedar de la siguiente manera:
558 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Arrastre Sales a la interfaz, que deberá lucir de la siguiente forma:

11. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha reali-
zado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
12. Vea cómo en el cuadro combinado asociado a stor id aparecen los códigos, y no las
descripciones, de la tienda. Por un lado eso es correcto, ya que en la tabla se almace-
na la clave y no la descripción; por otro lado, es antiestético y poco claro. Lo ideal es
que se vean las descripciones, pero que se manejen internamente las claves.
13. Cierre la aplicación.
14. Cuando trabajamos con datos enlazados a un almacén de datos, estamos ante lo que se
conoce como Data Binding. Las principales propiedades que entran en juego en ope-
raciones de enlazado de datos son las siguientes:

Propiedad Función

DataSource Representa el objeto que actuará como fuente de datos. Puede


ser un elemento de datos en memoria (DataSet, DataTables,
etc.) o flujos de datos (DataReader).
DisplayMember Representa el objeto que provee el contenido a mostrar en el
objeto.
ValueMember Representa el objeto que provee el dato que internamente
constituye el valor del control, para su utilización en
procesamiento.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 559

DataBindings Representa la colección de enlaces que se llevan a cabo a través


del objeto.
SelectedIndex Representa el subíndice del elemento seleccionado.
SelectedValue Representa el valor del elemento seleccionado.

15. En tiempo de diseño seleccione el cuadro combinado asociado a stor id y despliegue el


menú de acciones del control. Marque la casilla de verificación Use data bound items.

16

16. Al activar la casilla de verificación aparecen las propiedades involucradas en el enla-


zado de datos.
17. Seleccione en Data Sources el nodo Other Data Sources – Project Data Sources
– pubsDataSet – stores.
560 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Al hacer la selección se genera un nuevo enlace, al que se le da el nombre de stores-


BindingSource. Cada enlace que hacemos tendrá su propio identificador.
19. Para Display Member seleccione stor_name, y en Value Member seleccione stor_id.
En Selected Value seleccione salesBindingSource – stor_id, que es el id que le
corresponde al registro.
20. Finalmente, en Properties busque el grupo de propiedades DataBindings y seleccio-
ne None para que el texto que aparezca en el cuadro combinado sea el que le corres-
ponde de acuerdo con los datos enlazados.

21. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas CTRL-MAYÚS-S). Inicie la depuración para comprobar
el comportamiento de su programa (tecla F5).
22. Navegue entre los registros y vea cómo en lugar de stor_id aparece stor_name. Si ha-
cemos clic en el combo, aparecerán todas las tiendas de las cuales podemos seleccio-
nar alguna.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 561

23. Cierre la aplicación.


FIN DEL EJERCICIO *
16
562 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 563

TERMINOLOGÍA

AcceptChanges, 536 DataBindings, 559 Dispose, 537, 540 ReadXmlSchema,


Adaptador de DataColumn, 530, Disposed, 538, 540 540-1
datos, 535 541 DuringFill, 536 Relation(s), 539, 541
Add, 531 DataColumn- EnforceConstraints, Remove, 531
CaseSensitive, 539 Collection, 530 539 Reset, 540
Clear, 531, 539 DataRelation, 530 Esquema, 538 Rows, 530
Clone, 539 DataRelationCollec- objetos de, 541 RowUpdated, 538
Constraint, 530, 541 tion, 530 Fill, 535, 537 RowUpdating, 538
ConstraintCollection, DataRow, 541 FillSchema, 535, 537 Schema, 538
530 DataRowCollection, Finalize, 538 SelectCommand,
Contains, 531 530 GetFillParameters, 536
Copy, 540 DataSet sin tipos, 537 SelectedIndex, 559
16
CopyTo, 531 535 GetXml, 540-1 SelectedValue, 559
Count, 531 DataSource, 558 GetXmlSchema, Tables, 539
Data DataTable, 530, 541 540-1 Untyped DataSet,
Binding, 553 DataTableCollection, InsertCommand, 535
bound controls, 530 536 Update, 537
553 DataView, 530 Item, 531 UpdateCommand,
Source Datos, objetos de, Objetos 536
Configuration 541 de esquema, 541 ValueMember, 558
Wizard, 546 DeleteCommand, de datos, 541 WriteXml, 540-1
Sources, 550 536 OnFillError, 538 WriteXmlSchema,
DataAdapter, 535 DisplayMember, 558 ReadXml, 540-1 540-1
564 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

PREGUNTAS
16.1 Mencione los objetos que componen el modelo de objetos DataSet.
16.2 Mencione qué colecciones permiten la organización de objetos Data Set.

16.3 Mencione para qué sirve DataAdapter y cuáles son sus miembros más importantes.
16.4 Mencione cuáles son los miembros más importantes de DataSet.
16.5 Mencione qué métodos de DataSet permiten la integración de XML.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 565

Notas:

16
566 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Es el objeto más importante del Modelo de Objetos DataSet:
a) DataAdapter
b) DataSet
c) DataRow

2. No forma parte del Modelo de Objetos DataSet:


a) DataAdapter
b) DataTable
c) DataRow

3. La colección Rows tiene dependencia con el objeto:


a) DataSet
b) DataTable
c) DataAdapter

4. La variable de trabajo utilizada por For Each debe ser:


a) .De la misma naturaleza (tipo) que los objetos referidos por la colección que se desea explorar
b) .Un Object genérico
c) .DataTable

5. En una aplicación de base de datos, es necesario incluir la siguiente librería sólo si se trabaja con
DataSet:
a) System.Data.dll
b) System.Windows.Forms.dll
c) System.Xml.dll

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Para leer información, DataSet es más rápido que DataReader.

7. Cada objeto DataTable posee su propia colección Rows.

8. El uso de DataAdapter es opcional cuando se quiere cargar información de un alma-


cén de datos a un DataSet.

9. DataSet utiliza HTML para la comunicación de paquetes de datos autodescriptivos.

10. Sólo a través de DataSet podemos disponer de un modelo de datos relacional en me-
moria local (caché).
CAPÍTULO 17
Manejo de bases de datos
desde aplicaciones Web
Objetivos: Aprender el manejo de bases de datos en modo parcialmente
conectado utilizando ASP.NET.

1. Conocerá los Data Source Controls y su función.


2. Conocerá los Data Bound Controls.
3. Aprenderá la forma en que conviven los Data Source Controls y Data
Bound Controls.
4. Aprenderá a desarrollar aplicaciones de actualización de bases de datos
con el máximo uso de las herramientas de Visual Studio.

567
568 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Data Source Controls y Data Bound Controls. . . . . . . . . . . . . . . . . . . . . . . . . 569
Data Source Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Data Bound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Establecimiento de un enlazado de datos hacia un GridView . . 572
➤ Adición y configuración de un SqlDataSource . . . . . . . . 572
➤ Adición y configuración de un GridView . . . . . . . . . . . . 576
Actualizador de bases de datos desconectadas con ASP.NET . . . 579
➤ Adición y configuración de un objeto DetailsView . . . . 580
➤ Personalización de campos en DetailsView . . . . . . . . . . 581
➤ Análisis de las plantillas de los campos en DetailsView . 584
➤ Establecimiento de los comandos para la afectación
de datos vía SqlDataSource . . . . . . . . . . . . . . . . . . . . . . 587
➤ Especificación de la funcionalidad disponible en
DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 569

Uno de los aspectos que mayores cambios experimentó .NET Framework, con respecto a
la versión 1.1, es el desarrollo en ASP.NET. Son tantos los cambios introducidos en la ver-
sión 2.0 de .NET Framework que se ha dado la diferencia en nombre: ASP.NET 2.0.
ASP.NET redujo la cantidad de programación al máximo, permitiendo la mayor cantidad
de funcionalidad con un mínimo de líneas de código escritas por el desarrollador. En el ca-
so del soporte a las aplicaciones de base de datos, el cambio es exponencial. Si además de
eso estamos desarrollando en Visual Studio, el código es, prácticamente, cosa del pasado
(al menos en la capa de presentación de las aplicaciones y el enlazado de datos).

Data Source Controls y Data Bound Controls


En ASP.NET se aceptan todos los objetos de acceso a datos ADO.NET para el trabajo en
modo conectado; sin embargo, podemos aprovechar la simplicidad que ofrece ASP.NET
para el manejo complejo de datos.
Esto significa que de forma declarativa, es decir con base sobre todo en etiquetas de hiper-
texto en una página, se pueden especificar tareas que con anterioridad requerían de progra-
mación. En ASP.NET no se requiere codificar nada para realizar las siguientes actividades
relacionadas con los datos:
17
1. Seleccionar y desplegar datos.
2. Ordenar, paginar y guardar datos en caché.
3. Actualizar, insertar y eliminar datos.
4. Aplicar filtros de datos en tiempo de ejecución.
5. Crear escenarios de registro maestro–detalle.

Data Source Controls


Se conoce como Data Source Controls a los controles Web que permiten la conexión con
un almacén de datos, así como a las operaciones de lectura y escritura. Los principales Da-
ta Source Controls son los siguientes:

Data Source Control Descripción

ObjectDataSource Representa un origen de datos basado en objetos de negocio.


Es cuando los datos no se reciben de un proveedor de datos
.NET, sino de un objeto o clase.
SqlDataSource Representa un acceso a bases de datos vía los proveedores
de datos ADO.NET (managed data providers como
OleDbClient, SQLClient, OracleClient, etcétera)
570 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

AccessDataSource Representa un acceso a una base de datos en Microsoft


Access.
XMLDataSource Representa el consumo de datos desde un archivo XML, es-
pecialmente diseñado para su utilización desde controles
Web jerárquicos como TreeView o Menu.
SiteMapDataSource Representa un conjunto de datos utilizable en el mecanismo
de navegación entre páginas de ASP.NET

Data Bound Controls


Se conoce como Data Bound Controls a los controles que sirven como un canal de acceso
directo a un origen de datos desde el navegador; este tipo de controles se enlazan a una de-
terminada fuente de datos y mantienen los contenidos actualizados de forma dinámica,
conforme el usuario hace variaciones en los apuntadores de datos y registros.
Los Data Bound Controls guardan una estrecha relación con los Data Source Controls,
ya que de éstos obtienen los datos a enlazar. Es necesario especificar el Data Source Con-
trol que alimenta de datos al Data Bound Control a través de la propiedad DataSourceId.
Algunos de los Data Bound Controls principales son los siguientes:

Data Source Control Descripción

BulletedList Muestra los datos en forma de una lista de viñetas.


CheckBoxList Muestra los datos en forma de una lista de selección, en donde
cada elemento es una casilla de verificación.
DropDownList Muestra los datos en forma de una lista desplegable de selec-
ción (combo).
ListBox Muestra los datos en forma de una lista de selección de tamaño
fijo.
RadioButtonList Muestra los datos en forma de un conjunto de botones de opción.
AdRotator Muestra anuncios publicitarios.
DataList Muestra los datos en forma de tabla. Cada elemento es mos-
trado de acuerdo a una plantilla (template) que es definida
por el usuario.
DetailsView Muestra un registro de datos en forma tabular y permite la
edición, eliminación e inserción de registros.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 571

FormView Muestra un registro de datos en forma personalizada y per-


mite la edición, eliminación e inserción de registros.
GridView Despliega datos en una tabla y permite edición, actualiza-
ción, ordenación y paginado.
Menu Muestra un menú dinámico.
Repeater Muestra datos en forma de una lista cuyo formato puede per-
sonalizarse usando plantillas.
TreeView Muestra datos en forma de un árbol jerárquico de nodos.

Dependiendo del objeto de que se trate serán las propiedades que se deban establecer pa-
ra el manejo de datos desde la Web.

En el caso de objetos de lista de selección (BulletedList, CheckBoxList, DropDownList,


ListBox y RadioButtonList) cada registro de la fuente de datos (Row) representará un
elemento (Item) del objeto. Los elementos se almacenarán en una colección llamada
Items. 17
Cada registro de la fuente de datos contendrá campos (Fields), que pueden jugar un papel
importante en el manejo enlazado; por ejemplo, generalmente la información textual que
se ve en la interfaz no es lo que deseamos que internamente se maneje para los procesos y
el almacenamiento. Para especificar el campo que queremos que se muestre en la interfaz
utilizamos la propiedad ListControl.DataTextField; para especificar el campo que el
programa utiliza para efectos de procesamiento y almacenamiento, utilizamos la propiedad
ListControl.DataValueField.

Cuando se selecciona un elemento, el índice del elemento se almacena en la propiedad


ListControl.SelectedIndex, el elemento se almacena en ListControl.SelectedItem y
el valor del elemento se almacena en la propiedad ListControl.SelectedValue.
El evento predeterminado de este tipo de objetos es ListControl.SelectedIndexChanged,
que sucede cuando el elemento seleccionado cambia.

El método WebControl.DataBind es el que realiza el enlazado entre el Data Source Con-


trol y el Data Bound Control.
572 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 17.1
Establecimiento de un enlazado de datos hacia un GridView

En este ejercicio se realiza un enlazado a un objeto GridView, para mostrar el contenido de


un origen de datos de forma tabular, con paginación y con posibilidad de ordenamiento. El
enlazado que se realiza es de una vía, ya que sólo se realizan actividades de lectura.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, invoque
el menú de contexto, seleccione la opción Add New Item y agregue una Web Form de
nombre Enlazado01.aspx.

➤ Adición y configuración de un SqlDataSource

3. Agregue a la interfaz un objeto SqlDataSource. El objeto se agregará a la interfaz.


Utilice la smart tag del control y seleccione la opción Configure Data Source.

4. Aparecerá el asistente de configuración de Data Source. Haga clic en New Connec-


tion, a fin de definir una nueva conexión para nuestros proyectos Web.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 573

5. Aparecerá el asistente de conexión. Coloque el nombre de su servidor en Server


Name. En nuestro caso es APRENDAWS, aunque usted deberá especificar el pertinente.
Se elige Use SQL Server Authentication y se proporciona el usuario y la contraseña
de acceso. Elija Select or enter a database name y especifique pubs como base de da-
tos de trabajo. Presione Test connection para comprobar que la conexión es posible.
Si la conexión es satisfactoria, haga clic en el botón Ok, con lo que aparecerá nueva-
mente el asistente de configuración de conexión.

17
574 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. El nombre que se le asignó a su conexión es aprendaws.pubs.dbo. Haga clic en el bo-


tón Next.

7. Se recomienda que la conexión se almacene como variable en el archivo de configura-


ción, que en el caso de Web se trata de Web.config. El asistente solicitará el nombre
que deseamos darle a la conexión en el archivo de configuración. Asegúrese de que la
casilla de verificación Yes, save this connection as esté seleccionada, y escriba en el
cuadro de texto el nombre ConexionDBWeb.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 575

8. La conexión nos servirá para trabajar con datos de alguna tabla de la base de datos
pubs. Seleccione la opción Specify columns from a table or view y en el cuadro com-
binado de nombres de tabla seleccione sales (ventas). Al hacer esto aparecerán las co-
lumnas de la tabla en el espacio Columns; marque la casilla de verificación que mues-
tra un asterisco con el fin de que se incluyan todas las columnas de la tabla. Haga clic
en el botón Next.

17

9. Aparecerá en el asistente una ventana de prueba. Haga clic en Test query y vea si los
datos se extraen satisfactoriamente. En caso de que así sea, haga clic en el botón Finish.
576 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Con esto ya ha quedado configurada una conexión que puede ser utilizada por nuestra
aplicación a través del objeto SqlDataSource1, y que mostrará las ventas de libros que
se encuentran almacenadas en la base de datos pubs.

➤ Adición y configuración de un GridView

11. Agregue a la interfaz un objeto GridView. Organice los objetos en la página de tal ma-
nera que luzca de la siguiente manera:

12. Utilice la smart tag de GridView y modifique Choose Data Source, eligiendo SqlDa-
taSource1, que es el nombre de nuestro objeto de origen de datos.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 577

13. Al seleccionar el origen de datos, automáticamente cambiará el contenido del Data-


View, mostrando un contenido ajustado a la información contenida en el Data Source.

14. En la smart tag de GridView seleccione Auto Format. En la lista Select a scheme, se-
leccione la opción Rainy Day y haga clic en el botón Ok. De esa forma le habremos
proporcionado un formato a nuestros datos.

17

15. En la smart tag de GridView marque las casillas de verificación Enable paging y Ena-
ble sorting, para que sea posible paginar el contenido y ordenar los datos cuando ha-
gamos clic en el encabezado de la rejilla de datos.

Ejecución guiada de http://localhost/apvbnetvs/ – Enlazado01.aspx

16. Utilice Solution Explorer para establecer http://localhost/apvbnetvs/ como pro-


yecto de inicio de la solución (StartUp Project). Seleccione la página Enlaza-
578 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

do01.aspx como página de inicio (Set as Start Page). Guarde todos los cambios que
ha realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración pa-
ra comprobar el comportamiento de su programa (tecla F5).

17. En la barra inferior del GridView aparecen vínculos que refieren a las páginas de
datos. Haga clic en dichos vínculos para que aprecie cómo el contenido de la tabla sa-
les se ha distribuido en varias páginas; seguramente la última página posee menos ele-
mentos que las demás.
18. En la parte superior de GridView aparecen los encabezados en forma de vínculos. Al
hacer clic en ellos los datos se ordenarán por dicha columna.
19. Cierre la aplicación.
20. En este ejercicio vimos cómo se generó un Data Source Object (SqlDataSource) y
cómo se utilizó a través de un Data Bound Control (GridView).
FIN DEL EJERCICIO *
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 579

Ejercicio 17.2
Actualizador de bases de datos desconectadas con ASP.NET

Este ejercicio realiza un actualizador de registros (altas, bajas, cambios y consultas), utili-
zando las facilidades que Visual Studio provee a ASP.NET. En este ejercicio se realiza un
enlazado de datos de dos vías, dado que se realizan operaciones de lectura y escritura.

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, desplie-
gue el menú contextual, seleccione la opción Add New Item y agregue una Web Form
de nombre Enlazado02.aspx.
3. Agregue a la interfaz un objeto SqlDataSource. Utilice la smart tag del control y se-
leccione la opción Configure Data Source.
4. En el asistente, seleccione ConexionDBWeb en la pregunta Which data connection
should your application use to connect to the database? y haga clic en el botón Next.

17

5. Seleccione la tabla jobs y especifique que desea trabajar con todos los campos de la
tabla (*). Haga clic en el botón Next.
580 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Haga clic en el botón Finish para concluir con la definición del SqlDataSource. El
nombre del origen de datos será SqlDataSource1.

➤ Adición y configuración de un objeto DetailsView

7. Agregue un objeto DetailsView a la interfaz. Se le asignará el nombre DetailsView1


de manera predeterminada.
8. La clase DetailsView permite definir un objeto que muestra un registro a la vez pro-
veniente de un origen de datos; con este objeto es posible proporcionar formato están-
dar basado en plantillas (templates) e instrumentar acciones de edición, borrado e in-
serción de registros.
9. En conjunto con SqlDataSource, DetailsView se encarga de crear internamente un
DataSet, construir objetos de recopilación de datos y lanzar comandos de actualiza-
ción al almacén físico de datos.
10. Utilizando la smart tag de DetailsView, en Choose Data Source elija SqlDataSour-
ce1, que es el origen de datos que ya definimos.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 581

11. Automáticamente se habrán colocado los campos que contiene SqlDataSource en for-
ma de parejas de valores. En términos generales, cada línea del objeto DetailsView
es un campo (Field), se pueden agregar campos que no están definidos en SqlData-
Source e incluso se pueden agregar campos relacionados con el comportamiento de
DetailsView con respecto a las actividades de edición, eliminación e inserción de re-
gistros nuevos.
12. Utilizando los delimitadores de tamaño, aumente el ancho del objeto DetailsView1.
13. Utilizando la smart tag de DetailsView1 seleccione Auto Format... y luego el forma-
to Slate.

17

14. Nuestra interfaz debe lucir de la siguiente forma:

➤ Personalización de campos en DetailsView

15. Utilizando la smart tag de DetailsView1, seleccione la opción Edit Fields.., para edi-
tar los campos involucrados en la interfaz. Aparecerá la ventana Fields. Esta herra-
582 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mienta se compone de tres elementos principales: la lista de campos disponibles (Avai-


lable fields), que permite seleccionar los objetos que han de verse en la interfaz
que representa DetailsView1; la lista de campos seleccionados (Selected fields),
que permite seleccionar los campos que ya han sido integrados a la interfaz a través
de DetailsView1; y las propiedades de campos enlazados (BoundField properties),
que permite modificar las propiedades de los campos enlazados.

16. El vínculo Convert this field into a TemplateField es un elemento fundamental de la


ventana Fields, dado que permite manejar un campo de DetailsView como objeto
TemplateField. Los objetos TemplateField son campos personalizados que permiten
la visualización y el uso de un control enlazado, habilitando comportamientos varia-
dos a partir de plantillas (templates). Esto implica que un mismo control enlazado pue-
de verse y comportarse de diferente manera, de acuerdo con la plantilla que le aplique-
mos en un momento dado.
17. Al seleccionar un campo en Selected fields, las propiedades de este elemento se mues-
tran y editan en BoundField properties. En nuestro caso, los campos devueltos por
SqlDataSource1 aparecen en la lista Selected fields (éstos fueron agregados automá-
ticamente).
18. Elija en Selected Fields el campo job_id. En BoundField properties busque la pro-
piedad HeaderText y coloque el valor Id del puesto: oprima la tecla Intro para acep-
tar. Haga clic en el vínculo Convert this field into a TemplateField, para disponer de
varias máscaras de comportamiento para job_id. Vea cómo la referencia del campo
cambia en Selected Fields, tanto en la descripción como en el icono.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 583

19. Repita el procedimiento para los demás campos. Elija en Selected Fields el campo
job_desc. Modifique en BoundField properties la propiedad HeaderText, colocando el
valor Descripción:, y haga clic en el vínculo Convert this field into a TemplateField. 17
20. Elija en Selected Fields el campo min_lvl. Modifique en BoundField properties la
propiedad HeaderText, colocando el valor Nivel mínimo:, y haga clic en el vínculo
Convert this field into a TemplateField.
21. Elija en Selected Fields el campo max_lvl. Modifique en BoundField properties la
propiedad HeaderText, colocando el valor Nivel máximo:, y haga clic en el vínculo
Convert this field into a TemplateField.
22. En Available fields seleccione el nodo CommandField. Haga clic Add. CommandField
permitirá controlar las operaciones de su interfaz.
23. Elija en Selected Fields el campo CommandField, y en BoundField properties, cam-
bie las siguientes propiedades:

Propiedad Valor a asignar

ButtonType Button
CancelText Cancelar
DeleteText Borrar registro
EditText Modificar datos
InsertText Insertar
NewText Nuevo registro
SelectText Consulta
UpdateText Actualizar
584 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

24. Haga clic en el botón Ok. Nuestra interfaz debe lucir de la siguiente forma:

➤ Análisis de las plantillas de los campos en DetailsView

25. Ya ha preparado su objeto DetailsView para el manejo de datos y el diálogo con el ob-
jeto SqlDataSource. Para que las operaciones que realicemos en DetailsView se tras-
laden al almacén de datos, es necesario que definamos las instrucciones SQL que han
de aplicar al momento de presionar tal o cual botón de la interfaz (además, seguramen-
te las instrucciones SQL que proporcionemos requieren los valores que estamos mane-
jando en la interfaz).
26. Lo primero que debemos saber es el nombre de los objetos a través de los cuales
DetailsView manejará los campos de SqlDataSource. Para ello, en la smart tag de
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 585

DetailsView1 seleccione Edit Templates, con lo cual se mostrará un selector de plan-


tillas.

27. En el cuadro combinado Display de la smart tag seleccione Field[0] - Id del puesto:.

17

28. Con ello se mostrarán todas las vistas y comportamientos disponibles para el campo Id
del puesto. Vea cómo existen distintas formas en que el campo puede verse y compor-
tarse. ItemTemplate será la vista general del campo, AlternatingItemTemplate es la
forma en que lucirá el campo en caso de alternado de colores, EditItemTemplate es
la forma en que lucirá en caso de que se proceda a la edición del campo, InsertItem-
Template es la forma en que se manejará el campo en caso de inserción de registros y
HeaderTemplate es la forma en que aparecerá el encabezado del campo.
586 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

29. Visual Studio ha detectado que jobs_id (campo al que se enlaza el campo de
DetailsView1) es de tipo identity en la base de datos, por lo que no puede hacer otra
cosa que mostrar el dato de dicho campo.
30. Utilizando la smart tag de DetailsView1, en Display, seleccione Field[1] – Des-
cripción. Vea cómo este campo admite operaciones de edición en la base de datos e
incluye cuadros de texto en los escenarios de edición e inserción.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 587

31. Haga clic sobre el cuadro de texto (TextBox) del escenario EditItemTemplate. Des-
pliegue Properties (oprima la tecla F4) y vea cuál es el valor de la propiedad Id del
cuadro de texto donde se manejará el campo job_desc. El objeto se llama TextBox1.
Si revisáramos todos los objetos que manejan los campos, tendríamos lo siguiente:

Campo en la base de datos Campo en DetailsView1 Control en Templates

job_id Id del Puesto Label1

job_desc Descripción TextBox1

min_lvl Nivel mínimo TextBox2

max_lvl Nivel máximo TextBox3

32. Despliegue la smart tag de DetailsView1 y seleccione el vínculo End Template Editing.

➤ Establecimiento de los comandos para la afectación


de datos vía SqlDataSource
33. En tiempo de diseño seleccione el objeto SqlDataSource1. Abra Properties (oprima
la tecla F4). 17
34. Modifique el valor de la propiedad DeleteQuery, haciendo clic en el botón que des-
pliega el Command and Parameter Editor .

35. Haga clic en el botón Query Builder para que Command and Parameter Editor le
asista en la elaboración de la instrucción de eliminado de datos. Aparecerá la ventana
588 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Add Table, en la cual se especifican las tablas involucradas en la instrucción SQL a


construir. Seleccione jobs y haga clic en Add. Se integrarán las tablas a Query Buil-
der, por lo que puede cerrar Add Table haciendo clic en Close.

36. Query Builder se divide en cuatro secciones o paneles (panes): el de diagrama, el de


selección y asignación, el de instrucción textual y el de los resultados de la ejecución
del comando. En el panel de selección y asignación seleccione en Column el campo
job_id, en Table escriba jobs y en Filter escriba =@job_id. Haga clic en el botón Ok.
para regresar a Command and Parameter Editor. Automáticamente se actualizará la
instrucción SQL, quedando como sigue:

FIGURA 17.1
Estructura de
Query Builder –
Panes.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 589

37. La instrucción SQL que auxiliará a SqlDataSource en la eliminación de datos ha que-


dado como sigue:

DELETE FROM jobs WHERE (job_id = @job_id)

38. Como puede darse cuenta, se está haciendo uso de un parámetro que no ha sido decla-
rado en ninguna parte (@job_id).
39. Haga clic en el botón Add Parameter de Command and Parameter Editor. Se agrega-
rá un parámetro en Parameters. Escriba en la columna Name el nombre del parámetro
@job_id. En el cuadro combinado Parameter source seleccione Form, lo que indica que
se tomará el valor que se tenga en el formulario que dinámicamente creará Details-
View1. Finalmente, escriba en FormField el nombre del campo que en las plantillas
contiene la información de job_id, es decir Label1. Haga clic en el botón Ok.

17

40. De esta forma, el comando interactúa con DetailsView1 para construir la instrucción
SQL que se ejecutará sobre el almacén de datos vía SqlDataSource1. El comando, ob-
viamente, eliminará el registro en que nos encontremos.
41. Modifique el valor de la propiedad InsertQuery, haciendo clic en el botón que invo-
ca el Command and Parameter Editor . Utilice Query Builder para la construc-
ción de la instrucción INSERT. Seleccione la tabla jobs nuevamente y seleccione sólo
los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado que
la llave primaria es identity. Vea cómo al seleccionar los campos en el diagrama, éstos
se agregan en el panel de selección y asignación. Para cada una de las columnas se de-
berá especificar un parámetro con el mismo nombre, anteponiendo el símbolo de arro-
ba. Los parámetros se colocarán en la columna New Value. Presione el botón Ok.
590 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

42. La instrucción SQL que auxiliará a SqlDataSource en la inserción de datos ha queda-


do de la siguiente manera:

INSERT INTO jobs(job_desc, min_lvl, max_lvl)


VALUES (@job_desc, @min_lvl, @max_lvl)

43. Agregue los parámetros que acabamos de definir en la instrucción (@job_desc,


@min_lvl, y @max_lvl). Al igual que el parámetro @job_id, estos parámetros recibi-
rán los datos de la forma (Form), con los Form fields siguientes: TextBox1, TextBox2
y TextBox3, respectivamente.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 591

44. Modifique el valor de la propiedad UpdateQuery, haciendo clic en el botón que invo-
ca el Command and Parameter Editor . Utilice Query Builder para la construc-
ción de la instrucción UPDATE. Seleccione la tabla jobs nuevamente y seleccione sólo
los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado
que la llave primaria es identity y no se puede modificar. Vea cómo al seleccionar los
campos en el diagrama, éstos se agregan en el panel de selección y asignación; para
cada una de las columnas se deberá especificar un parámetro con el mismo nombre,
anteponiendo el símbolo de arroba. Los parámetros se colocarán en la columna New
Value . Oprima el botón Ok.
45. En este caso es muy importante no olvidar el filtro de modificación en el panel de se-
lección y asignación para evitar la sustitución de valores para todos los registros. Des-
pués de los campos que se han agregado automáticamente agregue manualmente
job_id en Columns y jobs en Table; no seleccione la casilla de verificación Set y en
Filter escriba =@job_id.

17

46. La instrucción SQL que auxiliará a SqlDataSource en la modificación de datos ha que-


dado como sigue.

UPDATE jobs SET job_desc = @job_desc, min_lvl = @min_lvl,


max_lvl = @max_lvl WHERE (job_id = @job_id)

47. Agregue los parámetros que acabamos de definir en la instrucción (@job_desc,


@min_lvl, @max_lvl y @job_id). Estos parámetros recibirán los datos de la forma
(Form) con los siguientes Form fields: TextBox1, TextBox2, TextBox3 y Label1, res-
pectivamente.
592 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

48. SqlDataSource ya es capaz de ejecutar instrucciones SQL sobre el almacén de datos,


en coordinación con los valores que recopilará DetailsView.

➤ Especificación de la funcionalidad disponible en DetailsView

49. Ya que hemos realizado las definiciones que hacen posible que DetailsView y SqlDa-
taSource manejen todas las opciones de un actualizador, es necesario indicarle a la pá-
gina qué funciones queremos disponibles.
50. Desde la smart tag de DetailsView1, marque las casillas de verificación Enable Paging
para que la muestra de registros admita paginación; Enable Inserting, para que se per-
mita insertar nuevos registros; Enable Editing, para que se permita la modificación de
datos; y finalmente Enable Deliting, para que se permita la eliminación de registros.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 593

Ejecución guiada de http://localhost/apvbnetvs/ – Enlazado02.aspx

51. Utilizando Solution Explorer establezca el proyecto http://localhost/apvbnetvs/


como proyecto de inicio de la solución (StartUp Project); seleccione la página Enla-
zado02.aspx como página de inicio (Set as Start Page). Guarde todos los cambios
que ha realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración
para comprobar el comportamiento de su programa (tecla F5).
52. Inicialmente se puede observar que DetailsView está haciendo el enlazado y la infor-
mación se muestra en el formato especificado.

17

53. Haga clic en los vínculos numerados de la parte baja de DetailsView. Esos vínculos
son de paginación; corresponde un vínculo a cada uno de los registros extraídos del ori-
gen de datos. Lo que vemos está en memoria, en un objeto DataSet (estamos trabajan-
do de forma desconectada).
54. Haga clic en el botón Nuevo registro. Cambiará la interfaz, mostrando los campos en
el contexto de inserción de datos, InsertItemTemplate. Escriba en Descripción el da-
to Programador AP; en Nivel mínimo escriba 60; en Nivel máximo escriba 100. Haga
clic en el botón Insertar.
594 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

55. Al hacer clic en Insertar, DetailsView le proporciona los valores de parámetro al co-
mando SQL asignado a la propiedad InsertQuery de SqlDataSource1, e intenta el
método Update sobre el DataSet de trabajo. Al hacerlo, el comando de inserción re-
produce la instrucción SQL de agregado de datos sobre el almacén de datos físicos. En
resumen, hemos agregado un registro a una base de datos en modo desconectado.
56. Utilice la paginación hasta que vea el registro que acaba de agregar. El id asignado
puede variar, dependiendo de los registros que tenga en su base.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 595

57. Haga clic en Modificar datos. En Descripción cambie a Programador AP-DEV, en Ni-
vel mínimo a 70 y en Nivel máximo a 120. Haga clic en el botón Actualizar.

58. Utilice la paginación para colocarse en el registro que acaba de modificar y vea cómo 17
los datos se han actualizado.

59. Haga clic en Borrar registros. Su registro se habrá borrado.


60. Lo importante de todo es que para toda esta funcionalidad no fue necesario escribir una
sola línea de código.
FIN DEL EJERCICIO *
596 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA MENTAL DEL CAPÍTULO


Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 597

TERMINOLOGÍA

AccessDataSource, DataBind, 571 Panel SelectedIndex, 571


570 DataList, 570 de diagrama, 588 SelectedIndex-
AdRotator, 570 DataTextField, 571 de instrucción Change, 571
BulletedList, 570 DataValueField, textual, 588 SelectedItem, 571
Campos, 571 571 de resultados de SelectedValue, 571
CheckBoxList, 570 DetailsView, 570 ejecución de SelectedValueField,
Command and DropDownList, 570 comandos, 571
Parameter Editor, Fields, 571 588 SiteMapDataSource,
589 FormView, 571 de selección y 570
Data GridView, 570 asignación, Smart Tag, 576
Bound Controls, ListBox, 570 588 SqlDataSource, 569
570 Menu, 571 RadioButtonList, TreeView, 571
Source Controls, ObjectDataSource, 570 XML Data Source,
569 569 Repeater, 571 570

PREGUNTAS
17.1 ¿Para qué sirven los Data Source Controls? 17
17.2 ¿Cuáles son los Data Source Controls más comunes?
17.3 ¿Para qué sirven los Data Bound Controls?
17.4 ¿Cuáles son los Data Bound Controls más comunes?
17.5 ¿Qué Data Source Controls y Data Bound Controls cree que utilizará en su ámbito
profesional?
598 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 599

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Controles ASP.NET que de forma declarativa permiten la conexión con bases de datos, además de rea-
lizar lectura y escritura de datos:
a) Data Source Controls
b) Data Bound Controls
c) Data Provider Objects

2. Controles ASP.NET que permiten el canal de acceso directo a un origen de datos desde el navegador:
a) Data Source Controls
b) Data Bound Controls
c) Data Provider Objects

3. Muestra un registro de una tabla en forma tabular y permite la edición, eliminación e inserción de re-
gistros:
a) DetailsView
b) GridView
c) Repeater

4. Representa el origen de datos requeridos por TreeView y Menu:


a) .ObjectDataSource
b) .XMLDataSource
c) .HieracySource 17
5. Método que establece el enlazado de datos entre el Data Bound Control y el Data Source Control:
a) DataBinding
b) Bind
c) DataBind

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. ASP.NET 1.1 y ASP.NET 2.0 proporcionan mecanismos para establecer de forma
declarativa actividades que antes requerían codificación ADO.NET.

7. SqlDataSource sólo permite el manejo de datos almacenados en bases de datos de SQL


Server.

8. AccessDataSource sólo permite el manejo de datos almacenados en bases de datos de


Access.

9. Los Data Source Controls utilizan los datos que proveen los Data Bound Controls.

10. En ASP.NET 2.0 es posible realizar un actualizador de base de datos sin necesidad de
codificar nada manualmente.
CAPÍTULO 18
Colecciones genéricas
(generics)
Objetivos: Aprender las generalidades de las clases para manejo de
colecciones genéricas.

1. Se familiarizará con las generics y sus formas de implementación.


2. Aprenderá a instrumentar generics en bloques de código.
3. Aprenderá a instrumentar generics en colecciones.
4. Conocerá el uso de List.
5. Conocerá el uso de Queue.
6. Conocerá el uso de Stack.
7. Conocerá el uso de Dictionary.

601
602 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido
Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 603
Bloques de código usando generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 604
Programación de un método dinámico usando Generics . . . . .. 604
Colecciones genéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 607
List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 607
Implementación de List (Generics). . . . . . . . . . . . . . . . . . . . . . .. 608
Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 610
Implementación de Queue (Generics) . . . . . . . . . . . . . . . . . . . .. 610
Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 613
Implementación de Stack (Generics) . . . . . . . . . . . . . . . . . . . . .. 613
Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 616
Implementación de Dictionary (Generics) . . . . . . . . . . . . . . . . .. 616
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 619
Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 620
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 620
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 622
Capítulo 18. Colecciones genéricas (generics) 603

Generics
La versión 2.0 de .NET Framework aporta múltiples mejoras a clases existentes de BCL,
además de reorganizar y reclasificar algunos de los recursos.
Una de las principales capacidades totalmente nuevas que introduce la versión 2.0 son las
implementaciones genéricas.
Las implementaciones genéricas, mejor conocidas como Generics, son la funcionalidad
proporcionada por CLR con el fin de que clases, estructuras, interfaces y métodos puedan
utilizar datos de entrada de tipo indeterminado (que se resolverá al llamar a ejecución). En
otras palabras, son implementaciones donde no sólo los valores de los datos son intercam-
biables, sino también sus tipos.
Este concepto es muy similar a los templates manejados por C++, que tenían, a grandes
rasgos, la misma funcionalidad.
Para darnos una idea de por qué es necesario introducir estos elementos a los lenguajes
.NET, considere el caso hipotético descrito a continuación. Imagine que tiene una base de
datos con información bibliográfica, y que cuenta con una clase para realizar una búsque-
da compleja; en ella se puede proporcionar el nombre del título (de tipo String) o bien el
ISBN (un dato Double).
Dado que no se sabe si la información proporcionada será un String o un Double, será ne-
cesario manejar datos de tipo Object, que no son eficientes; además, la codificación de la
clase tendría que anticiparse a los posibles conflictos de diferencia de tipo.
Una alternativa sería hacer procedimientos distintos dependiendo del tipo de dato propor-
18
cionado o, de plano, implementar objetos con polimorfismo.
Si además queremos que los programas sean type safe, el programa se complicará más da-
do que deberemos estar al pendiente de cualquier conversión de datos.
Generics ofrece una solución práctica al problema. Con generics, el tipo de dato es inter-
cambiable y se especifica al momento de la declaración en tiempo de ejecución. De esa for-
ma se codifica un solo procedimiento capaz de manejar más de un tipo de dato de manera
transparente.
La funcionalidad de generics puede darse en dos formas generales:

❑ Bloques de código Es el tipo de uso de generics por medio del cual clases y méto-
dos se implementan con parámetros cuyo tipo de dato a utilizar es especificado al mo-
mento de llamar a ejecución.
❒ Colecciones Son colecciones preconstruidas que permiten la especificación en tiem-
po de ejecución del tipo de dato a almacenar.
604 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Bloques de código usando generics


El uso de generics en bloques de código permite definir argumentos o parámetros cuyo tipo
de dato no está predefinido para la clase o método sino hasta que se manda llamar a ejecución.
La forma de implementar generics en esta modalidad es especificando la variabilidad de
algún dato parametrizado, mediante el uso de la especificación Of T:

Of T)
Class MiClase(O
Public Dato As T
Sub Muestra()
Console.WriteLine(Dato)
End Sub
End Class

En este ejemplo, la clase MiClase utiliza generics de tal manera que los datos útiles para el
proceso pueden ser de cualquier tipo (pero que se especificará al momento de la instan-
ciación). El método Muestra expondrá el dato proporcionado a la clase sin importar su tipo.
Al momento de consumir la clase es necesario hacer referencia al tipo de datos que se de-
sea utilizar; esto se lleva a cabo a través de la especificación Of, característica de generics.

Dim A As New MiClase(Of Integer)


A.Dato = 10
A.Muestra()
Dim B As New MiClase(Of String)
B.Dato = “Mensaje”
B.Muestra()

El procedimiento no requiere de modificación alguna para funcionar con datos de diferen-


tes tipos, pero al mismo tiempo es type safe.
Este mismo procedimiento puede intentarse sin utilizar generics, pero en caso de especificar
Option Strict On, quedarían al descubierto las conversiones implícitas que el programa rea-
liza. En el caso de no realizarse las conversiones explícitas se provocaría una excepción.

Ejercicio 18.1
Programación de un método dinámico usando Generics

En este ejercicio comprobaremos la funcionalidad de generics mediante un procedimiento


que puede manejar información de entrada de diferentes tipos de dato. El programa será
Capítulo 18. Colecciones genéricas (generics) 605

type safe, con el fin de hacer evidente que no es necesario realizar conversiones explícitas
de datos con el uso adecuado de generics.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Uso-
Generics.
3. Edite el programa de tal forma que aparezca de la siguiente forma:

Codificación de UsoGenerics – Module1.vb

1 Option Strict On
2 Imports System.Console
3
4 Module Module1
5
6 Sub Main()
7 Dim X As Integer = 5
8 Dim Y As Integer = 7
9 WriteLine(“I = “ & X)
10 WriteLine(“J = “ & Y)
11 Intercambia(Of Integer)(X, Y)
12 WriteLine(“I = “ & X)
13 WriteLine(“J = “ & Y)
14
15
16 Dim W As String = “Juan”
17
18
Dim Z As String = “María”
WriteLine(“S = “ & W)
18
19 WriteLine(“R = “ & Z)
20 Intercambia(Of String)(W, Z)
21 WriteLine(“S = “ & W)
22 WriteLine(“R = “ & Z)
23
24 Write(“Presiona INTRO”)
25 ReadLine()
26
27 End Sub
28
29 Sub Intercambia(Of T)(ByRef a As T, ByRef b As T)
30 Dim Paso As T
31 Paso = a
32 a = b
33 b = Paso
34 End Sub
35
36 End Module
606 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de UsoGenerics – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. En las líneas 1 y 2 se garantiza que el programa sea type safe; con ello nos asegura-
remos de que no realice conversiones implícitas (que irían en contra del concepto de
uso de generics).
6. En la línea 29 se declara un procedimiento denominado Intercambia, que está
preparado para manejar un tipo de dato de forma genérica (T). Este tipo de dato es in-
determinado en código, pero deberá ser especificado al momento de mandar llamar a
ejecución el procedimiento.
7. El procedimiento Intercambia recibirá dos argumentos (a, b), que serán del tipo de
dato que le especifiquemos al generic (T).
8. Lo que el procedimiento hace es muy sencillo: declara una variable de paso que ten-
drá el mismo tipo de dato que el especificado al momento de la ejecución. El progra-
ma asigna el valor del primer argumento a la variable de paso para no perder el valor;
luego asigna el valor del segundo argumento al primero, y el valor de la variable de
paso al segundo argumento. Con ello se habrán intercambiado los valores. El primer
argumento tendrá el valor que tenía el segundo y viceversa.
9. Al mandar a ejecutar el procedimiento (líneas 11 y 20), se especifica el tipo de dato
que deberá utilizar el procedimiento, en sustitución del tipo indeterminado (T). Los
valores proporcionados al procedimiento corresponden al mismo tipo de dato, dado
que así fueron especificados.
Si todo ocurrió como se esperaba, la salida será la siguiente:

I = 5
J = 7
I = 7
J = 5
S = Juan
R = María
S = María
R = Juan
Presiona INTRO

FIN DEL EJERCICIO*


Capítulo 18. Colecciones genéricas (generics) 607

Colecciones genéricas
Las colecciones genéricas son aquellas en las cuales el tipo de datos de sus elementos só-
lo es conocido hasta el momento de su declaración.
Las colecciones genéricas o generics más importantes son las siguientes:
❑ List: Representa un conjunto de elementos común.
❑ Queue: Representa un conjunto de elementos de tipo FIFO (First In – First Out)
Primero en entrar, primero en salir.
❑ Stack: Representa un conjunto de elementos de tipo LIFO (Last In – First Out) Úl-
timo en entrar, primero en salir.
❑ Dictionary: Representa un conjunto de elementos en donde una llave está relaciona-
da con un valor determinado.
La forma de especificar este tipo de generics es, simplemente, declarándolo.
Dim MiColección As New ColecciónGeneric(Of T [,Tipo])
Donde MiColección es el nombre de la colección, ColecciónGeneric es el tipo de colección
que deseamos especificar. La especificación Of T es obligatoria para generics; a través de
ésta definiremos el tipo de dato que deseamos que utilice el procedimiento. Se debe susti-
tuir la T por el tipo de dato que deseamos que el programa maneje.
En el caso de Dictionary, es necesario especificar el tipo de dato a almacenar como valor
de diccionario. Ese punto se verá más adelante.

List 18
Es la colección generic que representa un conjunto de elementos común; es la más senci-
lla, dado que no tiene comportamientos implícitos en su naturaleza. Sus miembros más im-
portantes son los siguientes:

Propiedad o método Uso


Capacity Número de elementos que la colección
puede contener.
Count Número de elementos en la colección.
Item Representa un elemento de la colección.
Add Permite agregar un elemento a la colección.
Clear Elimina todos los elementos de la colección.
Find Devuelve la primera ocurrencia de un
elemento determinado en la colección.
Insert Inserta un elemento en la lista.
Remove Remueve un elemento de la colección.
608 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 18.2
Implementación de List (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección List. El programa pre-


guntará una serie de números y los desplegará en el orden en que se capturaron.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoList.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de UsoList – Module1.vb

1 Imports System.Console
2
3 Module Module1
4 Dim lstNumeros As New List(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 lstNumeros.Add(CType(strNumero, Integer))
19 End If
20 Loop
21 End Sub
22
23 Sub Resultados()
24 For Each Entero As Integer In lstNumeros
25 WriteLine(Entero.ToString())
26 Next
27 End Sub
28
29 End Module
Capítulo 18. Colecciones genéricas (generics) 609

Ejecución guiada de UsoList – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. De la línea 9 a la 20 se tiene un ciclo que estará preguntando números enteros; cuan-
do no se proporcione información, se dará por concluido el ciclo.
6. Lo importante del programa es la implementación de List, que aparece en la línea 4.
Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer.
7. Por cada iteración del ciclo se pregunta un número (líneas 10 y 11); en caso de que la
captura no sea nula (línea 17) se agrega a la colección la conversión a Integer de lo
capturado (línea 18). De esa forma se va poblando la colección; a diferencia de los
arreglos, una colección de tipo List no requiere saber de forma predefinida el núme-
ro de elementos que tendrá, por lo que constituye una mejor utilización de recursos.
Esto evita un problema general de los arreglos, que al requerir la especificación pre-
determinada del número de elementos que lo componen, siempre se corre el riesgo de
haber definido muy pocos, lo que causa excepciones de desbordamiento, o demasia-
dos, lo que produce el uso innecesario de recursos.
8. En caso de que se omita la entrada, se asume que ya no se desea capturar más infor-
mación (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra
el contenido de la colección.
18
9. Capture 10, 20, 30, 40 y 50.
10. Resultados solamente muestra el contenido de la colección (líneas 23 a la 27).
Si todo ocurrió como se esperaba, la salida será la siguiente.

Capture un número (omitir para finalizar):10


Capture un número (omitir para finalizar):20
Capture un número (omitir para finalizar):30
Capture un número (omitir para finalizar):40
Capture un número (omitir para finalizar):50
Capture un número (omitir para finalizar):
10
20
30
40
50
Pulse INTRO

FIN DEL EJERCICIO*


610 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Queue
Es la colección generic que representa un conjunto de elementos FIFO (First In – First Out
/ Primero en entrar, primero en salir). Sus miembros más importantes son los siguientes:

Propiedad o método Uso

Count Número de elementos en la colección.

Clear Elimina todos los elementos de la colección.

Dequeue Elimina un elemento y devuelve el control


al primer elemento de la cola.

Enqueue Agrega un elemento al final de la cola.

Peek Devuelve el control al primer elemento,


sin eliminar ningún elemento.

ToArray Copia los elementos de la colección a un arreglo.

Ejercicio 18.3
Implementación de Queue (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Queue. El programa pre-


guntará una serie de números, pero sólo interesan los últimos tres que se capturen y que se
mostrarán al final.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoQueue.
3. Edite el programa de tal forma que aparezca de la siguiente manera:
Capítulo 18. Colecciones genéricas (generics) 611

Codificación de UsoQueue – Module1.vb

1 Imports System.Console
2
3 Module Module1
4 Dim queNumeros As New Queue(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 If queNumeros.Count = 3 Then
19 queNumeros.Dequeue()
20 End If
21 queNumeros.Enqueue(CType(strNumero, Integer))
22 End If
23 Loop
24 End Sub
25
26 Sub Resultados()
27 For Each Entero As Integer In queNumeros
28 WriteLine(Entero.ToString()) 18
29 Next
30 End Sub
31
32 End Module

Ejecución guiada de UsoQueue – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. El funcionamiento del programa es muy similar al ejercicio anterior. A través de un ci-
clo se preguntan datos; al omitir uno se asume que ya no se desea capturar más.
612 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Lo importante del programa es la implementación de Queue, que aparece en la línea 4.


Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer.
7. Por cada iteración del ciclo, se pregunta un número (líneas 10 y 11); en caso de que la
captura no sea nula (línea 12) se agrega a la colección la conversión a Integer de lo
capturado (línea 21). De esa forma se va poblando la colección.
8. En caso de que se omita la entrada, se asume que ya no se desea capturar más infor-
mación (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra
el contenido de la colección.
9. Capture 10, 20, 30, 40 y 50.
10. Como sólo vamos a permitir 3 elementos, se realiza una validación: si el número de
elementos es 3 quiere decir que ya no se debe aceptar uno más, a menos de que uno
de los elementos ya existentes salga.
11. Si el número de elementos es 3 (línea 18), se instruye a la colección a eliminar uno de
los elementos (línea 19). Como el comportamiento de la colección es FIFO, saldrá pri-
mero el que haya entrado primero.
12. Resultados solamente muestra los últimos tres elementos capturados, dado que los pri-
meros que se capturaron fueron saliendo al tratar de agregar un elemento más cuando
ya había 3 elementos en la colección.

Si todo ocurrió como se esperaba, la salida será la siguiente.


Capture un número (omitir para finalizar):10
Capture un número (omitir para finalizar):20
Capture un número (omitir para finalizar):30
Capture un número (omitir para finalizar):40
Capture un número (omitir para finalizar):50
Capture un número (omitir para finalizar):
30
40
50
Pulse INTRO

FIN DEL EJERCICIO*


Capítulo 18. Colecciones genéricas (generics) 613

Stack
Es la colección generic que representa un conjunto de elementos LIFO (Last In – First Out
/ Último en entrar, primero en salir ). Sus miembros más importantes son los siguientes:

Propiedad o método Uso

Count Número de elementos en la colección.


Clear Elimina todos los elementos de la colección.
Peek Devuelve el control al primer elemento, sin eliminar
ningún elemento.
Pop Elimina un elemento y retorna el control al primer
elemento de la pila (stack).
Push Inserta un elemento al inicio de la pila.
ToArray Copia los elementos de la colección a un arreglo.

Ejercicio 18.4
Implementación de Stack (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Stack. El programa pre-


guntará una serie de números. Se demostrará el comportamiento LIFO de la colección.
18
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoStack.
3. Edite el programa de tal forma que aparezca de la siguiente forma:
614 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de UsoStack – Module1.vb

1 Imports System.Console
2
3 Module Module1
4 Dim staNumeros As New Stack(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 staNumeros.Push(CType(strNumero, Integer))
19 End If
20 Loop
21 End Sub
22
23 Sub Resultados()
24 For i As Integer = 0 To staNumeros.Count - 1
25 WriteLine(staNumeros.Pop.ToString())
26 Next
27 WriteLine(“—- Elementos que quedaron en Stack —-”)
28 For Each Entero As Integer In staNumeros
29 WriteLine(Entero.ToString())
30 Next
31 WriteLine(“—- Fin de elementos —-”)
32 End Sub
33
34 End Module

Ejecución guiada de UsoStack – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. El funcionamiento del programa es muy similar al ejercicio anterior. A través de un ci-
clo se preguntan datos; al omitir uno se asume que ya no se desea capturar más.
Capítulo 18. Colecciones genéricas (generics) 615

6. Lo importante del programa es la implementación de Stack, que aparece en la línea 4.


Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer.
7. Por cada iteración del ciclo, se pregunta un número (líneas 10 y 11); en caso de que la
captura no sea nula (línea 12) se agrega a la colección la conversión a Integer de lo
capturado (línea 18). De esa forma se va poblando la colección.
8. En caso de que se omita la entrada, se asume que ya no se desea capturar más infor-
mación (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra
el contenido de la colección.
9. Capture 10, 20, 30, 40 y 50.
10. Al ejecutarse Resultados (línea 23) se utiliza un For Next para la inspección de los
elementos (línea 24). La información se extrae utilizando el método Pop, que tiene la
particularidad de eliminar el elemento al mismo tiempo que lo lee. Se mostrarán los
elementos, del último capturado al primero capturado. Al concluir el proceso, la co-
lección habrá quedado sin elementos.
11. Las líneas 27 a la 31 se encargan de demostrar que ya no hay elementos en la colec-
ción, una vez que se leyeron utilizando Pop.

Si todo ocurrió como se esperaba, la salida será la siguiente.


Capture un número (omitir para finalizar):10
Capture un número (omitir para finalizar):20
Capture un número (omitir para finalizar):30
Capture un número (omitir para finalizar):40
Capture un número (omitir para finalizar):50
Capture un número (omitir para finalizar): 18
50
40
30
20
10
—- Elementos que quedaron en Stack —-
—- Fin de elementos —-
Pulse INTRO

FIN DEL EJERCICIO*


616 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dictionary
Es la colección generic que representa un conjunto de elementos donde una llave está re-
lacionada con un valor.
En el caso de Dictionary, es necesario especificar el tipo de dato que tienen los valores
asociados a la llave.
Sus miembros más importantes son los siguientes:

Propiedad o método Uso

Count Número de elementos en la colección.


Item Representa un elemento de la colección.
Keys Representa la colección de llaves.
Values Representa la colección de valores.
Add Agrega un elemento a la colección.
Clear Elimina los elementos de la colección.
ContainsKey Determina si en la colección existe un valor
de llave determinada.
ContainsValue Determina si en la colección existe un
determinado valor.
Remove Elimina un elemento de la colección.

Este ejemplo declara un diccionario, carga tres elementos y despliega el valor correspon-
diente en una de las llaves.

Dim Pais As New Dictionary(Of T String, String)


Pais.Add(“MX”, “México”)
Pais.Add(“EU”, “Estados Unidos”)
Pais.Add(“CN”, “Canadá”)
Console.WriteLine(Pais(“MX”))

Ejercicio 18.5
Implementación de Dictionary (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Dictionary. El programa


preguntará una serie de números. Se demostrará el comportamiento LIFO de la colección.
Capítulo 18. Colecciones genéricas (generics) 617

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios


(archivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoDic-
tionary.
3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de UsoDictionary – Module1.vb

1 Imports System.Console
2
3 Module Module1
4 Dim dicPCard As New Dictionary(Of String, String)
5
6 Sub Main()
7 Dim strInicial As String
8
9 dicPCard.Add(“N”, “Norte”)
10 dicPCard.Add(“S”, “Sur”)
11 dicPCard.Add(“E”, “Este”)
12 dicPCard.Add(“O”, “Oeste”)
13
14 Write(“Dame la inicial de un punto cardinal:”)
15 strInicial = ReadLine()
16
17
18
WriteLine(“Inicial de {0}”, dicPCard(strInicial))
18
19 Write(“Presione INTRO”)
20 ReadLine()
21 End Sub
22
23 End Module

Ejecución guiada de UsoDictionary – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-


to como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya rea-
lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el
comportamiento de su programa (tecla F5).
5. Lo importante del programa es la implementación de Dictionary, que aparece en la
línea 4. Vea cómo se decide que el tipo de dato a utilizar como llave es String, y que
618 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

el dato de valor asociado a la llave también es String. Dada la especificación Of, el


tipo de dato de la llave puede ser intercambiable en un momento dado.
6. De la línea 9 a la 12 se puebla con datos la colección. Simplemente se almacenan los
puntos cardinales y se les coloca una inicial como llave.
7. En las líneas 14 y 15 se pregunta por una inicial de un punto cardinal. Capture la le-
tra N.
8. La línea 17 muestra el valor asociado a la llave proporcionada. Como puede ver, para
recuperar el valor asociado a una llave sólo es necesario colocar el nombre de la co-
lección y, entre paréntesis, el valor de la llave cuyo valor deseamos recuperar.
9. Si todo ocurrió como se esperaba, la salida será la siguiente.
Dame la inicial de un punto cardinal:N
Inicial de Norte
Presione INTRO

FIN DEL EJERCICIO*


Capítulo 18. Colecciones genéricas (generics) 619

MAPA MENTAL DEL CAPÍTULO

18
620 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA
Colecciones genéricas, 607
Dictionary, 616
Generics, 603
Implementaciones genéricas, 603
List, 607
Of, especificación, 604
Queue, 610
Stack, 613
Templates, 603

PREGUNTAS
18.1 ¿En qué consisten las generics?

18.2 ¿Cuáles son las dos formas generales de implementar generics?

18.3 ¿En qué casos se recomienda el uso de generics, en relación a los arreglos?

18.4 Mencione cuáles son las colecciones generics más usuales y explique sus diferen-
cias.
Capítulo 18. Colecciones genéricas (generics) 621

Notas:

18
622 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta.


1. Permite que clases, estructuras, interfaces y métodos utilicen datos de entrada de tipo indeterminado:
a) Untyped Arrays
b) Generics
c) Collections

2. Es la especificación requerida por los tipos para la implementación de generics:


a) Of T
b) By Val
c) IndexOf

3. Es la colección generic que tiene comportamiento LIFO


a) Queue
b) Stack
c) Dictionary

4. Es la colección generic que tiene comportamiento FIFO


a) Queue
b) Stack
c) Dictionary

5. Es el método que permite ir al primer elemento recuperable en una colección generic sin eliminarlo
(puede aplicarse a Queue y Stack):
a) Enqueue
b) GoTop
c) Peek

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero.


6. Generics sólo funciona en .NET Framework 1.1 y 2.0.

7. Generics sólo se pueden implementar a través de alguna de las colecciones de tipo


generic.

8. Generics tiene la misma filosofía que tienen los templates en el lenguaje Java.

9. Generic permite el intercambio de tipos de datos de modo type safe.

10. Generics es más eficiente que los arreglos, dado que no es necesario especificar
un número de elementos predeterminado, lo que permite un manejo más eficiente
de los recursos.

Vous aimerez peut-être aussi