You are on page 1of 262

www.pdftron.

com
IBEROÁMERICA
ETC

Lección 1
Introducción a la programación
Matriz de dominio de objetivos
Habilidad tecnológica
Descripción de dominio de objetivos
Número de dominio de
objetivos
Comprender la programación de computadoras
Comprender el almacenamiento y los
1.1
tipos de datos computacionales
Comprender las estructuras de decisión
Comprender estructuras de decisión
1.2
computacionales
Comprender las estructuras de repetición
Identificar el método apropiado para el
1.3
manejo de las repeticiones
Comprender el manejo de excepciones
Comprender el manejo de errores
1.4
Términos clave
• Algoritmo
• Diagrama de fujo
• Programa
• Vector
• Ciclo for
• Recursión
• Constante
• Ciclo foreach
• Switch
• Tabla de decisión
• If
• Try-catch-fnally
www.pdftron.com
• Ciclo do-while
• If-else
• Variable
• Excepción
• Operador
• Ciclo while
Como desarrollador de software para corporación Northwind, parte de su trabajo es de
IBEROÁMERICA
programas de computadora que resuelvan problemas de la compañía. Algunos de estos ejempl
son: analizar órdenes de clientes y determinar descuentos, así como actualizar la información d
almacén sobre los miles de productos en el inventario y elaborar un reporte interactivo que per
al usuario ordenar y fltrar los datos.
Es de suma importancia asegurarse que sus programas se diseñen de acuerdo a las especifcacio
También necesita asegurarse que todos los cálculos sean precisos y completos. Los programas
desarrolle deberán ser robustos y capaces de mostrar mensajes de error pero también de contin
ETC con el procesamiento.
El lenguaje de programación que utilice le proporcionará una variedad de herramientas y técni
que le permitirán llevar a cabo las tareas. Con base en la tarea, seleccione el tipo de datos y las
estructuras de control que mejor se adecuen para solucionar el problema.

2
Lección 1
� Comprender la programación de computadoras
È EN RESUMEN
Un programa de computadora es un conjunto de instrucciones precisas para llevar a cabo una
aprenderá a escribir algoritmos y programas de computadoras para solucionar un problema da
su primer programa computacional utilizando el lenguaje de programación C#, también aprend
básica de un programa, así como a compilarlo, ejecutarlo, ingresar datos y generar resultados d
Introducción a los Algoritmos
Un algoritmo es un conjunto de pasos ordenados y fnitos para resolver un problema dado.
El término algoritmo se refere a un método para solucionar problemas. Los algoritmos se
pueden describir con palabras pero podrían suceder errores de comprensión relacionados
con la complejidad y ambigüedad de un idioma natural.
De ahí que los algoritmos generalmente se escriban en formatos más simples y precisos
como diagramas de fujo, árboles de decisión y tablas de decisión que representen un
algoritmo como un diagrama, tabla o gráfco. Estas técnicas se utilizan generalmente antes
de escribir los programas para contar con una mejor comprensión de la solución.
Estas herramientas para el desarrollo de algoritmos pueden ayudarlo a expresar la
solución para un problema de manera fácil, pero no se pueden ingresar directamente en
la computadora. Para que una computadora entienda su algoritmo, necesita escribir un
www.pdftron.com
programa de computadora de manera formal utilizando un lenguaje de programación
como C# sobre el cual aprenderá en la siguiente sección.
Esta sección se enfoca en dos técnicas para algoritmos, los diagramas de fujo y las tablas
de decisión que son más precisas que un idioma natural pero menos formales y más fáciles
de utilizar que un lenguaje de programación.
Introducción a los diagramas de flujo
IBEROÁMERICA
Un diagrama de fujo es una representación gráfca de un algoritmo. Un diagrama de
fujo se realiza generalmente utilizando símbolos estandarizados para diagramas de fujo.
Algunos de los símbolos comunes de diagramas de fujo aparecen en la tabla 1-1.
Tabla 1-1
Símbolo del diagrama de flujo
Descripción
Símbolos de diagramas de
Inicio o final de un algoritmo
ETC
flujo comunes

Un proceso u operación computacional

Operación de entrada o salida

Operación de toma de decisión

Especifica el flujo de control

Introducción a la programación
3
Por ejemplo, la fgura 1-
1 muestra un diagrama de fujo que ingresa dos números, los
compara y produce como salida el número mayor.
Figura 1-1


Un diagrama de flujo
sencillo que compara
dos números y da como

resultado el mayor





Como puede ver, este diagrama de fujo muestra en el orden correcto todos los pasos
necesarios para llevar a cabo la operación. El control inicia con el símbolo Inicio y termina
con el símbolo Fin. El proceso y operaciones de entrada/salida siempre tienen una sola
entrada pero varias salidas. Se puede evaluar un diagrama de fujo llevando a cabo una “dry
run” (ejecución seca). En ella se traza de forma manual lo pasos en el diagrama de fujo para
www.pdftron.com
revisar si los datos siguen la ruta correcta.
Introducción a las tablas de decisión
Cuando se requiere de una gran cantidad de condiciones en un algoritmo, las tablas de
decisión son un formato más compacto y legible para representarlo. La tabla 1-
2 muestra
una tabla de decisión para calcular un descuento. Esta tabla genera un porcentaje de
descuento dependiendo de la cantidad de producto que se haya comprado. La línea en
negrita en la tabla divide la tabla de decisión en cuatro cuadrantes. El primer cuadrante en
IBEROÁMERICA
la izquierda superior especifca las condiciones (Cantidad <10, etc.). El segundo cuadrante
(superior derecha) especifca las reglas. Las reglas son las posibles combinaciones que
resultan de cada condición. El tercer cuadrante (inferior izquierda) especifca la acción
(en este caso el Descuento) y el último cuadrante especifca los elementos de la acción que
corresponden a cada regla.
Tabla 1-2
Cantidad < 10
S
N
N
N
ETC
Una tabla de decisión que
Cantidad < 50
S
S
N
N
calcula descuentos
Cantidad < 100
S
S
S
N
Descuento
5%
10%
15%
20%
****Note las líneas en negritas que dividen la tabla en cuadrantes*****
Para descubrir cual acción se debe aplicar, se evalúa cada condición para encontrar la regla
coincidente y seleccionar la acción especifcada en la columna con la regla coincidente. Por
ejemplo, si el valor de la cantidad es 75 entonces la primera regla evalúa un No, la segunda
regla evalúa un No y la tercera evalúa un Sí. Por lo que debe seleccionar el elemento de la
acción de la columna (N, N, S) que establece un descuento de 15%.

4
Lección 1
Introducción a C#
C# es un lenguaje de programación de alto nivel muy popular que le permite escribir program
en un formato legible para los humanos. C# es parte de .NET Framework y se benefcia del tie
librerías de clase que se encuentran en .NET Framework.
Como se mencionó en la sección anterior, las computadoras necesitan de instrucciones
precisas y completas para llevar a cabo una tarea. Este conjunto de instrucciones se conocen
como programas de computadora o simplemente programas.
En un nivel muy básico, las computadoras utilizan el sistema binario para representar
información y código. En el sistema binario, cada valor se representa utilizando únicamente
dos símbolos, 0 y 1. A un programa de computadora escrito en código binario se le conoce
como código binario.
Utilizar el código binario para programar una computadora es muy difícil para llevar
a cabo cualquier tarea. Para simplifcar la programación, los científcos e ingenieros en
computación desarrollaron varios niveles de abstracción entre la máquina y el humano.
Estas abstracciones incluyen software, como los sistemas operativos, compiladores y varios
sistemas en tiempo de ejecución, que asumen la responsabilidad de traducir un programa
legible para los humanos en un programa legible para la máquina.
La mayoría de los programas modernos se encuentran escritos en un lenguaje de alto nivel
como C#, Visual Basic y Java. Estos lenguajes le permiten escribir instrucciones precisas
en un formato legible para los humanos. El compilador de lenguaje puede entonces
traducir el lenguaje de alto nivel en un lenguaje de bajo nivel que pueda comprenderse en
el sistema en tiempo de ejecución.
www.pdftron.com
Cada lenguaje de programación cuenta con su propio conjunto de vocabulario y gramática
(también conocido como sintaxis). En este curso, aprenderá a programar en C#, el cual
es un lenguaje de programación en .NET Framework. .NET Framework cuenta con un
ambiente en tiempo de ejecución para el programa C#. Framework también cuenta con
librerías de clase que ofrecen una gran funcionalidad reutilizable que se puede utilizar
directamente en su programa de C#.
El .NET Framework
IBEROÁMERICA
El .NET Framework cuenta con tres componentes principales: un ambiente en tiempo de
ejecución, un conjunto de librerías de clase que ofrece una gran funcionalidad reutilizable
y compiladores de lenguaje para C#, Visual Basic y Managed C++. El .NET Framework
soporta diferentes lenguajes de programación así como lenguajes adicionales al sistema.
Aun cuando la sintaxis y vocabulario de cada lenguaje pueda ser diferente, cada uno utiliza
las librerías de clase base con las que cuenta el Framework.
ETC En este curso utilizará un ambiente de desarrollo integrado (IDE) para desarrollar su
código. Utilizará Visual Studio o la edición gratuita de Visual Studio Express para escribir
su código. Cualquiera de estas herramientas le ofrece un ambiente altamente productivo
para desarrollar y evaluar sus programas.
Introducción a la programación
5
Æ Escriba un programa en C#
Tome Nota
C# es un lenguaje de
PREPÁRESE. Para escribir un programa en C#, realice lo siguiente:
programación sensible
1. Inicie Visual Studio. Seleccione Archivo y después Nuevo proyecto, Visual c#, Seleccione
a mayúsculas. Por
Aplicación de consola en Plantillas
ejemplo, si escribe
Class en lugar de class,
2. Ingrese IntrodCS en el cuadro Nombre. Asegúrese que el cuadro de verificación Cr
le resultará un error de
directorio para la solución se encuentre seleccionado e ingrese el nombre Lesson01 en el
sintaxis.
cuadro Nombre de la solución. Haga clic en Aceptar para crear el proyecto.
3. Después de crear el proyecto, notará que Visual Studio ha creado un archivo de nombre
Program.cs y escrito una plantilla para usted.
4. Modifique la plantilla para que luzca como el siguiente código:
Otra Manera
using System;
También puede
ejecutar el programa
si abre una ventana
namespace Lesson01
de línea de comandos
{
(cmd.exe) y después
navega a la carpeta
class Program
de salida del proyecto,
{
que de forma
predeterminada
static void Main(string[] args)
es bin/debug bajo
la ubicación del
{
proyecto. Se puede
Console.WriteLine(“¡hola, mundo!”);
iniciar el programa
www.pdftron.com
escribiendo el nombre
}
del programa en la
}
ventana de comandos
y presionando Enter.
}
5. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.
6. Observará el resultado del programa en una ventana de comandos, como aparece en la
Figura 1-2.
Figura 1-2
IBEROÁMERICA
Resultado del programa
en una ventana
ETC
7. Presione una tecla para cerrar la ventana de línea de comandos.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

6
Lección 1
Tome Nota
El programa que acaba de crear es muy sencillo pero resulta de utilidad para comprender
la estructura de un programa, su construcción y ejecución. Primero comentemos sobre la
Cuando seleccione
parte de la construcción y ejecución. A continuación se menciona lo que sucede cuando
la opción Depurar,
selecciona la opción Depurar y posteriormente Iniciar sin depurar en el paso 5 del ejercicio
Iniciar sin depurar y
Visual Studio muestra
anterior:
automáticamente el
1. Visual Studio invoca el compilador de C# para traducir el código en un lenguaje de bajo
mensaje “Presione
nivel, en código de Lenguaje Intermedio Común (CIL). Este código de bajo nivel se almacena
una tecla para
en un archivo ejecutable de nombre Lesson01.exe. El nombre del archivo resultante se
continuar…”. La
puede cambiar al modificar las propiedades del proyecto.
ventana de línea de
comandos permanece
2. A continuación, Visual Studio toma el resultado del proyecto y solicita al sistema operativo
abierta para que pueda
que lo ejecute. Aquí es cuando ve que la ventana de línea de comandos muestra el resultado.
ver el resultado. Si
selecciona la opción
3. Cuando el programa termina, Visual Studio muestra el mensaje, “Presione una tecla para
Depurar y después
continuar…”. Observe que este mensaje sólo se genera cuando ejecuta el programa al
Iniciar depuración,
utilizar la opción “Iniciar sin depurar”.
la ventana de
comandos se cierra
Si no utiliza un IDE como Visual Studio, puede compilar su programa de forma manual
tan pronto como se
utilizando las herramientas en línea de comandos. Por supuesto, resulta mucho más fácil y
termina la ejecución
rápido utilizar Visual Studio para evaluar sus programas.
del programa. Es
importante saber
que la opción
Depurar e Iniciar
depuración cuenta
con capacidades de
depuración como
lo es la habilidad de
pausar un programa en
www.pdftron.com
ejecución en un punto
dado y revisar el valor
de varias variables en
memoria.
IBEROÁMERICA
Tome Nota
Antes de que se pueda
ejecutar el código en
Lenguaje Intermedio
Común (CIL), primero
se debe traducir para
ETC
la arquitectura de la
máquina donde se
ejecutará el código.
El sistema en tiempo
de ejecución de .NET
Framework se encarga
de esta traducción tras
bambalinas utilizando
un proceso llamado
compilación just-in-
time.
Introducción a la programación
7
� Comprender la estructura de un programa en C#
En esta sección, aprenderá sobre los elementos fundamentales del programa en C# que creó en
La Figura 1-
3 enlista el programa en el ejercicio anterior con números. Esta sección utiliza
los números de línea para referirse a cada estructura del programa.
Figura 1-3
Listado del programa con
números de línea
Tome Nota
Para habilitar la
vista de los números
de línea en Visual
Studio, seleccione
Herramientas y
después Opciones. A
continuación, expanda
el nodo Editor de
texto y seleccione
C#. Finalmente, en
www.pdftron.com
la sección Mostrar,
seleccione la opción
Números de línea
(active la opción
Un programa en C# está formado por una o más clases y otros tipos. Una clase es un
Mostrar todas las
conjunto de datos y métodos. El código en la Figura 1-
3 defne una clase de nombre
configuraciones).
Program de las líneas 5 a la 11. Una clase se defne utilizando la palabra clave class seguida
del nombre de la clase. El contenido de la clase se defne entre una llave de apertura ({) y
una de cierre (}).
IBEROÁMERICA
La línea 3 defne un espacio de nombre, Lesson01. Los Espacios de nombres se utilizan
para organizar clases e identifcarlas de forma única. El espacio de nombre y los nombres
de las clases se combinan para crear un nombre de clase completamente calificado. Por
ejemplo, el nombre de la clase completamente califcado para la clase Program es Lesson01.
Referencia cruzada
Program. C# requiere que el nombre de una clase completamente califcado sea único. Por
lo tanto, no puede tener otro nombre de clase para Program con el nombre Lesson01,
Puede encontrar más
pero puede utilizar Program para otro nombre como Lesson02. La clase Program defnida
información y otros
en el nombre Lesson02 es identifcada de forma única utilizando su nombre de clase
tipos en la Lección 2.
ETC completamente califcado, Lesson02.Program.
El .NET Framework cuenta con una gran cantidad de clases organizadas en muchos
espacios de nombres. El espacio de nombres System contiene algunas de las clases más
comunes. Una de estas clases en el espacio de nombres System es Console. La clase Console
ofrece funcionalidad de entrada y salida para la aplicación de consola. El código en la
línea 9 se refere a la clase Console e invoca al método WriteLine. Para acceder al método
WriteLine debe hacerlo de la siguiente manera:
System.Console.WriteLine(“¡hola, mundo!”);

8
Lección 1
Tome Nota
Puesto que los nombres de las clases aparecen con frecuencia en el código, escribir el
nombre de la clase completamente califcados puede ser tedioso y hacer que los programas
Todas las sentencias
contengan exceso de palabras. Este problema se puede solucionar utilizando la directiva de
en C# deben terminar
C# using (vea el código en la línea 1). La directiva using le permite utilizar las clases en
con un punto y coma
(;).
un espacio de nombres sin la necesidad de califcar completamente el nombre de la clase.
Tome Nota
La clase de Programa defne un solo método por el nombre Main (líneas 7 a la 10). Main
es un método especial que también sirve como punto de entrada al programa. Cuando
El método Main debe
el tiempo de ejecución inicia un programa, siempre empieza en el método Main. Un
ser declarado como
programa puede tener muchas clases y cada clase puede tener muchos métodos, pero
static. El método static
debería tener sólo un método Main. Un método puede a su vez llamar a otros métodos. En
es invocable en una
clase aun cuando no
la línea 9, el método Main está llamando al método WriteLine de la clase System.Console
se haya creado una
para mostrar una cadena de caracteres en la ventana de línea de comandos. Esa es la forma
instancia de la clase.
en la cual aparece el mensaje.
Aprenderá más de este
tema en la siguiente
lección.
Comprender las variables
Las variables proporcionan almacenamiento temporal durante la ejecución de un programa.
Las variables en C # son marcadores de posición utilizados para almacenar valores. Una
Tome Nota
variable tiene un nombre y un tipo de datos. El tipo de datos de la variable determina
El nombre de una
el valor que esta puede contener y el tipo de operaciones que se pueden desarrollar. Por
variable debe empezar
ejemplo, la siguiente declaración crea una variable de nombre number del tipo de datos
con una letra o un
int y asigna un valor de 10 a la variable:
guión bajo y puede
www.pdftron.com
contener sólo letras,
números y guiones
int number = 10;
bajos. El nombre
de una variable no
Cuando se declara una variable, se crea una ubicación en la memoria de la computadora
debe ser mayor a
lo sufcientemente grande para contener el valor de este tipo de dato. Por ejemplo, en una
255 caracteres. Una
máquina de 32-
bit, una variable de un tipo de datos int necesitará dos bytes de memoria.
variable debe ser única
El valor de una variable se puede modifcar por otra asignación, como por ejemplo:
dentro del ámbito en el
cual se haya definido.
number = 20;
IBEROÁMERICA
Este código cambia el contenido de la ubicación en memoria identifcada por el nombre
number.
Comprender las constantes
Las constantes son los campos de datos o variables locales cuyos valores no se pueden modifc
ETC Las constantes se declaran utilizando la palabra const. Una const se puede declarar de la
siguiente forma:
const int i = 10;
Aquí se declara una constante i del tipo de datos int y almacena un valor de 10. Una vez
declarado, el valor de una constante no puede cambiar.

Introducción a la programación
9
Comprender los tipos de datos
El tipo de datos especifca el tipo de valor con el cual se trabajará en el programa. El tipo de da
en memoria necesario para almacenar la información y el tipo de operaciones que se pueden re
Referencia cruzada
C# ofrece varios tipos de datos predefnidos que puede utilizar en sus programas. También
puede defnir nuevos tipos al establecer una estructura de datos como una clase o un struct.
Puede obtener más
Este capítulo se enfoca en algunos de los tipos de datos predefnidos más utilizados.
información sobre
la creación de sus
La tabla 1-
3 contiene algunos de los tipos de datos predefnidos más utilizados en C#. El
propios tipos de datos
tamaño mencionado en la tabla se refere a una computadora con longitudes de palabra
en la Lección 2.
de 32 bits. Para longitudes más grandes, como de 64 bits, los tamaños serán diferentes.
Tabla 1-3
Tipo de dato
Tamaño
Rango de valores
Algunos tipos de datos
byte
1 byte
0 a 255
predefinidos
char
2 byte
U+0000 a U+ffff (caracteres Unicode)
short
2 bytes
-32,768 a 32,767
int
4 bytes
-2,147,483,648 a 2,147,483,647
long
8 bytes
-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
float
4 bytes
±1.5e−45 a ±3.4e38
Tome Nota
double
8 bytes
±5.0e−324 a ±1.7e308
Las versiones sin signo
bool
2 bytes
Verdadero o falso
de short, int y long son
string
-
Cero o más caracteres Unicode
ushort, uint y ulong
www.pdftron.com
respectivamente. Los
tipos sin signo tienen
el mismo tamaño como
Todos los tipos de datos mencionados en la tabla 1-
3 son tipos de valores con excepción de
las versiones con
string, el cual es un tipo de referencia. Las variables que se encuentran basadas directamente
signo pero almacenan
en los tipos de valores contienen el valor en sí. En el caso del tipo de referencia, la variable
rangos mucho mayores
contiene la dirección de la ubicación en memoria donde se encuentran almacenados los
sólo para valores
datos. Aprenderá más sobre las diferencias entre los tipos de valores y referencias en la
positivos.
Lección 2.
IBEROÁMERICA
Comprender los Arreglos
Un arreglo es un conjunto de elementos en donde cada uno de ellos se accede a través de un í
Un arreglo en C# se utiliza comúnmente para representar un conjunto de elementos de
tipo similar. A continuación se incluye un ejemplo de una declaración de un arreglo:
ETC int[] numbers = { 1, 2, 3, 4, 5 };
Esta declaración crea un arreglo identifcado por el nombre numbers. Este arreglo puede
almacenar un conjunto de cinco enteros. Esta declaración también inicializa cada uno de
los elementos del arreglo del 1 al 5 respectivamente.
Cualquier elemento del arreglo se puede acceder de forma directa utilizando un índice.
En .NET Framework los índices de arreglo empiezan desde cero. Esto signifca que para
acceder al primer elemento de un arreglo, se utiliza el índice 0, para acceder al segundo
elemento se utiliza el índice 1 y así sucesivamente.

10
Lección 1
Tome Nota
Para acceder a un elemento individual de un arreglo, se utiliza el nombre del arreglo
seguido del índice dentro de corchetes. Por ejemplo, numbers[0] devuelve el valor 1 del
El tema de los arreglos
arreglo declarado anteriormente y numbers[4] devuelve el valor 5. Es ilegal acceder a un
se cubre a mayor
arreglo fuera de sus límites defnidos. Por ejemplo, obtendrá un error si intenta acceder al
detalle en la Lección
3, Comprender el
elemento del arreglo numbers[5].
desarrollo de software
en general.
Comprender los operadores
Los operadores son símbolos que especifcan la operación a llevar a cabo con los operandos y r
Ejemplos de operadores incluyen +, -
, *, /, etc., y los operandos pueden ser variables,
constantes, literales, etc. Dependiendo de cuantos operandos se encuentren involucrados,
hay varios tipos de operadores:
• Operadores unarios: Los operadores unarios trabajan sólo con un operando.
Ejemplos incluyen ++x, x++, o isEven, donde x es de tipo de datos integer y isEven
es un tipo de datos booleano.
• Operadores binarios: Los operadores binarios toman dos operandos. Por ejemplo,
x + y o x > y.
• Operadores ternarios: Los operadores ternarios toman tres operandos. Sólo hay un
operador ternario, ?:, en C#.
Frecuentemente las expresiones involucran más de un operador. En este caso, el compilador
necesita determinar cuál operador toma precedencia sobre otro. La tabla 1-
4 contiene los
operadores en C# en orden de precedencia. Entre más arriba se encuentre el operador en la
tabla, más alta es su precedencia. Los operadores con precedencia más alta son evaluados
www.pdftron.com
antes que los de baja. Los operadores que aparecen en la misma fla tienen la misma .
Tabla 1-4
Categoría
Operadores
Precedencia de
operadores
Primario
x.y f(x) a[x] x++ x-- new
typeof checked unchecked
IBEROÁMERICA
Unario
+ - ! ~ ++x --x (T)x
Multiplicativo
* / %
Aditivo
+ -
Desplazamiento
<< >>
Comprobación de tipos y relacionales
< > <= >= is as
ETC Igualdad
== !=
AND lógico
&
XOR lógico
^
Logical OR
|
AND Condicional
&&
OR Condicional
||
Condicional
?:
Asignación
= *= /= %= += -= <<= >>= &= ^= |=

Introducción a la programación
11
El operador de incremento unario (++) agrega 1 al valor de un identifcador. De igual
manera los operadores de decremento (--
) substraen 1 al valor de un identifcador. Los
operadores de incremento y decremento unario se pueden utilizar ya sea como prefjos o
sufjos. Por ejemplo:
int x = 10;
x++; //valor de x es ahora 11
++x; // valor de x es ahora 12
Sin embargo, la forma en la cual funcionan los operadores de incremento y decremento
cuando se utilizan como parte de una asignación puede afectar los resultados. Cuando los
operadores unarios de incremento y decremento se utilizan como prefjos, el valor actual
del identifcador se regresa antes del incremento o decremento. Por el contrario, cuando
se utilizan como sufjos, el valor del identifcador se regresa después del incremento o
decremento. Para comprender lo anterior, considere el siguiente código:
int y = x++; // el valor de y es 12
int z = ++x; // el valor de z es 14
Aquí en la primera sentencia, el valor de x se regresa antes del incremento. Como resultado,
después de que se ejecuta la sentencia, el valor de y es 12 y el valor de x es 13.
En la segunda sentencia, el valor de x se incrementa antes de regresar su valor para la
asignación. Por lo tanto, después de ejecutar la sentencia, el valor tanto de x como de z
es 14.
www.pdftron.com
Comprender los métodos
Los métodos sonbloques de código que contienen series de sentencias. Los métodos pu
argumentos y pueden regresar un valor a quien los invoca.
En la lista de código anterior, aprendió sobre el método Main. Los métodos se encuentran
donde están las acciones en un programa. Un método es un conjunto de sentencias que se
IBEROÁMERICA
ejecutan cuando se invoca el método.
; ¿Listo para la
certificación?
El método Main no regresa un valor, lo cual se indica utilizando la palabra void. Si un
¿Comprende los
método fuera a regresar un valor, se colocaría un tipo de datos apropiado del valor retornado
elementos básicos de
en lugar de void.
la programación como
las variables, tipos de
Los miembros de la clase pueden tener modifcadores como static, public y private. Estos
ETC
datos, operadores y
modifcadores especifcan cómo y dónde se pueden acceder los miembros de la clase.
métodos? -1.1
Aprenderá más sobre estos modifcadores en la Lección 2.

12
Lección 1
� Comprender las estructura de decisión
È EN RESUMEN
Las estructuras de decisión introducen la habilidad de toma de decisiones al programa,
diversifcarse a diferentes secciones del código dependiendo del valor verdadero de una expres
Las estructuras de decisión en C# son if, if-
else y switch. En las siguientes secciones
veremos cada una de estas sentencias a detalle.
La sentencia if
La sentencia if ejecutará una secuencia de sentencias dada sólo si la expresión booleana corre
A veces en su programa, querrá que una secuencia de sentencias se ejecute sólo si una
condición es verdadera.
En C# puede realizarlo al utilizar la sentencia if. Considere los siguientes pasos para crear
un programa que utilice la sentencia if.
Æ Uso de la sentencia if
www.pdftron.com
PREPÁRESE. Para utilizar la sentencia if, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre if_Statement) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
int number1 = 10;
int number2 = 20;
IBEROÁMERICA
if (number2 > number1)
{
Console.WriteLine(“number2 es mayor que number1”);
}
ETC 3. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.
4. Verá el resultado del programa en la ventana de línea de comandos.
5. Presione una tecla para cerrar la ventana de consola.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Este código es funcionalmente equivalente al diagrama de fujo de la Figura 1-4.

Introducción a la programación
13
Figura 1-4
INICIO
El diagrama de flujo
equivalente a la sentencia
if
n1 = 10
n2 = 20
n2 > n1?
No
Si
Salida “n2
es > n1”
FIN
Aquí la sentencia de salida sólo se ejecutará si la expresión booleana en el paréntesis es
verdadera. Si la expresión es falsa, el control pasa a la siguiente sentencia que sigue de la
sentencia if.
En C#, los paréntesis alrededor de la condición son obligatorios, no así las llaves, estas son
opcionales si sólo hay una sentencia en el bloque de código. Por lo tanto, la sentencia if
www.pdftron.com
anterior equivale a:
if (number2 > number1)
Console.WriteLine(“number2 es mayor que number1”);
Por otro lado, observe este ejemplo:
if (number2 > number1)
IBEROÁMERICA
Console.WriteLine(“number2 es mayor que number1”);
Console.WriteLine(number2);
Aquí, sólo la primera sentencia Console.WriteLine es parte de la sentencia if. La segunda
sentencia Console.WriteLine siempre se ejecutará no importando el valor de la expresión
ETC booleana.Para tener una mejor claridad, es mejor encerrar la sentencia que se vaya a ejec
condicionalmente entre llaves.
Las sentencias if también se pueden anidar dentro de otras sentencias if, como se muestra
en el siguiente ejemplo:
int number1 = 10;

14
Lección 1
if (number1 > 5)
{
Console.WriteLine(“number1 es mayor que 5”);
if (number1 < 20)
{
Console.WriteLine(“number1 es menor que 20”);
}
}
Puesto que las dos condiciones se evalúan como verdadero, se generará el siguiente
resultado:
number1 es mayor que 5
number1 es menor que 20
Pero ¿qué sucedería si el valor de number1 fuera 25 en lugar de 10 antes de la ejecución
de la sentencia exterior? En este caso, la primera expresión booleana se evaluaría como
verdadera pero la segunda se evaluaría como falsa y se generaría el siguiente resultado:
number1 es mayor que 5
www.pdftron.com
La sentencia if-else
La sentencia if-
else le permite a su programa llevar a cabo una acción si la expresión booleana se ev
verdadera y una acción diferente si la expresión se evalúa como falsa.
Considere los siguientes pasos para crear un programa que utiliza una sentencia if-
else.
IBEROÁMERICA
Æ Uso de la sentencia if-else
PREPÁRESE. Para utilizar una sentencia if-else, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre ifelse_Statement)
a la solución Lesson01.
ETC 2. Agregue el siguiente código al método Main de la clase Program.cs:
TestIfElse(10);
3. Agregue el siguiente método a la clase Program.cs:
public static void TestIfElse(int n)
{
if (n < 10)
{

Introducción a la programación
15
Console.WriteLine(“n es menor que 10”);
}
else if (n < 20)
{
Console.WriteLine(“n es menor que 20”);
}
else if (n < 30)
{
Console.WriteLine(“n es menor que 30”);
}
else
{
Console.WriteLine(“n es mayor que o igual a 30”);
}
}
4. Seleccione Depurar, Iniciar sin depurar o presione Ctrl+F5.
5. Verá el resultado del programa en la ventana de comandos.
6. Presione una tecla para cerrar la ventana.
7. Modifique el código del método Main para invocar el método TestIfElse con valore
diferentes. Observe cómo se ejecuta una bifurcación de la sentencia if-
else como resultado
de sus cambios.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
www.pdftron.com
El código en el método TestIfElse combina varias sentencias if-
else para evaluar varias
condiciones. Si el valor de n es 25, entonces las primeras dos condiciones (n < 10 y n < 20)
se evaluarán como falsas pero la tercera condición (n<30) se evaluará como verdadera. Por
lo tanto, el método imprimirá el siguiente resultado: n es menor que 30
Este programa en C# equivale al diagrama de fujo en la Figura 1-5.
Figura 1-5
IBEROÁMERICA
INICIO
Diagrama de flujo
equivalente a la sentencia
if-else
Si
Salida “n
n < 10?
< 10”
No
Si
Salida “n
n < 20?
ETC
< 20”
No
Si
Salida “n
n < 30?
< 30”

No
Salida “n
>= 30”
FIN

16
Lección 1
La sentencia switch
La sentencia switch permite una bifurcación múltiple. En muchos casos, el uso de una
simplifcar una combinación compleja de sentencias if-else.
La sentencia switch consiste de la palabra reservada switch, seguida de una expresión en
paréntesis, seguida de un bloque para el mismo. El bloque del switch puede incluir una
Tome Nota
o más sentencias case o una sentencia default. Cuando se ejecuta la sentencia switch,
La expresión que sigue
dependiendo del valor de la expresión del switch, se transfere el control a una sentencia
a la sentencia case
case coincidente. Si la expresión no coincide con ninguna sentencia case, el control se
debe ser una expresión
transfere a la sentencia default. La expresión del switch debe ir entre paréntesis.
constante y debe ser
del mismo tipo de datos
Considere los siguientes pasos para crear un programa que utiliza una sentencia switch
de la expresión del
para evaluar expresiones simples.
switch.
Æ Uso de la sentencia switch
PREPÁRESE. Para utilizar la sentencia switch, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre switch_Statement) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
TestSwitch(10, 20, ‘+’);
www.pdftron.com
3. Agregue el siguiente método a la clase Program.cs:
public static void TestSwitch(int op1, int op2, char opr)
{
int result;
switch (opr)
IBEROÁMERICA
{
case ‘+’:
result = op1 + op2;
ETC break;
case ‘-’:
result = op1 - op2;
break;
case ‘*’:

Introducción a la programación
17
Tome Nota
result = op1 * op2;
El método Console.
Write puede utilizar
break;
cadenas de formato
como “Resultados:
case ‘/’:
{0}” para dar formato
al resultado. Aquí la
result = op1 / op2;
cadena {0} representa
el primer argumento
break;
que sigue a la cadena
de formato. En el
default:
método TestSwitch,
la cadena de formato
Console.WriteLine(“Operador desconocido”);
“{0}” se reemplaza con
el valor del siguiente
return;
argumento, result.
}
Console.WriteLine(“Resultado: {0}”, result);
return;
}
4. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.
5. Verá el resultado del programa en la ventana de comandos.
6. Presione una tecla para cerrar la ventana.
www.pdftron.com
7. Modifique el código del método Main para llamar al método TestSwitch con valore
diferentes. Observe cómo se ejecuta una bifurcación diferente de la sentencia switch
como resultado de sus cambios.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Aquí, el método TestSwitch acepta dos operandos (op1 y op2) y un operador (opr) y evalúa
la expresión resultante. El valor de la expresión switch se compara con las sentencias case
IBEROÁMERICA
en el bloque del switch. Si existe una coincidencia, se ejecutan las sentencias del case
correspondiente. Si no hay coincidencias, el control se transfere a la bifurcación opcional
default.
Hay una sentencia break después de cada case. La sentencia break termina la sentencia
switch y transfere el control a la siguiente sentencia fuera del bloque del switch. Al utilizar
un break se asegura que sólo se ejecute una bifurcación y evita errores de programación. De
hecho, si coloca código después de la sentencia case, debe incluir un break (u otra sentencia
ETC de transferencia de control como el return) para asegurarse que el control no se transfera
de un case a otro.
Por el contrario, si no hay código en la sentencia case, está bien si el control pasa a la
sentencia case subsecuente. El siguiente código demuestra que tan útil puede ser esto:
public static void TestSwitchFallThrough()
{

18
Lección 1
Tome Nota
DateTime dt = DateTime.Today;
Puede decidir entre
switch (dt.DayOfWeek)
utilizar sentencias if-
else o una sentencia
switch dependiendo
{
de la naturaleza
de comparación y
case DayOfWeek.Monday:
legibilidad del código.
Por ejemplo, el código
case DayOfWeek.Tuesday:
del método TestIfElse
toma decisiones
case DayOfWeek.Wednesday:
con base en las
condiciones que son
case DayOfWeek.Thursday:
más apropiadas
de utilizar con las
case DayOfWeek.Friday:
sentencias if-else. En
el método TestSwitch,
Console.WriteLine(«Hoy es un día laboral»);
las decisiones se
basan en valores
break;
constantes, por lo que
el código es mucho
default:
más legible en una
sentencia switch.
Console.WriteLine(«Hoy es un día de fn de semana»);
break;
}
; ¿Listo para la
certificación?
}
www.pdftron.com
¿Comprende las
Aquí si el valor de la expresión dt.DayofWeek es DayOfWeek.Monday, entonces existe
estructuras de decisión
una coincidencia con el primer case, pero puesto que no hay código (o una sentencia de
computacionales como
transferencia de control, la ejecución continúa a la siguiente sentencia, resultando en la
las bifurcaciones y la
repetición? -1.2
aparición del mensaje “Hoy es un día laboral” en la ventana de consola.
IBEROÁMERICA
� Comprender las estructuras de repetición
È EN RESUMEN
C# cuenta con cuatro estructuras de control diferentes que permite a los programas llevar a cab
el ciclo while, el do-while, el for y el foreach.
ETC Estas sentencias de control de repetición se pueden utilizar para ejecutar las sentencias
dentro el cuerpo del ciclo una cantidad de veces dependiendo de los criterios de terminación
del ciclo.
Un ciclo también puede interrumpirse utilizando una sentencia de transferencia de control
que asigne el control fuera del ciclo. Estas sentencias son break, goto, return o throw. La
sentencia continue se puede utilizar para pasar el control a la siguiente iteración del ciclo
sin salir de este.

Introducción a la programación
19
Comprender el ciclo while
El ciclo while ejecuta repetidamente un bloque de sentencias hasta que una expresión boolean
La forma general de un ciclo while es
while (boolean test)
sentencia
Aquí, se lleva a cabo una evaluación booleana al principio del ciclo. Si es verdadero, se
Tome Nota
ejecuta el cuerpo del ciclo y se realiza de nuevo la evaluación. Si la evaluación resulta en
un valor falso, se termina el ciclo y el control se transfere a la siguiente sentencia después
La evaluación booleana
del ciclo.
debe colocarse entre
paréntesis. Si se
Puesto que la evaluación booleana se lleva a cabo antes de la ejecución del ciclo, es posible
ejecuta más de una
que el cuerpo del while nunca se ejecute. Esto pasa si la evaluación resulta falsa desde la
sentencia como parte
primera vez.
del ciclo while, se
deben colocar entre
llaves.
Considere los siguientes pasos para crear un programa que utiliza la sentencia while.
Æ Uso de la sentencia while
PREPÁRESE. Para utilizar la sentencia while, lleve a cabo las siguientes tareas:
www.pdftron.com
1. Agregue un nuevo proyecto de aplicación de consola (de nombre while_Statement) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
WhileTest();
3. Agregue el siguiente método a la clase Program.cs:
private static void WhileTest()
IBEROÁMERICA
{
int i = 1;
while (i <= 5)
ETC { Console.WriteLine(“El valor de i = {0}”, i);
i++;
}
}

20
Lección 1
4. Seleccione Depurar después Iniciar sin depurar, o presione Ctrl+F5.
5. Verá el resultado del programa en la ventana de línea de comandos.
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
En este ejercicio, a la variable i se le asigna el valor 1. A continuación, se evalúa la condición
del ciclo while. Puesto que la condición es verdadera (1<=5), se ejecuta el código del
bloque de sentencias while. El valor de i se escribe en la ventana de línea de comandos y el
valor de i se incrementa en 1, por lo que ahora vale 3. El control pasa entonces de vuelta a
la sentencia while y la condición se evalúa de nuevo. Puesto que la condición sigue siendo
verdadera (2<=5), el bloque de sentencias se ejecuta de nuevo. El ciclo continua hasta que
el valor de i sea 6 y la condición en el ciclo while sea falsa (6<=5). El método anterior,
cuando se ejecuta, genera el siguiente resultado.
El valor de i = 1
El valor de i = 2
El valor de i = 3
El valor de i = 4
El valor de i = 5
El diagrama de fujo equivalente a este ciclo while se encuentra en la Figura 1-6.
www.pdftron.com
Figura 1-6
Diagrama de flujo
INICIO
equivalente al ciclo while
i = 1
No
IBEROÁMERICA
i <= 5?
Si
Imprimir i
ETC
i = i + 1
FIN

Introducción a la programación
21
Tome Nota
La sentencia en el ciclo, el cual incrementa el valor de i, juega un papel crítico. Si omite esa
sentencia, la conducción de terminación nunca se alcanzará y se tendrá un ciclo infnito.
Para evitar un
ciclo infinito, debe
asegurarse que este
En la mayoría de los casos, para tener un ciclo while bien diseñado, debe contar con tres
se haya diseñado de
partes:
forma tal que lleve a
1. Inicialización: El inicializador establece el contador del ciclo en un valor inicial correcto.
una terminación.
En el ejemplo anterior, la variable i se establece en 1 antes de que inicie el ciclo.
2. Evaluación del ciclo: La evaluación del ciclo especifca la condición de terminación para el
ciclo. En el ejemplo anterior, la expresión (i>=5) es la expresión de condición.
3. Expresión de terminación: La expresión de terminación cambia el valor del contador del
ciclo de forma tal que se alcance la condición de terminación. En el ejemplo anterior, la
expresión i++ es la expresión de terminación.
Comprender el ciclo do-while
El ciclo do-
while ejecuta repetidamente un bloque de sentencias hasta que una expresión booleana
evalúe como falsa. El ciclo do-while evalúa la condición al fnal del ciclo.
El ciclo do-
while es similar al while, pero a diferencia de este, el cuerpo del ciclo do-while
se ejecuta al menos una vez.
Tome Nota
La forma general del ciclo do-while es
La evaluación booleana
se debe colocar
do
entre paréntesis. Si
se necesita ejecutar
sentencia
www.pdftron.com
más de una sentencia
como parte del ciclo
while (evaluación booleana);
do-while, se deben
colocar dentro de
Considere los siguientes pasos para crear un programa que utilice la sentencia do-
while.
llaves.
Æ Uso de la sentencia do-while
IBEROÁMERICA
PREPÁRESE. Para utilizar la sentencia do-while, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre dowhile_Statement) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
ETC DoWhileTest();
3. Agregue el siguiente método a la clase Program.cs:
private static void DoWhileTest()
{
int i = 1;
do

22
Lección 1
{
Console.WriteLine(“El valor de i = {0}”, i);
i++;
}
while (i <= 5);
}
4. Seleccione Depurar posteriormente Iniciar sin depurar, o presione Ctrl+F5.
5. Verá el resultado del programa en la ventana de línea de comandos.
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
En este ejercicio, después de que la variable i se asigna en 1, el control entra directamente
en el ciclo. Se ejecuta el código dentro de la sentencia do-
while. El valor de i se escribe
en la ventana de línea de comandos y se incrementa en 1 por lo que el valor sube a 2.
A continuación, se evalúa la condición del ciclo do-
while. Como la condición aun es
verdadera (2<=5), el control regresa a la sentencia do-
while y el bloque de sentencias
se ejecuta de nuevo. El ciclo continua hasta que el valor de i llega a 6 y la condición del
do-
while resulta falsa (6<=5). El método anterior, cuando se ejecuta, genera el mismo
resultado que el método WhileTest.
www.pdftron.com
La elección entre un ciclo while y uno do-
while depende de si se quiere o no que el ciclo
se ejecute al menos una vez. Si quiere que el ciclo se ejecute cero o más veces, elija el ciclo
while. Por el contrario, si desea que el ciclo se ejecute una o más veces, elija el ciclo do-
while.
Comprender los ciclos
El ciclo for combina los tres elementos de iteración: la expresión de inicialización, la expresió
terminación y la expresión de conteo, de forma más legible.
IBEROÁMERICA
El ciclo for es similar al ciclo while; este permite que una o varias sentencias se ejecuten
de forma repetida hasta que una expresión se evalúe como falsa. La forma general del
ciclo for es:
for (init-expr; cond-expr; count-expr)
ETC
Tome Nota
sentencia
Las tres expresiones
de control se deben
Como puede ver, el ciclo for combina las tres expresiones de control esenciales de la
colocar entre
iteración, lo cual resulta en código más legible. El ciclo for es particularmente útil para
paréntesis. Si se
crear iteraciones que se deben ejecutar una cantidad especifcada de veces.
necesita ejecutar más
de una sentencia como
Considere los siguientes pasos para crear un programa que utilice la sentencia for.
parte del ciclo for, se
deben colocar dentro
de llaves.

Introducción a la programación
23
Æ Uso de la sentencia for
PREPÁRESE. Para utilizar la sentencia for, realice las siguientes tareas:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre for_Statement) a l
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
ForTest();
3. Agregue el siguiente método a la clase Program.cs:
private static void ForTest()
{
for(int i = 1; i<= 5; i++)
{
Console.WriteLine(“El valor de i = {0}”, i);
}
}
4. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.
5. Verá el resultado de su programa en la ventana de línea de comandos.
www.pdftron.com
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Cuando se ejecuta el método ForTest, se produce el mismo resultado que con el método
WhileTest. Aquí, la variable i se crea dentro del ámbito del ciclo for y su valor se asigna
en 1. El ciclo continúa mientras el valor de i sea menor o igual a 5. Después del cuerpo del
ciclo, se evalúa count-expr y el control regresa a cond-expr,
IBEROÁMERICA
Todos las expresiones de control de un ciclo for son opcionales. Por ejemplo, se pueden
omitir todas las expresiones para crear un ciclo infnito como el siguiente:
for (; ;)
{
ETC //no hace nada
}
Comprender los ciclos foreach
El ciclo foreach es útil para la iteración a través de los elementos de un conjunto.
El ciclo foreach puede concebirse como una versión mejorada del ciclo for para la

24
Lección 1
iteración a través de colecciones como arreglos y listas. La forma general de la sentencia
foreach es la siguiente:
foreach (TipoElemento elemento in colección)
sentencia
Las expresiones de control para la sentencia foreach se deben colocar dentro de paréntesis.
Si se tiene que ejecutar más de una sentencia como parte del ciclo foreach, se deben
colocar dentro de llaves. Considere los siguientes pasos para crear un programa que
muestre la manera en la cual el ciclo foreach proporciona una forma sencilla de realizar
iteraciones en una colección.
Æ Uso de la sentencia foreach
PREPÁRESE. Para utilizar la sentencia foreach, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre foreach_Statement) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
ForEachTest();
3. Agregue el siguiente método a la clase Program.cs:
private static void ForEachTest()
www.pdftron.com
{
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int i in numbers)
{
IBEROÁMERICA
Console.WriteLine(“El valor de i = {0}”, i);
}
}
4. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.
ETC 5. Verá el resultado de su programa en la ventana de línea de comandos.
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
En este ejercicio, el ciclo itera de forma secuencial a través de cada elemento de la colección
y muestra el resultado en la ventana de línea de comandos. Este método genera el mismo
resultado que el método ForTest.

Introducción a la programación
25
Comprender la recursividad
La recursividad es una técnica de programación que causa que un método se invoque a sí mism
resultado.
La recursividad y la iteración se encuentran relacionadas. Se puede escribir un método que
produzca los mismos resultados ya sea utilizando recursividad o iteraciones. Generalmente,
la naturaleza del problema en sí, le ayudará a seleccionar entre una solución recursiva
o iterativa. Por ejemplo, una solución recursiva es más elegante cuando puede defnir
la solución de un problema en términos de una versión más compacta para el mismo
problema.
Para tener una mejor idea, tomemos el ejemplo de la operación factorial en matemáticas.
La defnición recursiva general para el factorial de n (n!) es:

De acuerdo con esta defnición, si el número es 0, el factorial es uno. Si el número es mayor
a cero, el factorial es el número multiplicado por el factorial del siguiente número más
pequeño. Por ejemplo, se puede desglosar 3! de la siguiente manera: 3! = 3 * 2! à 3 * 2
* 1! à 3 * 2 * 1 * 0! à 3 * 2 * 1 * 1 à 6.
Considere los siguientes pasos para crear un programa que presente una solución recursiva
para el problema factorial.
www.pdftron.com
Æ Uso del método recursivo
PREPÁRESE. Para utilizar el método recursivo, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre RecursiveFactorial) a la
solución Lesson01.
IBEROÁMERICA
2. Agregue el siguiente código al método Main de la clase Program.cs:
Factorial(5);
3. Agregue el siguiente método a la clase Program.cs:
public static int Factorial(int n)
ETC { if (n == 0)
{
return 1; //caso base
}

26
Lección 1
else
{
return n * Factorial(n - 1); // caso recursivo
}
}
4. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.
5. Verá el resultado del programa en la ventana de línea de comandos. Presione
una tecla
para cerrar la ventana.
6. Modifique el método Main para pasar un valor diferente al método Factorial
y observe los
resultados.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Como se vio en el ejercicio anterior, una solución recursiva tiene dos partes principales:
• El caso base: La parte que especifca la condición de terminación que no llama
nuevamente al método. El caso base en el método Factorial es n == 0. Si no tiene
; ¿Listo para la
un caso base en su algoritmo recursivo, se crea una recursión infnita. Una recursión
certificación?
infnita hará que su computadora se quede sin memoria y arrojará una excepción
¿Puede identificar
System.StackOverfowException.
apropiadamente
• El caso recursivo: La parte que mueve el algoritmo hacia la clase base. El caso
los métodos para
recursivo en el método Factorial es la parte del else, donde se llama nuevamente el
el manejo de las
método pero con un valor menor para progresar hacia el caso base.
www.pdftron.com
repeticiones? 1.3
� Comprender el manejo de excepciones
È EN RESUMEN
IBEROÁMERICA
El .NET Framework soporta el manejo de excepciones para errores en tiempo de ejecución. En
a utilizar las excepciones try, catch, y fnally.
Una excepción es una condición de error que ocurre durante la ejecución de un programa
en C#. Cuando esto sucede, el tiempo de ejecución crea un objeto para representar el
ETC error y “lanzarlo”. A menos que “atrape” la excepción escribiendo el código correcto par
manejar excepciones, la ejecución del programa terminará.
Por ejemplo, si intenta dividir un entero entre cero, se lanzará una excepción
DivideByZeroException. En el .NET Framework, una excepción se representa utilizando
un objeto de la clase System.Exception o una de sus clases derivadas. Existen clases
de excepción predefnidas que representan las situaciones de error más comunes como
DivideByZeroException. Si se encuentra diseñando una aplicación que necesite lanzar
excepciones específcas de aplicación, deberá crear clases de excepción personalizadas que
se deriven de la clase System.Exception.

Introducción a la programación
27
Manejo de excepciones
Para manejar excepciones, coloque el código que las lance dentro de un bloque try y coloque e
las excepciones dentro de un bloque catch.
El siguiente ejercicio demuestra cómo utilizar un bloque try-
catch para manejar una
excepción. Este ejercicio utiliza el método File.OpenText para abrir un archivoarchioe en
disco. Esta sentencia se ejecutará bien en un caso normal, pero si no se encuentra el archivo
o permiso de lectura del mismo, se lanzará una excepción.
Æ Manejo de excepciones
PREPÁRESE. Para manejar excepciones, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre
HandlingExceptions) a la
solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
ExceptionTest();
3. Agregue el siguiente método a la clase Program.cs:
private static void ExceptionTest()
{
StreamReader sr = null;
try
www.pdftron.com
{
sr = File.OpenText(@”c:\data.txt”);
Tome Nota
La clase StreamReader
Console.WriteLine(sr.ReadToEnd());
es parte del espacio
}
de nombres System.
IO. Cuando este código
catch (FileNotFoundException fnfe)
se ejecuta, necesitará
{
IBEROÁMERICA
agregar una directiva
using para el espacio
Console.WriteLine(fnfe.Message);
de nombres System.IO.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
ETC }
}
4. Cree un archivo (“data.txt”) utilizando el Bloc de notas o Visual Studio en la
unidad c:. Se
puede crear el archivo en otra ubicación pero si lo hace, recuerde modificar la
ubicación
del archivo en el programa. Escriba algo de texto en el archivo.
5. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.
6. Verá que el contenido del archivo de texto aparece en la ventana de línea de
comandos.

28
Lección 1
Tome Nota
Presione una tecla para cerrar la ventana.
En el método
7. Elimine el archivo data.txt y ejecute nuevamente el programa. Esta vez
aparecerá una
ExceptionTest, es
excepción a FileNotFoundException y aparecerá un mensaje en la ventana.
incorrecto cambiar
el orden de los dos
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
bloques catch. Las
excepciones más
específicas necesitan
enlistarse antes de
las excepciones
Para manejar la excepción, se colocan la sentencias que pueden causar la excepción en un
genéricas, de lo
bloque try. Luego se agregan los bloques catch para manejar una o más excepciones. En este
contrario ocurrirán
ejemplo, además de manejar la excepción FileNotFoundException, también utilizamos un
errores de compilación.
bloque catch con más excepciones genéricas para obtener todas las otras excepciones. El
nombre de la excepción para un bloque catch debe ir entre paréntesis. Las sentencias que
se ejecutan cuando se obtiene una excepción deben ir entre llaves.
La ejecución del código se detiene cuando ocurre una excepción. El tiempo de ejecución
Tome Nota
busca una sentencia catch que corresponda al tipo de excepción. Si el primer bloque
Un bloque try debe
catch no atrapa la excepción arrojada, el control se mueve al siguiente bloque catch y así
tener al menos un
sucesivamente. Si la excepción no se maneja en el método, el tiempo de ejecución revisa la
bloque catch o un
sentencia catch en el código y continúa para el resto de la pila de llamadas.
bloque finally asociado.
Uso de try-catch-finally
El bloque fnally se utiliza con el bloque try. El bloque fnally siempre se ejecuta sin importar si
excepción. El bloque fnally se utiliza con frecuencia para escribir código de limpieza.
www.pdftron.com
Cuando ocurre una excepción, con frecuencia signifca que algunas líneas de código no
se ejecutaron luego de que ocurrió la excepción, lo cual puede dejar su programa en un
estado inestable. Puede utilizar la sentencia fnally para garantizar que se ejecute código de
limpieza. Esto puede involucrar el cerrar conexiones, liberar recursos o establecer variables
a sus valores esperados. Observemos el código del siguiente ejercicio.
Æ Uso de try-catch-finally
IBEROÁMERICA
PREPÁRESE. Para utilizar la sentencia try-catch-finally, realice lo siguiente:
1. Agregue un nuevo proyecto de aplicación de consola (de nombre trycatchfinally) a
solución Lesson01.
2. Agregue el siguiente código al método Main a la clase Program.cs:
TryCatchFinallyTest();
ETC 3. Agregue el siguiente método a la clase Program.cs:
private static void TryCatchFinallyTest()
{
StreamReader sr = null;
try
{
sr = File.OpenText(@”c:\data.txt”);

Introducción a la programación
29
Console.WriteLine(sr.ReadToEnd());
}
catch (FileNotFoundException fnfe)
{
Console.WriteLine(fnfe.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
fnally
{
if (sr != null)
{
sr.Close();
}
}
}
www.pdftron.com
4. Cree un archivo de texto (“data.txt”) utilizando el Bloc de notas o Visual Studio en la unid
c:. Se puede crear el archivo en otra ubicación pero recuerde modificar la ubicación del
archivo en el programa. Escriba texto en el archivo.
5. Seleccione Depurar, Iniciar sin depurar o presione Ctrl+F5.
6. Verá que el contenido del archivo de texto aparece en la ventana de línea de comandos.
Presione una tecla para cerrar la ventana.
7. Elimine el archivo data.txt file y ejecute nuevamente el programa. Esta vez obtendr
FileNotFoundException y aparecerá un mensaje en la ventana.
IBEROÁMERICA
; ¿Listo para la
certificación?
En este ejercicio, el programa se asegura que el objeto StreamReader se cierre y que se
¿Comprende cómo
liberen los recursos cuando se complete la operación. El código en el bloque fnally se
manejar errores en sus
ejecuta sin importar si aparece una excepción o no.
programas? -1.4
ETC

30
Lección 1
Matriz de resumen de habilidades
En esta lección aprendió:
• Un algoritmo es un conjunto de pasos ordenado y fnito para solucionar un
problema dado. Puede encontrar de utilidad expresar un algoritmo a través de un
diagrama de fujo o de una tabla de decisión antes de desarrollar un programa de
manera formal.
• El lenguaje de programación C# es parte del .NET Framework y se benefcia
tanto del soporte de tiempo de ejecución y las librerías de clase incluidas en .NET
Framework.
• Main es un método especial que también sirve como punto de entrada al programa.
Cuando el tiempo de ejecución corre un programa, siempre inicia en el método
Main.
• Las variables en C# son marcadores de posición utilizadas para almacenar valores.
Una variable tiene un nombre y un tipo de datos. El tipo de datos de la variable
determina el valor que esta puede contener y el tipo de operaciones en las cuales se
puede utilizar.
• El tipo de datos determina el tamaño de memoria necesario para almacenar los
datos el tipo de operaciones que se pueden llevar a cabo con la información.
• Los operadores son símbolos como +, -
, *, /, que especifcan cual operación llevar a
cabo con los operandos y regresar un resultado.
• Las sentencias if-
else le permiten a su programa llevar a cabo una acción si la
www.pdftron.com
expresión booleana se evalúa como verdadera o una acción diferente si la expresión
resulta ser falsa.
• La sentencia switch le permite contar con varias ramifcaciones. En la mayoría de
los casos, una sentencia switch puede simplifcar una combinación compleja de
sentencias if-else.
• C# tiene cuatro estructuras de control diferentes que le permite a sus programas
llevar a cabo tareas repetitivas: el ciclo while, el do-while, el for y el foreach.
• El while y el do-
while ejecutan de forma repetida un bloque de sentencias hasta que
una expresión booleana específca se evalúe como falsa. El ciclo do-
while evalúa la
IBEROÁMERICA
condición al fnal del ciclo.
• El ciclo for combina los tres elementos de iteración: la sentencia de inicialización,
la condición de terminación y la sentencia de incremento/decremento en un código
más legible.
• El ciclo foreach es útil para iterar los elementos de una colección.
• La recursión es una técnica de programación que hace que un método se llame a sí
ETC mismo para computar un resultado.
• El .NET Framework soporta el manejo de excepciones estándar y maneja errores
en tiempo de ejecución. Para manejar las excepciones, se coloca código que arroja
excepciones dentro de un bloque try y se coloca código que maneja las excepciones
en un bloque catch.
• El bloque fnally se utiliza con el bloque try. El bloque fnally siempre se ejecuta sin
importar si se arroja o no una excepción. El bloque fnally se utiliza con frecuencia
para escribir código de limpieza.

Comprender los conceptos básicos de bases de datos


31

» Evaluación de conocimiento
Complete los espacios en blanco
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios en blanco proporcionados.
1. La sentencia ______ selecciona la ejecución de una lista de sentencias teniendo una
etiqueta asociada que corresponda al valor de una expresión.
2. El ciclo ______ evalúa la condición al fnal en lugar de hacerlo al principio del ciclo.
3. El único operador que toma tres argumentos es el operador ______.
4. El ciclo ______ representa la forma más compacta para iterar los elementos de una
colección.
5. En una computadora de 32-
bit, una variable del tipo de datos int ocupa ______ bytes
de memoria.
6. Par acceder al primer elemento de un arreglo, se utilice un índice de _____.
7. La ______ es una técnica de programación que causa que un método se llame a sí
mismo para poder computar un resultado.
8. Las ______ son los campos de datos o variables locales cuyos valores no se modifcan.
9. Cuando un algoritmo involucra grandes cantidades de condiciones, una ______ es un
formato compacto y más legible para presentar el algoritmo.
www.pdftron.com
10. Un ______ es una representación gráfca de un algoritmo.
Opción múltiple
Encierre la letra que corresponda a la respuesta correcta.
1. Si escribe el siguiente código:
IBEROÁMERICA
int n = 20;
int d = n++ + 5;
2. ¿Cuál será el valor de d después de ejecutar el código?
a. 25
b. 26
ETC c. 27d. 283. Si escribe el siguiente código:
private static void WhileTest()
{
int i = 1;

32
Lección 1
while (i < 5)
{
Console.WriteLine(“El valor de i = {0}”, i);
i++;
}
}
4. ¿Cuántas veces se ejecutará el ciclo while en este código?
a. 0
b. 1
c. 4
d. 5
5. Si escribe el siguiente código:
int number1 = 10;
int number2 = 20;
if (number2 > number1)
Console.WriteLine(“number1”);
www.pdftron.com
Console.WriteLine(“number2”);
6. ¿Cuál resultado aparecerá después de ejecutar este código?
a. number1
b. number2
c. number1 number2
d. number2 number1
7. En una sentencia switch, si ninguno de las sentencias case coincide con la expresión
IBEROÁMERICA
del switch, ¿a cuál sentencia se transfere el control?
a. break
b. continue
c. default
d. return
8. Necesita escribir código que cierre una conexión a una base de datos. Necesita
ETC asegurarse que este código se ejecute siempre sin importar si ocurre o no una
excepción. ¿Dónde debería escribir este código?
a. Dentro de un bloque try
b. Dentro de un bloque catch
c. Dentro de un bloque fnally
d. Dentro de un método Main
9. Necesita almacenar valores con un rango de 0 a 255. Necesita también asegurarse
que el programa minimice el uso de memoria. ¿Cuál tipo de datos debería utilizar

Comprender los conceptos básicos de bases de datos


33
para almacenar estos valores?
a. Byte
b. Char
c. Short
d. Int
10. Si no tiene una clase base en su algoritmo recursivo, crea una recursión infnita. Una
recursión infnita causará que su programa arroje una excepción. ¿Cuál excepción será
esta?
a. OutOfMemoryException
b. StackOverfowException
c. DivideByZeroException
d. InvalidOperationException
11. Se encuentra aprendiendo cómo desarrollar algoritmos repetitivos en C#: Escribe el
siguiente método:
private static void ForTest()
{
for(int i = 1; i < 5;)
{
Console.WriteLine(“El valor de i = {0}”, i);
}
www.pdftron.com
}
12. ¿Cuántas repeticiones llevará cabo este ciclo for?
a. 0
b. 4
c. 5
d. infnito
IBEROÁMERICA
13. ¿Cuál de las siguientes características de C# utilizaría para organizar el código y crear
tipos globalmente únicos?
a. Assemblies
b. Espacio de nombres
c. Clase
d. Tipo de datos
ETC 14. Al escribir el siguiente código:
int[] numbers = {1, 2, 3, 4};
int val = numbers[1];
15. También crea una variable del tipo RectangleHandler como se muestra a
continuación:
RectangleHandler handler;

34
Lección 1
16.
¿Cuál es el valor de la variable val después de ejecutar el código?
a. 1
b. 2
c. 3
d. 4

» Evaluación de destreza
Escenario 1-1: Convierta una tabla de decisión en un Programa de C#
Se encuentra desarrollando una aplicación de facturación que calcula los porcentajes
de descuento con base en la cantidad de productos adquiridos. La lógica para calcular
descuentos se encuentra en la siguiente tabla de decisión. Necesita escribir un método en
C# que utilice la misma lógica para calcular el descuento. ¿Cómo escribiría su programa?
Cantidad < 10
S
N
N
N
Cantidad < 50
S
S
N
N
Cantidad < 100
S
S
S
N
Descuento
5%
10%
15%
20%
Escenario 1-2: Convierta un diagrama de flujo en un programa de C#
Se encuentra desarrollando una librería de funciones matemáticas. Antes desarrolló
www.pdftron.com
el siguiente diagrama de fujo para describir el algoritmo para calcular el factorial de
un número. Necesita escribir un equivalente en C# para este diagrama de fujo. ¿Cómo
escribiría el programa?
INICIO
Ingresar n
IBEROÁMERICA
fact = 1
No
n > 1?
Si
ETC
fact = fact * n
n = n - 1
Salida de
fact
FIN

Comprender los conceptos básicos de bases de datos


35

» Evaluación de aptitud
Proyecto 1-3: Maneje excepciones
Se encuentra escribiendo código para una librería aritmética simple. Decide crear un
método de nombre Divide que toma dos argumentos, x y y, y regresa el valor de x/y.
Necesita obtener cualquier excepción aritmética que pueda resultar de los errores en
aritmética, casting o conversiones de tipos de datos. También necesita obtener cualquier
otra excepción que pueda resultar del código. Necesita crear el código para manejar
excepciones estructurándolo de forma correcta para cubrir este requerimiento. ¿Cómo
escribiría un programa con estas características?
Proyecto 1-4: Cree un algoritmo recursivo
Se encuentra desarrollando una librería de funciones de utilidad para su aplicación. Necesita
escribir un método que tome un entero y cuente la cantidad de dígitos signifcativos en
el mismo. Necesita crear un programa recursivo para solucionar este problema. ¿Cómo
escribiría un programa con estas características?
www.pdftron.com
IBEROÁMERICA
ETC

36
Lección 1
www.pdftron.com
IBEROÁMERICA
ETC

Lección 2
Introducción a la programación orientada a objetos
Matriz de dominio de objetivos
Habilidad tecnológica
Descripción de dominio de objetivo
Número del dominio
del objetivo
Comprender los objetos
Comprender los principios básicos de las
2.1
clases
Comprender los valores y las referencias
Comprender el almacenamiento y los tipos
1.1
de datos
Comprender el encapsulamiento
Comprender el encapsulamiento
2.4
Comprender la herencia
Comprender la herencia
2.2
Comprender el polimorfismo
Comprender el polimorfismo
2.3
Comprender las interfaces
Comprender las interfaces
2.4
Términos clave
• Accessors
• Evento
• Propiedad
• Clase abstracta
• Herencia
• Tipo de referencia
• Constructor
• Interfaz
• Tipo de valor
www.pdftron.com
• Delegado
• Espacio de nombres
• Encapsulamiento
• Polimorfsmo
IBEROÁMERICA
Como desarrollador de software para la corporación Northwind, forma parte de un equ
desarrollo de programas de computadora que resuelven problemas de la empresa. Cualq
programa que escriba debe ser fácil de entender y mantener por un largo periodo de tiempo. N
desarrollar programas utilizando técnicas que impulsen el reciclado de código, la extensibilida
la colaboración.
En lugar de pensar en un programa como una lista de métodos, incorpore en sus prog
ETC conceptos de negocios del mundo real como clientes, productos, proveedores y las intera
entre los mismos.

38
Lección 2
� Comprender objetos
È EN RESUMEN
La programación orientada a objetos es una técnica de programación que utiliza objetos. Los o
de datos auto contenidas que consisten de propiedades, métodos y eventos. Las propiedades es
representados por el objeto, los métodos especifcan el comportamiento de un objeto y los even
comunicación entre los objetos.
Pensar de forma orientada a objetos
Un objeto de software es conceptualmente similar a un objeto en el mundo real.
Una buena manera de empezar a pensar de forma orientada a objetos es observando el
mundo real por ejemplo, un coche, un teléfono, un reproductor de música, etc. Notará
que todos tienen un estado y un comportamiento. Por ejemplo, los coches tienen un
estado (nombre del modelo, color, velocidad, cantidad de gasolina) y un comportamiento
(acelerar, frenar, cambiar velocidades). También notará que algunos objetos son más
simples y otros más complejos. Algunos objetos complejos como los coches están hechos
de objetos más pequeños que a su vez tienen su propio estado y comportamiento. También
se dará cuenta que aunque un coche es un objeto complejo, sólo necesita saber algunas
cuantas cosas para poder interactuar con uno. Cuando conduce un auto, simplemente
invoca un comportamiento como acelerar o frenar y desconoce muchos miles de detalles
internos sobre su funcionamiento.
www.pdftron.com
Un objeto de software es conceptualmente similar a uno del mundo real. Un objeto
almacena su estado en campos y expone su comportamiento a través de métodos. Cuando
se invoca un método en el objeto, obtendrá una funcionalidad bien defnida sin la
necesidad de preocuparse sobre la complejidad interna del objeto o del método en sí. Este
concepto de ocultar complejidad se conoce como encapsulamiento y es una de las muchas
características de la programación orientada a objetos que aprenderá en esta lección.
Comprender las clases IBEROÁMERICA
Una clase es una plantilla de la cual se crean los objetos individuales.
Los objetos en el mundo real necesitan de una plantilla que defna la forma en la que
se construirán. Todos los objetos que se crean a partir de la misma plantilla se ven y
comportan de forma similar. Por ejemplo, piense en un modelo específco de un coche. En
el mundo del software, una clase es la plantilla de la cual se crean objetos individuales. A
un objeto se le conoce también como instancia de una clase.
ETC Æ Crear una clase
PREPÁRESE. Antes de realizar estos pasos, asegúrese de abrir Microsoft Visual Studio y abr
un nuevo proyecto de aplicación de consola de nombre Lesson02.
1. Agregue una nueva clase de Visual C# de nombre Rectangle al proyecto.

Introducción a la programación orientada a objetos


39
2. Reemplace el código de la clase Rectangle con el siguiente:
class Rectangle
{
private double length;
private double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
public double GetArea()
{
return length * width;
}
}
• Genere el proyecto y asegúrese de que no tenga errores.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
www.pdftron.com
Acaba de crear una nueva clase de C de nombre Rectangle. Para defnir una nueva
clase se utiliza la palabra reservada class. La clase Rectangle tiene dos campos de datos,
length y width. Estos campos se defnen utilizando el modificador de acceso private.
Un modifcador de acceso especifca a cual región de código tendrá acceso el campo. Por
ejemplo, un modifcador de acceso public no limita el acceso pero el modifcador de acceso
private limita el acceso dentro de la clase en la cual se defna el campo.
La clase también defne un método de nombre GetArea.
IBEROÁMERICA
Tome Nota
Cada clase es una
definición de un nuevo
tipo de datos. Por lo
tanto, una definición
de una clase se le
relaciona con un tipo.
ETC
Comprender los métodos
Un método es un bloque de código contiene una serie de sentencias.
Un método defne las acciones y operaciones soportadas por una clase. Un método se defne
al especifcar el nivel de acceso, el tipo de retorno, el tipo de método y una lista opcional
de parámetros en paréntesis seguido de un bloque de código dentro de llaves. La clase
Rectangle defne un solo método de nombre GetArea. Para GetArea, el nivel de acceso

40
Lección 2
es público, el tipo de retorno es double, el nombre del método es GetArea, la lista de
parámetros está vacía y el bloque de código es una sentencia return sencilla.
Un método puede regresar un valor al código invocador. Si un método no regresa ningún
valor, su tipo de retorno se especifca con la palabra reservada void. El método debe utilizar
una sentencia return para poder regresar un valor. La sentencia return fnaliza la ejecución
de un método y regresa el valor específco al código invocador. El tipo de dato del valor
retornado de un método debe coincidir con el tipo de retorno especifcado en la línea de
declaración de un método.
El tipo de retorno del método GetArea es double, lo que signifca que el método GetArea
debe retornar un valor del tipo doble. El método GetArea satisface este requerimiento al
retornar la expresión length * width, el cual es un valor double.
El siguiente código defne un método InitFields que toma dos parámetros de tipo doble
y regresa un void:
public void InitFields(double l, double w)
{
Tome Nota
length = l;
El nombre del
width = w;
método, su lista de
parámetros y el orden
}
de los tipos de datos
de los parámetros se
El método InitFields toma dos parámetros y utiliza los valores de los mismos para asignar
reconocen en conjunto
de forma respectiva lo campos de datos length y width. Cuando el tipo de retorno de
como la firma del
un método es void, se puede utilizar una sentencia return sin valor. Si no se utiliza una
método. Una firma de
sentencia return, como en el método InitFields, el método dejará de ejecutarse cuando
www.pdftron.com
método debe ser única
llegue al fnal del bloque de código. El método InitFields se puede utilizar para inicializar
en la clase.
de forma apropiada el valor de los campos de datos, pero como lo aprenderá en la siguiente
sección, los constructores de hecho le dan una forma de inicializar una clase.
Comprender los constructores
Los constructores se utilizan para inicializar los miembros de datos del objeto.
IBEROÁMERICA
Los constructores son métodos de clase especiales que se ejecutan cuando se crea una nueva
instancia de la clase. Los constructores se utilizan para inicializar los miembros de datos
del objeto. Los constructores deben tener exactamente el mismo nombre de la clase y no
tienen un tipo de retorno. Se pueden defnir constructores múltiples, cada uno con una
frma única, para una clase.
Un constructor que no toma argumentos se conoce como el constructor default. Si se
ETC defne una clase sin ningún constructor, se genera automáticamente un constructor defaul
invisible que no hace nada.
Con frecuencia es útil tener constructores adicionales para contar con más formas con
la cuales inicializar un objeto. La clase Rectangle, defnida con anterioridad, es sólo una
forma de crear e inicializar su objeto: llamando al constructor que acepta dos parámetros,
ambos del tipo de datos default.

Introducción a la programación orientada a objetos


41
Crear objetos
Los objetos se crean a partir de plantillas defnidas por clases.
Æ Crear un objeto
UTILICE el proyecto de consola de aplicación, Lesson02, que creó en el
ejercicio anterior.
1. Modifique el código de la clase Program de la siguiente forma:
class Program
{
static void Main(string[] args)
{
Rectangle rect = new Rectangle(10.0, 20.0);
double area = rect.GetArea();
Console.WriteLine(“Área del Rectángulo: {0}”,
area);
}
}
2. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola
mostrando el área del rectángulo.
www.pdftron.com
3. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Tome Nota
Las clases y los objetos
La clase Rectangle cuenta con solo una forma de construir una instancia de la clase:
son diferentes. Una
invocando un constructor con dos argumentos del tipo de datos double. Se crea un objeto
clase define la plantilla
utilizando la palabra reservada new seguida de la invocación al constructor de clase
de un objeto pero no al
apropiado.
objeto en sí. Por otro
IBEROÁMERICA
lado, un objeto es una
Cuando se ejecuta el código, un objeto de tipo Rectangle se crea en la memoria heap.
instancia concreta de
Una referencia a esta memoria se almacena dentro de la variable rect. La variable rect se
una clase pero no la
almacena en la pila. Posteriormente, en este bloque de código, puede utilizar rect para
clase en sí.
hacer referencia y manipular el objeto que se acaba de crear.
Utilizando la referencia del objeto, puede acceder a los miembros de la clase. Por ejemplo,
el código llama al método GetArea en el objeto y el valor retornado por el método se
ETC almacena en la variable área. Los campos de datos, length y width, del objeto rect no está
accesibles aquí debido a que están marcados como private en la defnición de la clase.
Comprender las propiedades
Las propiedades le permiten accede a los datos de una clase de una forma segura y fexible.
Las propiedades son miembros de la clase que se pueden acceder como los campos de

42
Lección 2
Tome Nota
datos pero que puede contener código como un método. Las propiedades se utilizan con
frecuencia para exponer los campos de datos de una clase de una forma más controlada. Por
A las propiedades,
ejemplo, un campo privado se puede exponer utilizando una propiedad pública, pero no es
generalmente se
necesario utilizar las propiedades de esta manera.
les conoce como
campos “inteligentes”
ya que pueden
Una propiedad tiene dos accessors, get y set. El accessor get se utiliza para retornar
contener código para
el valor de la propiedad y el accessor set se utiliza para asignar un nuevo valor a la
la verificación de
propiedad. A una propiedad frecuentemente se le defne como public y siempre tiene un
consistencia o validez
nombre que comienza con una letra mayúscula. Por el contrario. Al asignar nombres a
de datos.
los campos de datos privados se utiliza siempre al principio una letra minúscula.
Æ Crear propiedades
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique el código de la clase Rectangle como se muestra a continuación. En este código
el constructor se elimina y se insertan dos propiedades:
class Rectangle
{
private double length;
private double width;
public double Length
{
www.pdftron.com
get
{
return length;
}
set
{
if ( value > 0.0)
IBEROÁMERICA
length = value;
}
}
ETC public double Width
{
get
{
return width;
}
set

Introducción a la programación orientada a objetos


43
{
if (value > 0.0 )
width = value;
}
}
public double GetArea()
{
return length * width;
}
}
2. Modifique el código de la clase Program como se muestra a continuación:
class Program
{
static void Main(string[] args)
{
Rectangle rect = new Rectangle();
rect.Length = 10.0;
rect.Width = 20.0;
double area = rect.GetArea();
Console.WriteLine(
www.pdftron.com
“Área del rectángulo: {0}”, area);
}
}
3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola mostrando el
área del rectángulo.
4. GUARDE su proyecto.
IBEROÁMERICA
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
En este ejercicio, modifcó la clase Rectangle para ingresar dos propiedades, Length y
Tome Nota
Width. Las propiedades generalmente se defnen con un modifcador de acceso público.
En el código para la propiedad Length, el accessor get simplemente retorna el valor del
El patrón de
campo de datos length. Sin embargo, el accessor set revisa el valor signado (utilizando
programación general
la palabra reservada value) a la propiedad y modifca el campo de datos length sólo si el
ETC
es que todos los
valor es positivo. Los campos privados length y width también se conocen como campos
campos de datos
de respaldo por las propiedades que los exponen.
de una clase deben
declararse como
Además, la clase Rectangle no declara ningún contructor explícito. En este caso, los
private y que el acceso
usuarios de la clase (el método Main) necesita utilizar el constructor predefnido y confar
a estos campos
privados debe ser vía
en las propiedades para inicializar los datos de la clase.
propiedades públicas
y revisar los valores
El método Main utiliza las propiedades Length y Width para establecer los datos para el
de datos para su
objeto rect. Se ignorará si se trata de establecer Length o Width como un valor negativo
validación.
y en ese caso los campos de datos seguirán conservando su valor original de 60.

44
Lección 2
Cuando se defnen propiedades se pueden excluir cualquiera de los accessors get o set. Si
no incluye el accessor set, no proporciona una forma de establecer el valor de la propiedad
y por lo tanto tendrá una propiedad de sólo lectura. Por otro lado, si no incluye el accessor
get, no se proporciona una forma de obtener el valor de la propiedad y por lo tanto tendrá
una propiedad de sólo escritura.
Comprender las propiedades auto-implementadas
Las propiedades auto-
implementadas simplifcan las declaraciones de las propiedades.
C# introdujo las propiedades auto-
implementadas con la versión 3 para simplifcar la
declaración de propiedades donde no hay lógica adicional especifcada en los accessors get
y set. Por ejemplo, sin la revisión de validación, las propiedades Length y Width se defnen
de la siguiente manera:
private double length;
private double width;
public double Length
{
get
{
return length;
}
www.pdftron.com
set
{
length = value;
}
}
public double Width
IBEROÁMERICA
{
get
{
return width;
}
ETC set
{
width = value;
}
}
Con las propiedades auto-
implementadas de C#, la sintaxis simplifcada para la declaración
de la propiedad inicia de la siguiente forma:

Introducción a la programación orientada a objetos


45
public double Length { get; set; }
public double Width { get; set; }
En este caso, los campos de respaldo para las propiedades se defnen tras bambalinas y no
son accesibles de forma directa por el código.
Las propiedades auto-
implementadas utilizadas con los constructores predefnidos también
simplifcan la creación e inicialización de los objetos. Por ejemplo, ahora se puede crear e
inicializar un objeto de la siguiente manera:
static void Main(string[] args)
{
Rectangle rect = new Rectangle
{ Length = 10.0, Width = 20.0 };
Console.WriteLine(
“Area of Rectangle: {0}”, rect.GetArea());
}
Uso de la palabra reservada this
La palabra reservada this se puede utilizar para acceder a miembros desde dentro de los constr
instancia y accessors de propiedades de instancia.
La palabra reservada this es una referencia a la instancia actual de la clase. Se puede
utilizar la palabra this para referirse a cualquier miembro del objeto actual. Por ejemplo,
www.pdftron.com
anteriormente en este capítulo, la clase Rectangle se escribió como se indica a continuación:
class Rectangle
{
private double length;
private double width;
IBEROÁMERICA
public Rectangle(double l, double w)
{
length = l;
width = w;
}
ETC public double GetArea()
{
return length * width;
}
}
Pero se pudo haber escrito de la siguiente manera:
class Rectangle

46
Lección 2
{
private double length;
private double width;
public Rectangle(double l, double w)
{
this.length = l;
this.width = w;
}
public double GetArea()
{
return this.length * this.width;
}
}
Tome Nota
En C#, los caracteres //
Como puede ver, la palabra this se utilizó dentro del constructor y del método GetArea
se utilizan para agregar
para referirlo a los campos de datos del objeto actual de la clase Rectangle. Aun cuando no
comentarios en una
era necesario utilizar la palabra this en este caso, utilizarla proporciona mayor fexibilidad
sola línea en el código.
al nombrar los parámetros del método. Por ejemplo, podría defnir el constructor como se
El texto después de los
muestra a continuación:
caracteres // se ignora
por el compilador. Los
public Rectangle(double length, double width)
comentarios en varias
{
líneas comienzan con
// los nombres de parámetro length y width
www.pdftron.com
los caracteres/* y
// opacan los miembros de clase length y
terminan con */.
// width en este ámbito
this.length = length;
this.width = width;
}
Dentro del ámbito de la defnición del constructor Rectangle, los nombres length y width
ahora se referirán al parámetro que se esté pasando. El nombre de los campos de datos se
IBEROÁMERICA
ha opacado y sólo se pueden acceder utilizando la palabra this.
Comprender los delegados
Los delegados son tipos especiales que se utilizan para encapsular un método dentro de una fr
ETC Los delegados son objetos especiales que pueden contener une referencia a un método co
una frma específca. Un delegado se defne utilizando la palabra reservada delegate. Se
puede defnir un delegado como se indica a continuación:
public delegate void RectangleHandler(Rectangle rect);
Le defnición delegate especifca la frma del método cuya referencia se pueda contener
por un objeto delegate. Por ejemplo, en el código anterior se defne un delegado
RectangleHandler que puede contener referencias a un método que regresa un void y
acepta un solo parámetro del tipo Rectangle.

Introducción a la programación orientada a objetos


47
Por lo tanto, si tiene un método con una frma similar, resulta un candidato ideal para la
asignación a una instancia delegate. Por ejemplo:
public void DisplayArea(Rectangle rect)
{
Console.WriteLine(rect.GetArea());
}
El tipo delegate se puede utilizar para declarar una variable que se puede referir a cualquier
método con la misma frma que el delegado. Por ejemplo, puede decir:
RectangleHandler handler;
Y puede asignar el método al delegado utilizando la siguiente sintaxis:
handler += new Rectanglehandler(DisplayArea);
Como alternativa, puede utilizar la siguiente sintaxis:
handler += DisplayArea;m
Note que la sintaxis utiliza la operación de adición. Esto signifca que puede asociar más de
un método (de frma compatible), creando una lista de invocación de uno o más métodos.
Finalmente, se puede llamar a un delegado se puede realizar a través de una sintaxis de
invocación de métodos como la siguiente:
Rectangle rect = new Rectangle (10, 20);
handler(rect);
www.pdftron.com
Cuando se llama un delegado de esta forma, se invocan todos los métodos en esta lista de
invocación. En este ejemplo, el objeto handler se refere sólo a un método DisplayArea por
lo que el método DisplayArea se invocará con el objeto rect como un parámetro.
Entre otras muchas aplicaciones, los delegados forman la base para las declaraciones de
eventos, como se comentará en la siguiente sección.
Comprender los eventos
IBEROÁMERICA
Los eventos son una forma por la cual una clase notifca a otras clases u objetos que sucedió al
que envía la notifcación se conoce como editor. La clase que recibe la notifcación se conoce co
evento.
Los eventos son fáciles de comprender en el contexto de una interfaz gráfca de usuario
ETC (GUI). Por ejemplo, cuando un usuario da clic en un botón, ocurre un evento Click.
Los elementos en una interfaz de usuarios múltiples se pueden suscribir a este evento y
cambiar su estado visual (por ejemplo, algunos controles se habilitan o deshabilitan). En
este tipo de comunicación de eventos, los editores de eventos no necesitan saber cuáles
objetos se suscriben a los eventos que se están llevando a cabo.
Los eventos no se limitan a la programación en GUI. De hecho, los eventos tienen un
papel importante en las librerías de clase del .NET Framework para que los objetos hagan
notar cualquier cambio en sus estados. Trabajará con eventos en prácticamente todos los
programas.

48
Lección 2
Al defnir los eventos, generalmente necesita dos tipos de información:
• Un delegado que conecta al evento con su controlador(es) de evento(s).
• Una clase que contiene los datos del evento. Esta clase generalmente se deriva de
la clase EventArgs.
Para defnir un evento, puede utilizar un delegado personalizado. Sin embargo, en la
mayoría de los casos si el evento no contiene información específca del mismo, no será
sufciente con utilizar el delegado predefnido EventHandler. El delegado EventHanler se
defne de la siguiente manera:
public delegate void EventHandler(Object sender, EventArgs
e);
Aquí, el parámetro sender es una referencia al objeto que provoca el evento y el parámetro
es una referencia a un objeto de datos del evento que no contiene datos del mismo.
La clase EventArgs se utiliza por los eventos que no pasan ninguna información relacionada
con los mismos a un controlador de eventos cuando se ocasiona un evento. Si el controlador
de eventos requiere de información relacionada a los mismos, la aplicación debe derivar
una clase desde la clase EventArgs para recibir los datos relacionados con los eventos.
Æ Publicar y suscribirse a eventos
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique el código de la clase Rectangle de la siguiente forma:
class Rectangle
www.pdftron.com
{
public event EventHandler Changed;
private double length;
public double Length
Tome Nota
{
El campo EventArgs.
get
Empty representa un
IBEROÁMERICA
evento sin datos. El
{
campo equivale a tener
return length;
una instancia de sólo
lectura de la clase
}
EventArgs.
set
{
ETC length = value;
Changed(this, EventArgs.Empty);
}
}
}
2. Modifique el código de la clase Program con lo siguiente:
class Program

Introducción a la programación orientada a objetos


49
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Changed += new EventHandler(r_Changed);
r.Length = 10;
}
static void r_Changed(object sender, EventArgs e)
{
Rectangle r = (Rectangle)sender;
Console.WriteLine(
“Value Changed: Length = {0}”,
Tome Nota
r.Length);
El código en el
método r_Changed
}
utiliza un operador
}
cast para convertir
un tipo de datos de
3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar
objeto en el tipo de
que el valor de la propiedad Length cambió.
datos Rectangle. El
4. GUARDE su proyecto.
casting se explicará
más adelante en esta
PAUSA. Deje su proyecto abierto para utilizarlo en el siguiente ejercicio.
lección en la sección
“Casting entre tipos”.
www.pdftron.com
Aquí la clase Rectangle defne un evento Changed que se invoca cuando la propiedad
Length del objeto Rectangle cambia. El delegado del evento Changed es del tipo
EventHandler. En la clase Rectangle, el evento Changed se invoca cuando se llama el
accessor set de la propiedad Length.
Se puede suscribir al evento Changed dentro del método Main al adjuntar el método
r_Changed como un controlador de evento para el evento utilizando el siguiente código:
IBEROÁMERICA
r.Changed += new EventHandler(r_Changed);
La frma del método r_Changed coincide con los requerimientos del delegado EventHandler.
El método r_Changed se invoca tan pronto se establece el valor de la propiedad Length
en el método Main.
ETC El código anterior utiliza el operador += en lugar del operador de asignación simple (=)
para adjuntar el controlador de eventos. Al utilizar el operador +=, se asegura que este
controlador de eventos se agregue a la lista de controladores que ya se encuentra adjunta al
evento. Esta técnica le permite tener varios controladores de eventos que puedan responder
a un evento. Si utiliza el operador de asignación (=) para asignar el nuevo controlador de
evento, se anulará cualquier controlador de eventos existente que se encuentre adjunto al
evento y el nuevo evento será el detonado cuando se invoque el evento.

50
Lección 2
Comprender los espacios de nombres
Un espacio de nombres le permite organizar el código y crear nombres de clase únicos.
Un espacio de nombres es un elemento del lenguaje que le permite organizar código
y crear nombres de clase globalmente únicas. Digamos que crea una clase del nombre
Widget. Existe la posibilidad de que otro grupo adjunte código que también contenga
una clase del mismo nombre. En ese caso, ¿cómo maneja la ambigüedad de nombres? La
solución es organizar el código en un espacio de nombres. Una metodología común es
utilizar el nombre de la compañía en el espacio de nombres. Por ejemplo, puede decir:
namespace CompanyA
{
public class Widget { … }
}
and
namespace CompanyB
{
public class Widget { … }
}
La clase del espacio de nombres CompanyA puede ser referida de forma única por su
nombre de clase completamente califcada CompanyA.Widget, mientras que el otro
Widget se puede identifcar como CompanyB.Widget.
El .NET Framework utiliza espacios de nombres para organizar todas sus clases. Por
www.pdftron.com
ejemplo, el espacio de nombres System agrupa todas las clases básicas. El espacio de
nombres System.Data organiza las clases para el acceso a datos. El espacio de nombres
System.Web se utiliza para clases relacionadas con la Web.
Con el uso de espacios de nombres puede terminar con nombres de clase completamente
califcados muy largos que ocasionaría un exceso de texto y necesidad de teclear. C#
soluciona este inconveniente a través de la directiva using. Puede utilizar la directiva using
en la parte superior del archivo de la clase como se muestra a continuación.
using System.Text;
IBEROÁMERICA
Una vez que haya incluido la directiva using para un espacio de nombres, no necesitará
califcar de forma completa las clases de ese espacio de nombres en el archivo.
using System.Text;
Comprender los miembros estáticos
ETC
Los miembros
estáticos pertenecen a la clase en sí en lugar de a objetos individuales.
Los miembros de la clase como los campos de datos, métodos y propiedades que se han
comentado hasta ahora en esta sección, todos operan sobre objetos individuales. Tales
miembros se llaman como miembros de instancia porque se pueden utilizar sólo después
de que una instancia de la clase es creada. En contraste, la palabra reservada static se
utiliza para declarar miembros que no pertenecen a objetos individuales sino a la clase en
sí. Tales miembros de clase se llaman como miembros estáticos. Un ejemplo común de un
miembro estático es el método Main que sirve como punto de entrada en su programa.

Introducción a la programación orientada a objetos


51
Æ Crear miembros estáticos
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique el código de la clase Rectangle como se muestra a continuación:
class Rectangle
{
public static string ShapeName
{
get { return “Rectángulo”; }
}
public double Length { get; set; }
public double Width { get; set; }
public double GetArea()
{
return this.Length * this.Width;
}
}
2. Modifique el código de la clase Program a lo siguiente:
class Program
{
static void Main(string[] args)
{
www.pdftron.com
Rectangle rect = new Rectangle
{ Length = 10.0, Width = 20.0 };
Console.WriteLine(“Nombre de la forma: {0}, Area:
{1}”,
Rectangle.ShapeName,
rect.GetArea());
IBEROÁMERICA
}
}
3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar el
nombre y área de la forma.
4. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
ETC Cuando se crea una instancia de una clase, se crea una copia separada para cada campo d
instancia pero solo una copia del campo estático se comparte por todas las instancias.
; ¿Listo para la
Un miembro estático no se puede referenciar a través de un objeto de instancia. En su
certificación?
lugar, un miembro estático se referencia a través del nombre de la clase (como Rectangle.
¿Comprende los
ShapeName en el ejercicio anterior). No se puede utilizar la palabra reservada this con un
conceptos básicos de
método estático o una propiedad debido a que sólo se puede utilizar para acceder a objetos
las clases? -2.1
de instancia.

52
Lección 2
� Comprender los valores y las referencias
È EN RESUMEN
Los tipos de valores almacenan directamente los valores mientras que los tipos de referencia s
referencia al valor real.
Un tipo de valor almacena directamente los datos en su memoria. Los tipos de referencia,
por otro lado, sólo almacenan una referencia a la ubicación en memoria. Los datos se
encuentran almacenados en la ubicación en memoria a la cual se hace referencia. La mayoría
de los tipos de datos básicos como bool, int, char, double, etc., son tipos de valores. Los
tipos de datos defnidos por el usuario, creados utilizando la palabra reservada struct
también son tipos de valores. Los tipos de referencia incluyen los tipos creados utilizando
las palabras reservadas object, string, interface, delegate, y class.
Comprender las estructuras
La palabra reservara struct se utiliza para crear tipos defnidos por el usuario que consisten en g
campos relacionados. Las estructuras son tipos de valores opuestos a las clases que son tipos d
Las estructuras se defnen utilizando la palabra reservada struct como se muestra a
continuación:
public struct Point
{
www.pdftron.com
Tome Nota
Las estructuras se
public double X, Y;
utilizan generalmente
para crear tipos
}
simples. Si se
encuentra creando
Las estructuras pueden contener la mayoría de los elementos que puede contener una
una estructura muy
clase, como constructores, métodos, propiedades, etc. Sin embargo, como aprenderá en
compleja, considere
la siguiente sección, las estructuras son tipos de valores mientras que las clases son tipos
mejor utilizar una
de referencias. A diferencia de una clase, una estructura no puede heredar de otra clase o
IBEROÁMERICA
clase.
estructura.
Comprender la asignación de memoria
Después de introducir un valor o texto en una celda, puede modifcarla de varias formas. Puede
por completo, introducir un valor diferente para reemplazar el que estaba o alterar lo que ingre
ETC Una buena forma de comprender cómo los valores se diferencian de los tipos de referenc
es visualizar cómo se representa cada uno de ellos en memoria. La Figura 2-
1 muestra
cómo se crean los tipos de valor en memoria. Cuando crea una variable de tipo int, se
crea una ubicación en memoria que puede utilizar para almacenar un valor del tipo int.
Inicialmente, cuando no asigna un valor de forma explícita, el valor predeterminado del
tipo de datos (para un int el valor predeterminado es 0) se almacena en la ubicación en
memoria. Cuando se realiza una asignación, la dirección de memoria identifcada por el
nombre de la variable se actualiza con el nuevo valor (10 en el caso de la asignación en la
Figura 2-1).

Introducción a la programación orientada a objetos


53
Figura 2-1
Production note: This figure should be redrawn on a smaller scale. Please also
make
Visualización de un tipo
the arrows as straight lines when you redraw it.
de valor en memoria



número
int number;
0
number = 10;
número
10
La Figura 2-
2 muestra un tipo de referencia, el tipo de datos string. Cuando crea una
variable de tipo string, se crea una ubicación en memoria que se identifcará por este
nombre. Sin embargo, esta ubicación en memoria no va a albergar el contenido del string.
Esta variable almacenará la dirección en memoria (una referencia) de la ubicación donde
de hecho se almacenará el string.
Figura 2-2

Vista de Código
Vista de Memoria
Visualización de un tipo
de referencia en memoria
nombre
string name;
nul
dirección
datos
name = "Northwind";
nombre
m100
"Northwind"

m100
www.pdftron.com
Inicialmente, cuando no se asigna un valor, la variable tendrá el valor de null (una referencia
null, en otras palabras, esta variable no hace referencia a una dirección en memoria válida).
En la siguiente sentencia, cuando dice:
name = “Northwind”;
IBEROÁMERICA
la cadena “Northwind” se crea en una ubicación de memoria en particular (para simplifcar,
digamos que la dirección en memoria es m100) y esa dirección de memoria se almacena en
el nombre de la variable. Cuando es hora de recuperar el valor del nombre de la variable,
el tiempo de ejecución sabrá que su contenido no se encuentra almacenado en la variable
en si sino en la ubicación en memoria a la cual apunta la variable.
Æ Copiar valores y tipos de referencia
ETC UTILICE el proyecto que guardó en el ejercicio anterior.
1. Agregue el siguiente código después de la definición de la clase Rectangle
para crear una
estructura Point:
struct Point
{
public double X, Y;
}

54
Lección 2
2. Modifique el código del método Main como se muestra a continuación:
static void Main(string[] args)
{
Tome Nota
Point p1 = new Point();
Es posible crear un
struct sin utilizar el
p1.X = 10;
operador new. Puede
p1.Y = 20;
simplemente decir
Point p1;
para crear una variable
Point p2 = p1;
del tipo struct.
p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X);
Rectangle rect1 = new Rectangle
{ Length = 10.0, Width = 20.0 };

Rectangle rect2 = rect1;
rect2.Length = 100.0;
Console.WriteLine(“rect1.Length = {0}”,
rect1.Length);
}
www.pdftron.com
3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para
Tome Nota
mostrar los valores para p1.X y rect1.Length.
Cuando copia una
4. GUARDE su proyecto.
variable de tipo de
referencia a otra
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente eje
variable del mismo
tipo, sólo se copian
las referencias. Como
La primera parte del programa crea una copia del tipo de valor Point y la segunda mitad
IBEROÁMERICA
resultado, después
del programa crea una copia del tipo de referencia Rectangle. Analicemos como se realiza
de la copia, las dos
la copia del tipo de valor.
variables apuntan al
mismo proyecto.
Cuando se ejecuta la siguiente sentencia, se crea una nueva variable p2 en memoria y su
contenido se copia desde la variable p1:
Point p2 = p1;
ETC Después de ejecutar esta sentencia, se crea la variable p2 y el contenido de la variable p1
copia a la variable p2. Tanto p1 como p2 tienen su propio conjunto de valores disponibles
en sus ubicaciones en memoria respectivas. Por lo que, cuando se ejecuta la siguiente
sentencia:
p2.X = 100;
sólo se afecta el valor de X correspondiente a la ubicación en memoria de la variable p2. El
valor de X para la variable p1 permanece sin cambios.

Introducción a la programación orientada a objetos


55
Ahora, analicemos cómo funciona la copia entre los tipos de referencia. Cuando se ejecuta
la siguiente sentencia, se crea una nueva variable rect2, igual que antes, el contenido de
rect1 se copia a la ubicación en memoria de rect2:
Rectangle rect2 = rect1;
Pero puesto que la clase Rectangle es un tipo de referencia, el contenido de la variable
rect1 es de hecho una referencia a la ubicación en memoria que contiene un objeto de
Rectangle. Así que, después de la inicialización anterior, tanto rect1 y rect2 apuntan a
la misma ubicación en memoria y al mismo objeto de Rectangle. Sólo hay un objeto de
rectangle en memoria y tanto rect1 como rect2 se referen a él. La siguiente sentencia
modifca Length del objeto de rectangle:
rect2.Length = 100.0;
Esta sentencia hace referencia a la ubicación en memoria apuntada por rect2 (la cual
resulta ser la misma ubicación en memoria apuntada por rect1) y modifca Length del
; ¿Listo para la
objeto Rectangle. Ahora, si intenta hacer referencia a la misma ubicación en memoria vía
certificación?
el objeto rect1, obtendrá el objeto modifcado y aparecerá el siguiente código mostrando
¿Comprende los tipos
el valor “rect1.Length = 100”.
de datos y l asignación
de memoria? -1.1
Console.WriteLine(“rect1.Length = {0}”,
rect1.Length);
Comprender la memoria heap y la pila call
www.pdftron.com
Los objetos son siempre memoria asignada en el heap. El heap es la memoria disponible
para el programa en tiempo de ejecución para la asignación dinámica de memoria. En
contraste, algunos elementos de datos se pueden crear en la pila de ejecución o en la pila
call. Los elementos creados en la pila son los parámetros de método y las variables locales
declaradas dentro de un método. La memoria de pila se reclama cuando por ejemplo se
retorna un método. La memoria asignada en el heap se reclama automáticamente por el
recolector de basura cuando los objetos ya no se utilizan (ya no hay objetos que hacen
referencia a ellos).
IBEROÁMERICA
� Comprender el encapsulamiento
È EN RESUMEN
El encapsulamiento es un mecanismo para ocultar información que hace que el código
ETC
entender.
El encapsulamiento es un mecanismo para restringir el acceso a una clase o miembros clase
para ocultar decisiones en el diseño que pueden cambiar. El encapsulamiento les da a los
diseñadores de las clases la fexibilidad para cambiar el código cuando sea necesario sin
cambiar todo el código que hace uso de ese código. Además, cuando oculta información,
también oculta la complejidad asociada a la misma. Como resultado, con la ayuda del
encapsulamiento, puede escribir código que sea más fácil de comprender y mantener.

56
Lección 2
Tome Nota
En los ejercicios anteriores, vio el encapsulamiento cuando:
Cuando el código en C#
• Declaró los miembros de datos como private y reforzó la inicialización de campos
se compila, el código
de datos vía un constructor. Como los miembros de datos se encuentran ocultos
ejecutable de salida
de los usuarios de la clase, el desarrollador de la clase Rectangle puede cambiar los
contenido dentro de
nombres de los campos de datos sin la necesidad de cambiar el código invocador.
un archivo .dll o .exe
• Las propiedades ofrecen una excelente manera de encapsular los campos de datos
también se llama
junto con cualquier otro tipo de lógica.
como una asamblea.
Una asamblea es una
• Los modifcadores de acceso como private y public le permiten controlar el nivel
unidad de código
de acceso que quiera tener para un miembro de la clase o para la clase en sí.
ejecutable que puede
• En esta sección aprenderá más sobre los modifcadores de acceso.
instalar de forma
independiente.
Comprender los modificadores de acceso
Los modifcadores de acceso controlan dónde se puede utilizar un tipo o miembro de tipo.
Tabla 7-2
Todos los tipos y miembros de tipo tienen un nivel de acceso que especifca donde esa clase
o sus miembros se pueden utilizar en su código. El nivel de acceso se puede establecer
Las partes que
conforman al elemento
utilizando uno de los modifcadores de acceso especifcados en la Tabla 2-1.
<authorization>
Modificador de acceso
Descripción
www.pdftron.com
public
El acceso no se restringe.
private
El acceso se restringe a la clase contenedora.
protected
El acceso se restringe a la clase contenedora y a cualquier clase que se derive directa o
indirectamente de la clase contenedora. Aprenderá más sobre las clases derivadas en la
sección “Comprender la herencia” más adelante en esta lección.
internal
El acceso se restringe al código en la misma asamblea.
protected internal
Este modificador de acceso es una combinación de protected OR internal. Es decir, el
acceso está restringido a cualquier código en la misma asamblea y sólo a las clases
IBEROÁMERICA
derivadas en otra asamblea.
Los modifcadores de acceso no están permitidos en las declaraciones de espacio de nombres
Tome Nota
pero se implica un acceso público para los espacios de nombre. Las clases de alto nivel
Debería utilizar el
(declaradas directamente bajo un espacio de nombres) sólo pueden ser public o internal.
nivel de acceso más
El modifcador de acceso internal es el predeterminado para una clase si no se especifca
ETC
restrictivo que tenga
ningún modifcador de acceso. La clase Rectangle defnió en el ejercicio anterior elementos
sentido para un
predeterminados para tener un acceso interno. La accesibilidad de una clase anidada puede
miembro de tipo.
no ser menos restrictiva que la accesibilidad de una clase contenedora.
; ¿Listo para la
certificación?
¿Comprende el
encapsulamiento? -2.4

Introducción a la programación orientada a objetos


57
� Comprender la herencia
È EN RESUMEN
Después de haber introducido un valor o texto en una celda, lo puede modifcar de varias mane
contenido por completo, ingresar un valor diferente para reemplazar el que estaba o alterar lo q
La herencia le permite crear clases nuevas que reutilizan, extienden y modifcan la
funcionalidad defnida en las clases existentes. La clase que hereda la funcionalidad se
conoce como clase derivada y la clase cuya funcionalidad es heredada se conoce como
clase base. La clase derivada hereda toda la funcionalidad de la clase base y puede contener
características adicionales que la hace diferente de la clase base.
Digamos que queremos crear un conjunto de clases que describa polígonos como
Tome Nota
rectángulos o triángulos. Estas clases tendrán algunas propiedades en común como anchura
A diferencia de las
y longitud. Para este caso, se puede crear una clase base Polygon con las propiedades
clases, las estructuras
Width y Length, y las clases derivadas Rectangle y Triangle heredarán estas propiedades
no soportan la
a la vez que cuentan con su propia funcionalidad. El siguiente ejercicio explica lo anterior
herencia.
de forma más detallada.
Æ Crear clases derivadas
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Agregue una nueva clase Polygon como se muestra a continuación:
class Polygon
www.pdftron.com
{
public double Length { get; protected set; }
public double Width { get; protected set; }
}
2. Modifique la clase Rectangle como se muestra a continuación:
class Rectangle : Polygon
IBEROÁMERICA
{
public Rectangle(double length, double width)
{
Length = length;
Width = width;
ETC } public double GetArea()
{
return Width * Length;
}
}

58
Lección 2
3. Modifique el código del método Main como se muestra a continuación:
static void Main(string[] args)
{
Rectangle rect = new Rectangle(10, 20);
Console.WriteLine(
“Width={0}, Length={1}, Area = {2}”,
rect.Width, rect.Length, rect.GetArea());
}
4. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para
mostrar la anchura, longitud y área del rectángulo.
5. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Para defnir una clase derivada, coloque dos puntos después del nombre de la clase derivada
seguido del nombre de la clase base. Aquí la clase Polygon es la clase base para la clase
Rectangle.
Las propiedades Length y Width en la clase Polygon se declaran como un modifcador
de acceso protegido para el accessor set. Esto signifca que el acceso al accesor set es
disponible sólo desde dentro de la clase Polygon y sus clases derivadas. Aun puede obtener
el valor de las propiedades Length y Width en el método Main pero obtendrá un error si
intenta asignar un valor a estas propiedades.
www.pdftron.com
La clase Rectangle hereda todos los datos no privados y el comportamiento de la clase
Polygon. Además, la clase Rectangle defne funcionalidad adicional (método GetArea) que
no está disponible en la clase base.
Comprender las clases abstractas y selladas
Las clases abstractas proporcionan una defnición común de la clase base que se pueden compa
derivadas. Las clases selladas, por otro lado, cuentan con una funcionalidad completa pero no
clases bases.
IBEROÁMERICA
En el ejercicio anterior defnió un método GetArea en la clase Rectangle. Suponga que
quiere crear otra clase, Triangle, que es del tipo Polygon. Ahora, necesitará un método
GetArea en la clase Triangle para calcular el área de un triángulo.
Con frecuencia, las clases base actúan como el repositorio de la funcionalidad común.
ETC En el caso de Polygon, el polígono en sí no sabrá cómo calcular el área sin contar con el
conocimiento sobre el tipo de forma. Pero en general, podemos esperar que todas las clases
del tipo Polygon sean capaces de calcular sus propias áreas. Tales expectativas pueden
depender de la clase base con la ayuda de una palabra reservada abstract.
Æ Crear clases abstractas
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique la clase Polygon como se muestra a continuación:

Introducción a la programación orientada a objetos


59
abstract class Polygon
{
public double Length { get; protected set; }
public double Width { get; protected set; }
abstract public double GetArea();
}
2. Modifique la clase Rectangle como se muestra a continuación:
class Rectangle : Polygon
{
public Rectangle(double length, double width)
{
Length = length;
Width = width;
}
public override double GetArea()
{
return Width * Length;
www.pdftron.com
}
}
3. No se necesita realizar modificaciones al método Main. Seleccione Depurar, Iniciar
depurar. Aparecerá una ventana de consola para mostrar el ancho, longitud y área del
rectángulo.
4. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
IBEROÁMERICA
Esta versión de la clase Polygon defne un método de nombre GetArea. La razón principal
para incluir este método en la clase base es que ahora la clase base puede proporcionar una
plantilla común de funcionalidad para las clases derivadas. Pero, como ya se comentó, la
clase base Polygon no conoce lo sufciente para calcular el área de la forma. La situación
se puede manejar haciendo el método abstracto. Un método abstracto cuenta con una
ETC defnición pero no proporciona ninguna implementación (cuerpo de método). Si ninguno
de los miembros de la clase es abstracto, la clase en sí necesita marcarse como abstracta.
No se puede instanciar una clase abstracta.
Las clases derivadas pueden proporcionar una implementación de la clase abstracta para
crear una clase concreta (clase no abstracta). La clase derivada puede proporcionar una
implementación de un método abstracto al sobrescribirlo en una clase derivada. Por
Tome Nota
ejemplo, la clase Rectangle sobrescribe el método abstracto GetArea de la clase base y
No puede crear
proporciona una implementación completa. Como resultado, la clase Rectangle ya no es
instancias de una clase
una clase abstracta y se puede instanciar de forma directa.
abstracta.

60
Lección 2
Las clases selladas, por otro lado, se defnen cuando su implementación está completa y
no quiere que se herede una clase. Una clase sellada se puede crear utilizando la palabra
reservada sealed como se muestra a continuación:
sealed class Rectangle : Polygon
{
// miembros de la clase aquí
}
Puesto que Rectangle es una clase sellada, no se puede utilizar como una clase base.
También es posible marcar miembros de la clase seleccionados como sellados para evitar
que se sobrescriban en una clase derivada. Por ejemplo, puede decir:
sealed public override double GetArea()
Tome Nota
{
C# no soporta la
return Width * Length;
herencia de más de
una clase base, a lo
}
cual se le conoce
como herencia
Esta declaración asegura que el método GetArea no se pueda sobrescribir en una clase
múltiple.
derivada.
Herencia desde la clase Object
La clase Object es la clase base más importante de todas las clases en el .NET Framework.
www.pdftron.com
Todas las clases en el .NET Framework heredan de forma directa o indirecta de la clase
Object. Por ejemplo, cuando declaró la siguiente clase anteriormente:
class Polygon
{
public double Length { get; protected set; }
public double Width { get; protected set; }
IBEROÁMERICA
}
era funcionalmente equivalente a la siguiente declaración:
class Polygon : Object
{
public double Length { get; protected set; }
ETC public double Width { get; protected set; }
}
Pero no tiene que declarar la clase Polygon de la segunda manera porque la herencia de la
clase Object se asume de forma implícita. Como parte de esta herencia, una clase derivada
sobrescribe los métodos de la clase Object. Dos de los métodos más comunes son:
• Equals: Soporta la comparación entre dos objetos. Retorna true si los dos objetos
tienen el mismo valor.
Introducción a la programación orientada a objetos
61
• ToString: Retorna una representación string de la clase. De manera predeterminada,
retorna el nombre complete de la clase. Es con frecuencia útil para sobrescribir este
método para que regrese una representación string del estado actual del objeto.
El siguiente ejemplo muestra como sobrescribir el método ToString en la clase Rectangle:
class Rectangle : Polygon
{
public Rectangle(double length, double width)
{
Length = length;
Width = width;
}
public override double GetArea()
{
return Width * Length;
}
public override string ToString()
{
return String.Format(



“Width = {0}, Length = {1}”,



Width, Length);
www.pdftron.com
}
}
Casting entre tipos
El tiempo de ejecución le permite castear un objeto a cualquiera de sus tipos base.
IBEROÁMERICA
Las clases derivadas tienen una relación “es un” con la clase base. Por ejemplo, podemos
decir que el Rectángulo es un Polígono. Un objeto de la clase Rectangle tiene en este caso
dos tipos de datos: el objeto es un Rectángulo y el objeto es también un Polígono.
El tiempo de ejecución le permite castear un objeto a su clase o a cualquiera de sus clases
base. Por ejemplo, puede decir:
Polygon p = new Rectangle(10, 20);
ETC Aquí, se crea un nuevo objeto Rectangle y se castea a su tipo base Polygon. C# no requie
de una sintaxis especial porque castear a un tipo base se considera una conversión segura.
También se puede castear de la siguiente manera:
Object o = new Rectangle(10, 20);

Rectangle r = (Rectangle) o;

62
Lección 2
Aquí, un objeto Rectangle se asigna primero a un Object (la clase base fundamental)
y el objeto resultante se castea de vuelta como un Rectangle. Cuando sucede la última
asignación, se requiere de un casteo explicito porque convertirá un objeto más general
a un objeto menos general. El tiempo de ejecución revisa si el valor de la variable o es
compatible con la clase Rectangle. Si en tiempo de ejecución el valor de o no es compatible
con la clase Rectangle, el tiempo de ejecución arroja una System.InvalidCastException.
El operador is
Para evitar errores en tiempo de ejecución como InvalidCastException, se utiliza el
Tome Nota
operador is para revisar si se permite el casteo antes de llevarlo a cabo:
Si se encuentra
if (o is Rectangle)
utilizando un operador
as para convertir un
{
tipo, la revisión del
operador is no es
Rectangle r = (Rectangle) o;
necesaria. Puede
simplemente revisar el
}
valor de retorno de as
contra null.
Aquí el tiempo de ejecución revisará el valor del objeto o. La sentencia cast sólo se ejecuta
si o contiene un objeto Rectangle.
El operador as
Otro operador cast útil es el operador as. El operador as es similar a la operación cast pero,
en el caso de as, si el tipo de conversión no es posible, se retorna null en lugar de arrojar
una excepción. Por ejemplo, considere este código:
www.pdftron.com
Rectangle r = o as Rectangle;
if (r != null)
{
// hacer algo
; ¿Listo para la
}
certificación?
IBEROÁMERICA
¿Comprende la
Si en tiempo de ejecución, no es posible castear el valor de la variable o a rectangle, se
herencia? -2.2
asigna un valor null a la variable r. No se arrojarán excepciones.
� Comprender el polimorfismo
ETC
È EN RESUMEN
El polimorfismo es la capacidad de las clases derivadas para compartir una funcionalidad en c
pero defniendo su propio comportamiento.
Digamos que se encuentra desarrollando una aplicación que permite a los usuarios trabajar
con diferentes tipos de polígonos. Cuenta con una colección que contiene diferentes tipos
de polígonos como un rectángulo, un triángulo y un cuadrado. Cada polígono le provee
con su propia implementación del método Draw. Cuando trabaja con esta colección, no

Introducción a la programación orientada a objetos


63
necesariamente debe saber exactamente con cual forma está trabajando sino que preferirá
que se invoque el método Draw correcto en cada ocasión. El polimorfsmo le permite
realizar esto.
El polimorfsmo permite a los objetos de la clase derivada que se les trate en tiempo
de ejecución como el objeto de la clase base. Cuando se invoca un método en tiempo
de ejecución, su tipo exacto se identifca y se invoca el método apropiado desde la clase
derivada.
Æ Uso del polimorfismo
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique la clase Polygon como se muestra a continuación:
class Polygon
{
public virtual void Draw()
{
Console.WriteLine(“Dibujando: Polígono”);
}
}
2. Modifique la clase Rectangle como se muestra a continuación:
www.pdftron.com
class Rectangle : Polygon
{
public override void Draw()
{
Console.WriteLine(“Dibujando: Rectángulo”);
}
}
IBEROÁMERICA
3. Agregue una nueva clase, Triangle, como se muestra a continuación:
class Triangle : Polygon
{
public override void Draw()
ETC { Console.WriteLine(“Dibujando: Triángulo”);
}
}
4. Modifique el método Main como se muestra a continuación:
static void Main(string[] args)
{

64
Lección 2
List<Polygon> polygons = new List<Polygon>();
polygons.Add(new Polygon());
polygons.Add(new Rectangle());
polygons.Add(new Triangle());
foreach (Polygon p in polygons)
{
p.Draw();
}
}
5. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para
mostrar el mensaje sobre el dibujo de cada polígono.
6. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
En este ejercicio, las defniciones de las clases Polygon y Rectangle se simplifcan para
enfatizar el concepto de polimorfsmo. La clase base proporciona un solo método Draw.
Lo importante aquí es notar la palabra reservada virtual. Esta palabra permite a las clases
Tome Nota
derivadas sobrescribir el método.
Si el método en una
clase derivada no se
Tanto la clase Rectangle como Triangle sobrescriben el método Draw de la clase base
encuentra precedida
con sus propias defniciones utilizando la palabra reservada override. Cuando se ejecuta el
por las palabras
método Main se genera el siguiente resultado:
www.pdftron.com
new u override, el
Dibujando: Polígono
compilador afrontará
una advertencia y el
Dibujando: Rectángulo
método se comportará
Dibujando: Triángulo
como si la palabra new
estuviera presente.
El tipo de datos List<Polygon> es capaz de almacenar una colección de objetos que son
del tipo Polygon o tipos que derivan de Polygon. EL ciclo foreach se encuentra iterando en
una colección de objetos Polygon. El tipo subyacente del primer objeto es Polygon, pero
el segundo y tercer objeto en la colección son de hecho objetos Rectangle y Triangle que
IBEROÁMERICA
se acaban de castear como Polygons. El tiempo de ejecución verá en el tipo subyacente e
invocará el método de sobrescritura desde la clase derivada. Esa es la razón por la cual la
versión de la clase derivada del método Draw se llama tanto para los objetos Rectangle
como Triangle.
Comprender las palabras reservadas override y new
ETC
La palabra reservada override reemplaza un miembro de la clase base en una clase derivada. L
crea un nuevo miembro del mismo nombre en la clase derivada y oculta la implementación de
Cuando una clase base defne un miembro virtual, la clase derivada tiene dos opciones para
manejar esta situación: la clase derivada puede utilizar ya sea la palabra override o new.
La palabra override toma la prioridad sobre la defnición de la clase base del miembro.
El objeto de la clase derivada llamará el miembro sobrescrito en lugar del miembro de la
clase base.

Introducción a la programación orientada a objetos


65
Si se utiliza la palabra reservada new, se crea una nueva defnición del miembro y se oculta
el miembro de la clase base. Sin embargo, si la clase derivada se castea a una instancia de
la clase base, se pueden seguir llamando a los miembros ocultos de la clase.
Modifquemos el método Triangle del ejercicio anterior a lo siguiente:
class Triangle : Polygon
{
public new void Draw()
{
Console.WriteLine(“Dibujando: Triángulo”);
}
Tome Nota
}
La clase System.Object
Ahora modifquemos el código en la clase Main de la siguiente manera:
proporciona un método
ToString. Por estándar,
Triangle t = new Triangle();
debe utilizar este
método para retornar
t.Draw();
la representación
legible para el humano
con respecto a una
Polygon p = t;
clase. Cuando cree sus
p.Draw();
tipos, es recomendable
practicar la
El programa producirá el siguiente resultado:
sobrescritura de este
método para retornar
Dibujando: Triángulo
www.pdftron.com
información legible
Dibujando: Polígono
sobre los objetos.
Cuando se invoca directamente el método Draw en el objeto de la clase derivada, se utiliza
la nueva versión del método. Sin embargo, si se ejecuta el método cuando la clase derivada
; ¿Listo para la
se castee como una clase base, se ejecuta la versión oculta de la clase base del método Draw.
certificación?
¿Comprende el
polimorfismo? -2.3
IBEROÁMERICA
� Comprender las interfaces
È EN RESUMEN
ETC
Las interfaces se utilizan para establecer contratos a través de los cuales los objetos pueden int
conocer los detalles de implementación.
Las interfaces se defnen utilizando la palabra reservada interface. Una defnición de
interface consiste en un conjunto de frmas para métodos, propiedades, delegados, eventos
o indexadores. Una defnición de interface no puede consistir de ningún campo de datos o
detalles de implementación como cuerpos de métodos.
Una interface común defnida en el espacio de nombres System es el espacio IComparable.

66
Lección 2
Esta interface se defne de la siguiente manera:
interface IComparable
{
int CompareTo(object obj);
}
Tome Nota
Por estándar, todas las
La interface IComparable tiene un solo método (CompareTo) que acepta un objeto y retorna
interfaces definidas
un int. El valor de retorno de este método indica el resultado de comparar un parámetro
en el .NET Framework
dado con el objeto actual. De acuerdo con la documentación del método CompareTo:
empiezan con la
letra I mayúscula.
• Si la instancia es igual al parámetro, CompareTo retorna 0.
Aun cuando puede
• Se retorna un valor positivo si el valor del parámetro es menor que la instancia o
asignar nombres a sus
si el parámetro es null.
interfaces de la forma
• Si el valor del parámetro es mayor que la instancia entonces se retorna un valor
que quiera, es mejor
negativo.
utilizar el estándar de
• Si el parámetro no es de tipo compatible, entonces se arroja una
Framework.
ArgumentException.
¿Cómo es que IComparable decide cómo comparar dos objetos Rectangle o dos objetos
Employee? No lo hace. Las clases que están interesadas en tales comparaciones deben
implementar la interface IComparable al proporcionar un cuerpo de método para el
método CompareTo. Cada clase que implementa IComparable es libre de proporcionar su
propia comparación lógica dentro del método CompareTo.
www.pdftron.com
Æ Uso de la interface IComparable
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique la clase Rectangle como se muestra a continuación:
class Rectangle : Polygon, IComparable
{
public double Length { get; set; }
IBEROÁMERICA
public double Width { get; set; }
public override void Draw()
{
Console.WriteLine(“Dibujando: Rectángulo”);
ETC } public double GetArea()
{
return Length * Width;
}

Introducción a la programación orientada a objetos


67
public int CompareTo(object obj)
{
if (obj == null)
return 1;
if (!(obj is Rectangle))
throw new ArgumentException();
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
return 0;
else if (diff > 0)
return 1;
else return -1;
}
}
2. Modifique el método Main como se muestra a continuación:
www.pdftron.com
static void Main(string[] args)
{
Rectangle rect1 = new Rectangle
{ Length = 10, Width = 20 };
Rectangle rect2 = new Rectangle
{ Length = 100, Width = 200 };
IBEROÁMERICA
Console.WriteLine(rect1.CompareTo(rect2));
}
3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de
consola al
valor -1 puesto que el área de rect1 es menor que el área de rect2.
GUARDE su proyecto.
ETC La clase Rectangle deriva se la clase Polygon e implementa la interface IComparable. Un
clase que implementa una interface debe implementar todos los métodos declarados en la
interface.
Una interface es similar a una clase abstracta pero hay diferencias notables. Una clase
abstracta proporciona una implementación incompleta mientras que una interface no
proporciona ninguna implementación. Una clase también puede implementar múltiples
interfaces pero está limitada a heredar de una sola clase base.

68
Lección 2
Por lo que, ¿cómo decide si utilizar una clase abstracta o una interface? Una forma de
decidir es revisar si existe una relación “es un” entre los dos conceptos. Por ejemplo,
; ¿Listo para la
si existe una relación de herencia entre SalariedEmployee y Employee, entonces puede
certificación?
utilizar una clase abstracta para estandarizar la funcionalidad común entre clases derivadas.
¿Comprende el
Por otro lado, no hay una relación “es un” entre Employee y la IComparable. Por lo tanto,
encapsulamiento? -2.4
la funcionalidad de comparación es mejor si se implementa como una interface.
www.pdftron.com
IBEROÁMERICA
ETC

Comprender los conceptos básicos de bases de datos


69
Resumen de la matriz de habilidades
En esta lección aprendió:
• La programación orientada a objetos es una técnica de programación que utiliza
objetos. Los objetos son estructuras de datos auto contenidas que consisten de
propiedades, métodos y eventos. Las propiedades especifcan los datos representados
por el objeto; los métodos especifcan el comportamiento del objeto y los eventos
proporcionan la comunicación entre los objetos.
• Una clase es la plantilla a partir de la cual se crean los objetos individuales.
• Los constructores se utilizan para inicializar los miembros de datos del objeto.
• La palabra reservada this se pueden utilizar para acceder a los miembros desde
dentro de los constructores, métodos de instancia y accessors de propiedades de
instancia.
• Los delegados son tipos especiales utilizados para encapsular un método dentro de
una frma específca.
• Los eventos son una forma en la cual una clase notifca a otras clases u objetos
cuando sucede algo de interés. La clase que envía la notifcación se conoce como
editor del evento. La clase que recibe la notifcación se conoce como suscriptor del
evento.
• Los espacios de nombre le permiten organizar código y crear nombres de clase
únicos.
• La palabra reservada static se utiliza para declarar miembros que no pertenecen a
objetos individuales sino a la clase en sí.
• Los tipos de valor almacenan directamente el valor mientras que los tipos de
www.pdftron.com
referencia almacenan solo la referencia al valor real.
• La palabra reservada struct se utiliza para crear tipos defnidos por el usuario que
consisten de pequeños grupos de campos relacionados. Las estructuras son tipos de
valor, las clases son tipos de referencias.
• El encapsulamiento es un mecanismo para restringir el acceso a una clase o
miembros de la clase para ocultar las decisiones de diseño que pueden cambiar.
El encapsulamiento proporciona a los diseñadores de la clase la fexibilidad para
cambiar el código cuando sea necesario sin cambiar todo el código involucrado.

IBEROÁMERICA
Un modifcador de acceso especifca la región de código a la cual tendrá acceso un
campo. Por ejemplo, un modifcador de acceso público no limita el acceso, pero un
privado limita el acceso dentro de la clase en la cual se defna el campo.
• La herencia le permite crear clases nuevas que reutiliza, extienden y modifcan la
funcionalidad defnida en clases existentes. La clase que hereda funcionalidad se
conoce como clase derivada y la clase cuya funcionalidad se hereda se conoce como
clase base.

ETC El polimorfsmo es la capacidad que tienen las clases derivadas para compartir
funcionalidad con las clases base pero aun defniendo su propio comportamiento
único.
• La palabra reservada override reemplaza un miembro de la clase base en una clase
derivada. La palabra new crea un nuevo miembro con el mismo nombre en la clase
derivada y oculta la implementación en la clase base.

70
Lección 2

» Evaluación de conocimiento
Complete los espacios en blanco
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
1. Una __________ es una huella de un objeto.
2. Una clase que no proporciona una implementación complete se debe declarar con la
palabra reservada __________.
3. Las clases que quieran soportar la comparación deben implementar la interface
IComparable y luego proporcionar un cuerpo para el método __________.
4. Puede utilizar el operador __________ para verifcar si es legal castear un tipo a otro.
5. Las tres características principales de un lenguaje de programación orientada a objetos
son el __________, __________, y __________.
6. Podemos utilizar __________ para agrupar clases relacionaras para reducir la colisión
de nombres.
7. La palabra reservada __________ se refere a la instancia actual de la clase.
8. Un tipo__________ es uno que referencia a un método.
9. Una __________ es un tipo de valor, mientras que una __________ es un tipo de
referencia.
www.pdftron.com
10. Puede utilizar la palabra reservada __________ para declarar un miembro, el cual
pertenece a la clase en sí en vez de a un objeto específco.
Opción múltiple
Encierre en un círculo la opción que contenga la respuesta correcta.
1. Desea restringir el acceso de un método a la clase contenedora o a una clase que se
derive de la clase contenedora. ¿Cuál modifcador de acceso debería utilizar para
utilizar este método?
IBEROÁMERICA
a. Public
b. Private
c. Protected
d. Internal
2. En una clase defnió un método llamado Render. Este método proporciona
ETC funcionalidad a los archivos Render bitmap en pantalla. Le gustaría que las clases
derivadas sustituyeran esta funcionalidad para soportar la renderización de formatos de
imágenes adicionales. Desea que el método Render de la clase derivada se ejecute aun
si la clase derivada esté casteada como la clase base. ¿Cuál palabra reservada utilizaría
con la defnición del método Render en la clase base?
a. Abstract
b. Virtual
c. New
d. Overrides

Comprender los conceptos básicos de bases de datos


71
3. Defnió una clase AdvMath que defne funcionalidad matemática avanzada. No
desea que la funcionalidad de esta clase se herede a una clase derivada. ¿Cuál palabra
reservada debe utilizar para defnir la clase AdvMath?
a. Sealed
b. Abstract
c. Private
d. Internal
4. Necesita proporcionar la funcionalidad de consulta a varias de sus clases. Cada
algoritmo de clase para consulta será diferente. No todas las clases tienen una relación
“es un” entre sí. ¿Cómo soportaría esta funcionalidad?
a. Agregar a la funcionalidad de consulta a la clase base con el modifcador de acceso
público.
b. Hacer que todas las clases hereden de la clase abstracta y sobrescriban el método de
la clase base para ofrecer su propia funcionalidad de consulta.
c. Hacer que todas las clases hereden de la clase base que proporcione la funcionalidad
de consulta.
d. Crear una interfaz común que se implemente por todas las clases.
5. ¿Cuál de los siguientes elementos de clase debería utilizar para defnir el comportamiento
de una clase?
a. Método
b. Propiedad
c. Evento
d. Delegado
6. Se encuentra escribiendo un código para una clase de nombre Product. Necesita
www.pdftron.com
asegurarse que los miembros de datos de las clases se inicialicen en sus valores correctos
tan pronto como cree un objeto de la clase Product. El código de inicialización se debe
ejecutar siempre. ¿Qué es lo que debería hacer?
a. Crear un método estático en la clase Product para inicializar los miembros de
datos.
b. Crear un constructor en la clase Product para inicializar los miembros de datos.
c. Crear una propiedad estática en la clase Product para inicializar los miembros de
datos.
IBEROÁMERICA
d. Crear un evento en la clase Product para inicializar los miembros de datos.
7. Se encuentra creando una nueva clase de nombre Square que se deriva de la clase
Polygon. La clase Polygon tiene el siguiente código:
a. class Polygon
b. {
c. public virtual void Draw()
ETC d. {e. // código adicional...
f. }
g. }
8. El método Draw en la clase Square debe proporcionar nuevas funcionalidades pero
también oculta la implementación de la clase Polygon del método Draw. ¿Cuál
segmento de código debería elegir?
a. class Square : Polygon
72
Lección 2
{
public override void Draw()
{
// código adicional...
}
}
b. class Square : Polygon
{
public new void Draw()
{
// código adicional...
}
}
c. class Square : Polygon
{
public virtual void Draw()
{
// código adicional...
}
}
www.pdftron.com
d. class Square : Polygon
{
public static void Draw()
{
// código adicional...
}IBEROÁMERICA
}
9. Se encuentra creando una nueva clase de nombre Rectangle. Escribe el siguiente
código:
class Rectangle : IComparable
{
ETC public double Length { get; set; }
public double Width { get; set; }
public double GetArea()
{
return Length * Width;
}

Comprender los conceptos básicos de bases de datos


73
public int CompareTo(object obj)
{
// a completarse
}
}
10. Necesita completar la defnición del método CompareTo para habilitar la comparación
de los objetos de Rectangle. ¿Cuál de los siguientes códigos debería escribir?
a. public int CompareTo(object obj)
{
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
return 0;
else if (diff > 0)
return 1;
else return -1;
}
b. public int CompareTo(object obj)
{
www.pdftron.com
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
return 1;
else if (diff > 0)
IBEROÁMERICA
return -1;
else return 0;
}
c. public int CompareTo(object obj)
{
ETC Rectangle target = (Rectangle)obj;
if (this == target)
return 0;
else if (this > target)
return 1;
else return -1;

74
Lección 2
}
d. public int CompareTo(object obj)
{
Rectangle target = (Rectangle)obj;
if (this == target)
return 1;
else if (this > target)
return -1;
else return 0;
}
11. Se encuentra escribiendo un código para un nuevo método de nombre Process:
a. void Process(object o)
b. {
c.
d. }
12. El código recibe un parámetro de tipo objeto. Necesita castear este objeto en el tipo
Rectangle. En ocasiones, el valor de o enviado al método puede no ser un valor de
Rectangle válido. Necesita asegurarse que el código no genere ningún error System.
InvalidCastException al hacer las conversiones. ¿Cuál de las siguientes líneas de código
www.pdftron.com
debería utilizar dentro del método Process?
a. Rectangle r = (Rectangle) o;
b. Rectangle r = o as Rectangle;
c. Rectangle r = o is Rectangle;
d. Rectangle r = (o != null) ? o as rectangle:(Rectangle) o;
13. Se encuentra escribiendo el código para controlar los eventos en su programa. Defne
IBEROÁMERICA
un delegado de nombre RectangleHandler como el siguiente:
a. public delegate void RectangleHandler(Rectangle rect);
b. También crea una variable del tipo RectangleHandler como
el siguiente:
c. RectangleHandler handler;
ETC 14. Más adelante en el programa, necesita agregar un método de nombre DisplayArea a
la lista de invocación de métodos de la variable controladora. La frma del método
DisplayArea corresponde al de la frma del método RectangleHandler. Cualquier
código que escriba no debería afectar ningún código controlador de eventos existente.
¿Cuál de los siguientes códigos debería escribir?
a. Handler = new Rectanglehandler(DisplayArea);
b. Handler = DisplayArea;
c. Handler += DisplayArea;
d. Handler -= DisplayArea;

Comprender los conceptos básicos de bases de datos


75

» Evaluación de destreza
Escenario 2-1: Creación de propiedades
Necesita crear una clase de nombre Product que represente un producto. La clase tiene una
sola propiedad de nombre Name. Los usuarios de la clase Product deben ser capaces tanto
de obtener como de establecer el valor de la propiedad Name. Sin embargo, cualquier
intento por establecer el valor de Name a una cadena vacía o a un valor null debe arrojar
una excepción. El usuario de la clase Product no debe ser capaz de acceder a cualquier otro
miembro de datos de la clase Product. ¿Cómo creará esta clase?.
Escenario 2-2: Creación de un Struct
Se encuentra desarrollando un juego que necesita representar la ubicación de un objetivo
en el espacio tridimensional. La ubicación se identifca por los tres valores enteros x, y y
z. Creará miles de estas estructuras de datos en su programa. Necesita una forma efciente
para almacenar estos datos en memoria. Es improbable que necesite heredar cualquier otro
tipo desde este tipo de ubicación. ¿Cómo debería representar la ubicación en su programa?.
Evaluación de destreza
Proyecto 2-3: Sobrescribiendo el método ToString
Se encuentra escribiendo un código para una clase Product. La clase Product contiene
el nombre y el precio de un producto. Necesita sobrescribir el método de la clase base
(System.Object) ToString para proporcionar información sobre los objetos de la clase
www.pdftron.com
product al código invocador. ¿Cuál código necesita escribir para la clase Product para
cumplir con este requisito?.
Proyecto 2-4: Creación y manejo de eventos
Se encuentra escribiendo un código para la creación y manejo de eventos en su programa.
La clase SampleClass necesita implementar la siguiente interface:
public delegate void SampleDelegate();
IBEROÁMERICA
public interface ISampleEvents
{
event SampleDelegate SampleEvent;
ETC void Invoke();
}
Necesita escribir el código para SampleClass y para un método test que crea una instancia
de SampleClass e invoca el evento. ¿Cuál código debería escribir?.
En una clase defnió un método llamado Render. Este método proporciona funcionalidad
a los archivos Render bitmap en pantalla. Le gustaría que las clases

76
Lección 2
www.pdftron.com
IBEROÁMERICA
ETC

Lección 3
Desarrollo General de Software
Matriz de Dominio de Objetivos
Habilidad Tecnológica
Descripción del Dominio de Objetivo
Número del Dominio
del Objetivo
Comprender la Administración del Ciclo de Comprender la Administración del
Ciclo de Vida 3.1
Vida de una Aplicación
de una Aplicación
Comprender las Pruebas
Comprender la Administración del Ciclo de Vida 3.1
de una Aplicación
Comprender las Estructuras de Datos
Comprender los algoritmos y estructuras de
3.3
datos
Comprender los Algoritmos de
Comprender los algoritmos y estructuras de
3.3
Clasificación
datos
Términos Clave
www.pdftron.com
• Arreglos o vectores
• Ordenamiento rápido
• Pruebas de unidad
• Pruebas de caja negra
• Colas
• Pruebas de caja blanca
• Ordenamiento de burbuja
• Pruebas de regresión
• Listas enlazadas
• Pilas
IBEROÁMERICA
Como desarrollador para la Corporación de Northwind, trabaja como parte de un equip
desarrollar programas de computadora que resuelven problemas de negocios complejos.
desarrollador, participa en el ciclo de vida de desarrollo de aplicaciones. Tiene que con
diferentes fases del ciclo de vida de aplicación y a menudo necesita interactuar con el equipo d
pruebas de software y participar en las pruebas en persona. Necesita tener una comprensión ge
de las pruebas de software.
ETC Cuando desarrolla software utiliza varios tipos de estructuras de datos y algoritmos. Nece
saber cuál estructura de datos utilizar para cada una de las áreas a desarrollar así como conoce
implicaciones de su elección. También debe tener una comprensión general de varios métodos
ordenación.

78
Lección 3
� Comprender la Administración del Ciclo de Vida de
una Aplicación
È EN RESUMEN
La Administración del Ciclo de Vida de una Aplicación se refere a las distintas actividades qu
un nuevo producto de software desde su comienzo hasta que el producto de software madura y
deshecha.
Desarrollar una aplicación de software es más que solo escribir el código. Se necesita
desarrollar distintas actividades en el orden correcto para desarrollar una aplicación de
software exitosamente. Administrar estas actividades es conocido colectivamente como
una Administración del Ciclo de Vida de Aplicación (ALM). Algunas de las actividades
que son parte del proceso de ALM como se muestra en la Figura 3-
1 son: Requerimientos,
Diseño, Desarrollo, Pruebas, Entrega y Administración de Liberación.
Figura 3-1
Administración del Ciclo
de Vida de Aplicación
www.pdftron.com
En esta sección aprenderá acerca de las distintas actividades y roles involucrados en cada
una de las actividades en la administración del ciclo de vida de una aplicación.
IBEROÁMERICA
El ciclo de vida de aplicación inicia cuando la necesidad por una nueva aplicación de
software es identifcada. El administrador de un negocio generalmente es la persona que
patrocina el proyecto. Él o ella analizan la necesidad, verifcan cómo el proyecto encaja con
la estrategia global del negocio, organiza la fnanciación e inicializa el proceso de selección
de equipo para el proyecto.
Un administrador del proyecto es probablemente la primera persona contratada por el
ETC administrador del negocio. Este administrador del proyecto es responsable de la ejecució
global del proyecto. Las responsabilidades principales de un administrador de proyecto
son el garantizar que el proyecto se ajuste al presupuesto y se termine en tiempo. El
administrador de proyecto es responsable de la contratación de miembros del equipo y de
facilitar la cooperación dentro del equipo.
Comprender el Análisis de Requerimientos
El análisis de requerimientos es el proceso de determinar los requerimientos del negocio detal
sistema de software.

Desarrollo General de Software


79
El análisis de requerimientos es uno de los pasos más importantes en el ciclo de vida
de aplicación. Requerimientos precisos, completos y bien documentados son críticos
para el éxito del proyecto. Los requerimientos pueden ser funcionales o no funcionales.
Los requerimientos funcionales especifcan exactamente lo que el sistema está diseñado
para llevar a cabo. En contraste, los requerimientos no funcionales son requerimientos de
calidad tales como la escalabilidad, seguridad, confabilidad, etc.
Un analista de negocios es responsable de analizar las necesidades del negocio y convertirlas
en requerimientos que pueden ser ejecutados por el equipo de desarrollo.
Comprender el Proceso de Diseño
El proceso de diseño es utilizado para crear planes, modelos y la arquitectura de cómo el softw
El proceso de diseño despliega especifcaciones técnicas detalladas que serán utilizadas
por el desarrollo del sistema. La salida del proceso de diseño es un conjunto de modelos
y especifcaciones técnicas que proporcionan la dirección a los desarrolladores y otros
miembros del equipo durante la actividad de desarrollo de software. La salida del proceso
de diseño es más abstracta que concreta. Por ejemplo, no existen sistemas reales con los
cuales pueda interactuar.
Algunos de los participantes importantes en esta actividad son:
• Un arquitecto diseña el proyecto del sistema. Esto incluye identifcar los
componentes y servicios, su comportamiento y cómo interactúan entre sí y con el
mundo exterior.
• Un diseñador de experiencia del usuario crea la experiencia del usuario del sistema.
Los elementos de experiencia del usuario incluyen el diseño de los elementos de la
www.pdftron.com
interfaz de usuario (UI), diseñar la navegación entre varios formularios, pantallas
o páginas, etc.
Comprender el Desarrollo de Software
La actividad de desarrollo de software involucra la implantación de diseño creando código de
y otro contenido relacionado.
IBEROÁMERICA
Esta es la actividad donde los requerimientos son implementados en código funcional
basado en el diseño que fue establecido en la actividad previa. Al fnal de esta actividad,
se tiene una salida concreta en formato de un sistema de software con el cual el usuario
puede interactuar.
Los participantes en el proceso de desarrollo son:
• Los desarrolladores escriben el código con base en los requerimientos reunidos por
ETC el analista de negocios, la arquitectura establecida por el arquitecto y la experiencia
del usuario desarrollada por el diseñador de experiencia del usuario.
• Los administradores de bases de datos (DBAs) son responsables de la implementación
y administración de la base de datos. Los DBAs también planean la integridad de
datos, seguridad y velocidad.
• Los escritores técnicos desarrollan los manuales del sistema y archivos de ayuda que
serán entregados junto con la aplicación.
• Los desarrolladores de contenido son expertos en la material quienes desarrollan el
contenido del sistema. Por ejemplo, si la aplicación es un sitio web de reseña de
80
Lección 3
películas, no es sufciente sólo mostrar videos en el sitio, necesita asegurarse que
hay sufciente contenido para reunir el interés del usuario.
Comprendiendo las Pruebas de Software
La Prueba de Software verifca que la implementación coincide con los requerimientos del sist
La prueba de software es utilizada para asegurar la calidad del producto fnal. La prueba
puede identifcar posibles lagunas entre las expectativas del sistema como se describen en
el documento de requerimientos y el comportamiento real del sistema.
Un punto importante en la prueba de software se lleva a cabo por los testers (probadores)
quienes verifcan la aplicación en acción para asegurarse que satisface los requerimientos.
Los problemas identifcados por los testers son asignados a una persona para repararlos. Por
ejemplo, un defecto en el código será asignado a un desarrollador para repararlo.
Comprender la Administración de Liberación
La actividad de administración de liberación es utilizada para administrar el desarrollo,
liberaciones de software.
La administración de liberación incluye actividades tales como empaquetado y despliegue
del software, administración de defectos de software y administración de solicitudes de
cambio de software.
Los participantes principales en las actividades de administración son:
www.pdftron.com
• Administrador de Liberación: el administrador de liberación coordina a varios
equipos y unidades del negocio para garantizar la liberación a tiempo del producto
de software.
• Personal de Operación: Se aseguran que el sistema sea entregado como se
prometió. Esto podría involucrar quemar los DVDs y embarcarlos conforme
; ¿Listo para la
se reciben las órdenes. O podría ser mantener un sistema de Software como un
certificación?
Service (SaaS) de forma regular. El personal de operación es también responsable
¿Comprende la
de la liberación de cualquier actualización del sistema (con reparadores de errores
administración
o nuevas características).
IBEROÁMERICA
del ciclo de vida
• Personal de soporte técnico: Interactúan con clientes y ayudan a resolver sus
de aplicación y
problemas con el sistema. El soporte técnico puede generar métricas valiosas acerca
sus actividades?
de cuáles áreas del sistema son más difíciles para los usuarios y que posiblemente
— USD 3.1
necesiten ser actualizadas en la próxima versión del software.
� Comprender las Pruebas
ETC
È EN RESUMEN
La prueba de software es el proceso de verifcar el software contra sus requerimientos. La prue
que la mayoría del trabajo de desarrollo es completado.
La prueba de software es un proceso de verifcar que el software funciona como se espera
y cumple todos sus requerimientos técnicos y de negocios. Cuando hay diferencia entre

Desarrollo General de Software


81
lo esperado y el comportamiento actual del sistema, un defecto de software (o “bug”) es
registrado y eventualmente pasado al responsable para repararlo.
Las pruebas de software involucran tanto pruebas funcionales y no funcionales. La
prueba funcional es probar precisamente los requerimientos funcionales del sistema y las
características que conforman la funcionalidad esencial. Por ejemplo, probar si el usuario
puede agregar artículos a un carrito de compras es parte de la prueba funcional para un
sitio web de comercio electrónico. Por otro lado, la prueba no funcional involucra pruebas
de atributos de software que no son parte de la funcionalidad esencial pero son parte de los
requerimientos no funcionales, tales como la escalabilidad, facilidad de uso, seguridad, etc.
Comprender los Métodos de Prueba
Los métodos de prueba de software son generalmente divididos en pruebas de caja blanca y ca
Tradicionalmente hay dos enfoques en la prueba de software:
• Prueba de caja negra
• Prueba de caja blanca
La prueba de caja negra trata al software como una caja negra, enfocándose sólo en las
entradas y salidas. Cualquier conocimiento del funcionamiento del sistema interno no es
utilizado para la prueba. En contraste, en la prueba de caja blanca, los testers utilizan su
conocimiento del interior del sistema para probar el sistema. Por ejemplo, en la prueba de
caja blanca, los testers tienen acceso al código fuente.
Estas técnicas se complementan entre sí. La prueba de caja negra es más utilizada para
asegurarse que todos los requerimientos son cubiertos. La prueba de caja blanca es utilizada
para asegurarse que cada método o función tiene sus propios casos de prueba disponibles.
www.pdftron.com
Comprender los Niveles de Prueba
La prueba se lleva cabo en varias fases del ciclo de vida del desarrollo de aplicación. Los Nive
donde tiene lugar la prueba del ciclo de vida.
Tome Nota
Los niveles de prueba están defnidos por donde tiene lugar la prueba en el ciclo de vida
Es importante notar
del desarrollo de software. Están los siguientes cinco niveles de prueba:
IBEROÁMERICA
que el proceso de
prueba de software
• Prueba de unidad: La prueba de unidad verifca la funcionalidad de una unidad
puede sólo ayudar a
de código. Por ejemplo, una prueba de unidad puede probar si un método retorna
encontrar defectos,
el valor correcto. La prueba de unidad es una prueba de caja blanca y a menudo es
no garantiza la
hecha por el desarrollador que escribe el código. La prueba de unidad a menudo
ausencia de defectos.
El software complejo
utiliza una herramienta automatizada que puede simplifcar el desarrollo de casos
tiene un gran número
y también mantiene registro de si una modifcación de software causa que falle
ETC
de posibles rutas de
alguna de las pruebas de unidad existentes. Visual Studio tiene soporte integrado
ejecución y muchos
para la prueba de unidad. También puede utilizar herramientas de apertura de
parámetros que
código tales como NUnit para automatizar pruebas de unidad para código de.NET
pueden afectar su
Framework.
comportamiento. No
• Prueba de Integración: La prueba de integración prueba la interfaz entre los
es factible y a menudo
no es posible probar
componentes de software. La prueba de integración puede ser desempeñada
todas las diferentes
incrementalmente conforme los componentes se desarrollan, o puede ser llevada a
situaciones que
cabo como un “bigbang” cuando todos los componentes están listos para trabajar
encontrará el software
juntos. El primer método se prefere sobre el segundo puesto que reduce el riesgo
en un entorno de
e incrementa la confanza en el sistema que se esté desarrollando. La prueba de
producción.
integración puede también involucrar la prueba de interacción de componentes

82
Lección 3
con un sistema externo. Por ejemplo, si un componente se basa en datos de un
servicio Web externo, la prueba de integración garantiza que el componente está
funcionando correctamente con la aplicación externa.
Tome Nota
• Prueba de sistema: La prueba de sistema es la prueba global del sistema de
Es mucho más efectivo
software. En este punto todos los componentes del sistema implementados están
y menos costoso
funcionando juntos y con cualquier sistema externo.
encontrar defectos
• Prueba de aceptación: Este nivel de prueba a menudo es desempeñado por
antes que tarde en el
los propios clientes. Generalmente hay dos niveles de pruebas aceptación previa
ciclo de desarrollo de
a la liberación amplia del producto: prueba alfa y prueba beta. La prueba Alfa
software.
es desempeñada por un grupo muy limitado de usuarios y es una oportunidad
para dar una vista de cerca al producto a los clientes más importantes y reunir
retroalimentación. Las liberaciones Alfa pueden omitir algunas características y
generalmente la falta de muchos atributos no funcionales tales como el rendimiento.
• En el siguiente nivel de prueba, la prueba beta, libera el producto a una audiencia
más amplia de clientes y solicita retroalimentación. En términos de funcionalidad,
la liberación beta del software es muy cercana a la liberación fnal. Sin embargo,
los equipos de desarrollo podrían estar trabajando en mejorar el rendimiento y
reparando algunos defectos conocidos.
; ¿Listo para la
• Prueba de Regresión: Conforme los defectos son reportados y reparados,
certificación?
es importante asegurarse que una reparación no rompe nada que funcionaba
¿Comprende los
previamente. Esto se lleva a cabo como parte de la prueba de regresión. Con cada
distintos métodos de
nueva reparación, los testers de software ejecutan una serie de pruebas de regresión
prueba? — USD 3.1
para asegurarse que la funcionalidad que se sabía que funcionaba aun funciona.
� Comprender las Estructuras de Datos
www.pdftron.com
È EN RESUMEN
Las estructuras de datos son técnicas para organizar y almacenar datos en la memoria de la com
la información es almacenada afecta la manera en la cual los datos son recuperados y manipul
estructura de datos involucra comprender no solo el patrón de almacenamiento sino también c
utilizados para crear, acceder y manipular la estructura de datos.
Las estructuras de datos son los bloques de construcción de la mayoría de los programas
IBEROÁMERICA
de computadora y permite a los desarrolladores el implementar funcionalidad compleja.
La mayoría de los frameworks de programación proporcionan soporte integrado para una
variedad de estructuras de datos y métodos asociados para manipular estas estructuras de
datos. En esta sección aprenderá algunos tipos distintos de estructuras de datos de manera
que está familiarizado con las técnicas generales para la manipulación de estructuras de
datos.
Arreglos ETC
Un arreglo es una colección de ítems almacenados en una ubicación de memoria contigua y di
uno o más índices.
Un arreglo es una estructura de datos muy común que representa una colección de ítems
de un tipo similar. Los ítems en un arreglo son almacenados en ubicaciones de memoria
contigua. Un arreglo es una estructura de datos homogénea ya que todos los ítems de un
arreglo son del mismo tipo de datos. Cualquier ítem del arreglo puede ser directamente
accedido utilizando un índice. En .NET Framework, los índices de arreglo están basados
en ceros.
Desarrollo General de Software
83
Representación Interna
En el siguiente código, la primera sentencia crea una variable de arreglo y la segunda
sentencia inicializa la variable con un arreglo de cuatro enteros:
1. int[] numbers;
2. numbers = new int[4];
Inicialmente, los números variables serán establecidos a null debido a que el arreglo aún
no está inicializado. La segunda sentencia inicializa el arreglo asignando un espacio de
memoria contigua lo sufcientemente grande para almacenar cuatro enteros en la pila de
memoria. La dirección de inicio en la memoria asignada es almacenada en la variable del
arreglo numbers como se muestra en la Figura 3-
2. Todos los elementos del arreglo son
inicializados en este caso con el valor 0 ya que es el valor por defecto para un entero.
Figura 3-2
Representación interna de
una estructura de datos
de un arreglo
www.pdftron.com
La variable numbers entonces actúa como una referencia a la ubicación de memoria
asignada al arreglo. El nombre del arreglo puede ser utilizado para acceder a cada uno de
los ítems de arreglo directamente. En el.NET Framework, todos los arreglos están basados
en cero. Esto es, el primer ítem del arreglo es accedido utilizando un índice 0, como esto:
IBEROÁMERICA
numbers[0], el segundo ítem es accedido por numbers[1],y así sucesivamente.
También es posible tener arreglos multidimensionales. Un arreglo de dos dimensiones
puede ser visto como una tabla donde cada celda es un elemento del arreglo y puede
ser direccionado utilizando el número de fla y el número de columna al cual pertenece.
Tanto el número de fla y el número de columna son indexados por cero. Por ejemplo, la
expresión table[2, 3] se refere a un ítem en la tercera fla y en la cuarta columna de un
ETC arreglo por el nombre table.
Operaciones Comunes
El arreglo soporta las siguientes operaciones:
• Asignación
• Acceso
Para trabajar con un arreglo, primero asigne la memoria creando e inicializando un arreglo

84
Lección 3
como se mostró previamente. Una vez que el arreglo es asignado, puede acceder a cualquier
elemento del arreglo en cualquier orden que desee directamente referenciando a su índice.
Por ejemplo, el siguiente código asigna un valor de 10 al cuarto ítem del arreglo, y el
doble de ese valor es entonces asignado a la variable calc:
3. number[3] = 10;
4. intcalc = number[3] * 2;
Rendimiento y uso
Los contenidos de un arreglo son establecidos como un bloque contiguo de memoria y
puede ser directamente accedido utilizando el índice del arreglo. Por lo tanto la lectura o
escritura en un arreglo es extremadamente rápida. Sin embargo, los arreglos están limitados
por los requerimientos de homogeneidad y de tamaño fjo. Aunque el tamaño del arreglo
puede ser incrementado, el hacerlo requiere la reasignación de todos los elementos del
arreglo y es una operación que consume tiempo.
Los arreglos funcionan mejor cuando el número de ítems en la colección está predeterminado
y se requiere de acceso rápido a cada ítem.
En el.NET Framework, puede utilizar la clase ArrayList para aproximarse a los
requerimientos de un vector para lograr la homogeneidad y un tamaño fjo. Un ArrayList
es un tipo de colección que puede mantener ítems de cualquier tipo de datos y se puede
expandir dinámicamente cuando sea necesario. Sin embargo, un ArrayList no es tan rápido
como un arreglo.
Colas
www.pdftron.com
Una cola es una colección de ítems en la cual el primer ítem añadido a la colección es el prime
La estructura de datos de una cola imita una cola en vida real. En una cola, los ítem
son procesados en el orden en el que fueron agregados a la cola. En una cola, los ítems
siempre son agregados al fnal de la cola y son removidos desde el frente de la cola. Esto
es comúnmente conocido como el primero que entra es el primero que sale (FIFO). La
capacidad de una cola es el número de ítems que puede mantener. Sin embargo, conforme
los elementos son agregados a la cola, la capacidad es incrementada automáticamente.
IBEROÁMERICA
Una cola es una estructura de datos heterogénea, lo que signifca que los ítems en una cola
pueden ser de diferentes tipos de datos.
Representación Interna
Con el fn de evitar la reubicación excesiva de espacio de memoria y permitir una
ETC administración sencilla, una cola a menudo es implementada internamente como un
arreglo circular de objetos, como se muestra en la Figura 3-3.
En la Figura 3-
3, el índice cabeza apunta a la ubicación 2 en la cola. Ya que la cola es
circular, mientras tenga registro de los apuntadores de cabeza y cola, no importa en cual
ubicación empieza la cola. El índice cabeza apunta al primer ítem en la cola y el índice
cola apunta al último ítem en la cola. Cuando un ítem es removido, la cabeza se mueve
al siguiente ítem en la cola. Un nuevo ítem siempre es agregado al fnal y la cola inicia
apuntando al ítem recién agregado. Los espacios null en la Figura 3-
3 son los lugares
vacíos en la cola que pueden ser llenados antes de que la cola necesite una reasignación de
memoria.

Desarrollo General de Software


85
El .NET Framework proporciona una implementación de la estructura de datos de una
cola como parte de la clase Queue en el espacio de nombres de System.Collections. En
lenguajes de programación que no proporcionan una implementación de una cola, puede
escribir su propia clase Queue utilizando una estructura de datos parecida a un arreglo y
simulando las operaciones de una cola.
Figura 3-3
Representación interna de
una estructura de datos
de una cola
Tome Nota
Una versión genérica
de la clase Queue
está disponible como
parte del espacio de
nombres de System.
Collections.Generic.
Esta versión genérica
es utilizada para crear
una cola de ítems que
son del mismo tipo de
datos.
Operaciones Comunes
Una cola soporta las siguientes operaciones comunes:
www.pdftron.com
• Enqueue: Esta operación primero verifca si hay sufciente capacidad disponible
en la cola para agregar un ítem más. Si la capacidad está disponible, el ítem es
agregado al fnal de la cola. Si no hay espacio disponible en la cola, el arreglo es
reasignado por un factor de crecimiento pre especifcado y luego el nuevo ítem es
agregado a la cola.
• Dequeue: Esta operación remueve el elemento actual en la cabeza de la cola para
apuntar al siguiente elemento en la cola, como se muestra en la Figura 3-3.
• Peek: La operación Peek le permite mirar el ítem actual en la posición de la cabeza
IBEROÁMERICA
sin removerlo realmente de la cola.
• Contains: Esta operación le permite determinar si existe un ítem en particular en
la cola.
Rendimiento y Uso
Una cola es una estructura de datos de un propósito especial que es más adecuada para
una aplicación donde necesita procesar ítems en el orden recibido. Algunos ejemplos
ETC pueden incluir una cola de impresión, sistema de mensajería y un calendario de trabajo.
A diferencia de un arreglo, una cola no puede ser utilizada para acceder aleatoriamente a
elementos. Las operaciones tales como enqueue y dequeue en realidad agregan y remueven
los ítems de la cola.
Pilas
Una pila es una colección de ítems en la cual el último ítem agregado es el primero en ser rem
Como opuesto a una cola, una pila es una estructura de datos en la que el ultimo que

86
Lección 3
entra es el primero que sale (LIFO). Puede pensar en una pila como la pila de platos de
cena en un buffet de mesa. El último en ser agregado es el primero en ser removido. La
capacidad de una pila es el número de ítems que puede mantener. Sin embargo, conforme
los elementos son agregados a la pila, la capacidad es automáticamente incrementada.
Una pila es una estructura de datos heterogénea, lo que signifca que los ítems en una pila
pueden ser de diferentes tipos de datos.
Representación Interna
Como una cola, una pila a menudo es implementada como un buffer circular con el fn de
evitar la reubicación de espacio en memoria y para una administración más sencilla. Una
Tome Nota
pila puede ser visualizada justo como la cola en la Figura3-
3, excepto que la cola ahora es
llamada tope de la pila y la cabeza es llamada fondo de la pila.
Una versión generic
de la clase Stack
Un nuevo ítem siempre es agregado en la parte superior de la pila, y el fondo de la pila
está disponible como
parte del espacio de
inicia apuntando al elemento recién agregado. Los ítems también son removidos desde la
nombres de System.
parte superior de la pila y cuando esto sucede, la parte superior de la pila es ajustada para
Collections.Generic.
apuntar al siguiente ítem en la pila.
Esta versión genérica
es utilizada para crear
El .NET Framework proporciona una implementación de la estructura de datos de pila
una pila de ítems que
como parte de la clase Stack en el espacio de nombres de System.Collections. En lenguajes
son del mismo tipo de
de programación que no proporcionan una implementación de la pila, puede escribir su
datos.
propia clase Stack utilizando una estructura de datos parecida al arreglo y simular las
operaciones de la pila.
Operaciones Comunes
www.pdftron.com
Una pila soporta las siguientes operaciones comunes:
• Push: La operación push primero verifca si hay capacidad sufciente disponible
en la pila para agregar un ítem más. Si la capacidad está disponible, el ítem es
agregado en la parte superior de la pila. Si no hay espacio en la pila, el arreglo es
reubicado por un factor de crecimiento pre especifcado y entonces el nuevo ítem
es agregado a la pila.
• Pop: La operación pop remueve el elemento de la parte superior de la pila y
establece la parte superior para que apunte al siguiente elemento en la pila.

IBEROÁMERICA
Peek: La operación Peek le permite mirar en el ítem actual en la parte superior de
la pila sin removerlo realmente de la pila.
• Contains: La operación Contains le permite determinar si un ítem en particular
existe en la pila.
Rendimiento y Uso
Una pila es una estructura de datos con propósito especial que es más adecuada para
ETC aplicaciones donde necesita procesar ítems en orden del último que entra es el primero
que sale. Una pila es una estructura de datos muy útil debido a sus aplicaciones en la
administración de memoria en tiempo de ejecución, evaluación de expresión, registro de
llamado de método, etc. A diferencia de un arreglo, una pila no puede ser utilizada para
acceder a elementos aleatoriamente. Las operaciones tales como push y pop realmente
agregan y remueven los ítems de la pila.
Listas Enlazadas
Una lista enlazada es una colección de nodos ordenados de forma que cada nodo contiene un e
en la secuencia.
Desarrollo General de Software
87
Una lista enlazada es una colección de nodos de tal manera que cada nodo contiene una
referencia (o enlace) al siguiente nodo en la secuencia. A diferencia de un arreglo, los
ítems en una lista enlazada no necesitan ser contiguos y por lo tanto una lista enlazada
no requiere de reubicación de espacio en memoria para la lista entera cuando se necesita
agregar más ítems.
Representación Interna
En memoria, una lista enlazada puede ser visualizada como una colección de nodos, como
se muestra en la Figura 3-4.
Figura 3-4
Representación interna de
una estructura de datos
de una lista enlazada
sencilla
Cada nodo contiene dos piezas de información: los datos correspondientes al nodo y
el enlace al siguiente nodo. El primer nodo de la lista es llamado el nodo encabezado.
Utilizando el enlace del nodo encabezado, puede llegar al siguiente nodo y continuar
atravesando nodos hasta que el enlace fnal es un valor null. A menudo el termino cola es
utilizado para referirse a la lista apuntada por el nodo encabezado, la cola es todo lo demás
después del nodo encabezado. En la Figura 3-
4, la cola es la lista enlazada iniciando desde
el nodo B.
www.pdftron.com
Algunas otras implementaciones de listas enlazadas pueden ser utilizadas dependiendo de
los requerimientos. En una lista enlazada circular, el último nodo es la lista apuntando de
regreso al primer nodo para crear un círculo. En una lista doblemente enlazada, cada nodo
contiene dos enlaces, como se muestra en la Figura 3-5.
Figura 3-5
Representación de una
estructura de datos de
una lista doblemente
enlazada
IBEROÁMERICA
ETC Un enlace es una referencia de dirección que apunta al siguiente nodo en la secuencia
y el otro enlace es una referencia hacia atrás que apunta de regreso al nodo previo en la
secuencia. Como puede imaginar, una lista doblemente enlazada es fácil de atravesar en
cualquier dirección.
El .NET Framework proporciona una clase LinkedList como parte del espacio de nombres
de System.Collections.Generic. Esta clase implementa homogéneamente una lista
doblemente enlazada de un tipo de datos específco. Puede escribir sus propias clases para
implementar un diferente tipo de implementación de lista enlazada.
88
Lección 3
Operaciones Comunes
Una lista enlazada soporta las siguientes operaciones comunes:
• Add: Agregar o insertar un ítem en una lista enlazada es un asunto de cambiar
enlaces, como se muestra en la Figura 3-6. Digamos que le gustaría insertar un
nuevo nodo (con valor Z) entre los nodos con valores A y B. primero necesita
asignar memoria para el nuevo nodo y asignar el valor Z a la sección de datos del
nodo. Luego, copiara la sección de enlace del nodo A a la sección de enlace del
nodo Z de modo que el nodo Z está apuntando al nodo B. Finalmente, necesitará
copiar la dirección del nodo Z recién creado a la sección de enlace del nodo A
de manera que el nodo A inicia apuntando al nodo Z.
• Remove: Similar a la operación add, la operación de remove o delete es también
asunto de cambiar enlaces. Por ejemplo, para eliminar el tercer nodo en la Figura
3-4, cambiará el enlace del Segundo nodo a un valor null. El tercer nodo ahora
será una pieza de memoria sin referencia y eventualmente será retornada al pool de
memoria disponible.
• Find: Esta operación encuentra un nodo con un valor dado en la lista enlazada. Para
encontrar un valor, generalmente inicia desde el nodo encabezado y verifca si el
valor coincide. Si no, seguirá el enlace al siguiente nodo y continuará la operación
fnd hasta que alcance el fnal de la lista, lo cual sucede cuando encuentra un enlace
null.
Figura 3-6
Agregando un nuevo nodo
a una lista enlazada
www.pdftron.com
IBEROÁMERICA
Rendimiento y Uso
Una lista enlazada no permite acceso aleatorio a sus ítems. La única manera de llegar
ETC a un ítem es iniciar desde el nodo encabezado y seguir los enlaces. Como resultado, las
listas enlazadas son muy lentas en la recuperación de datos. Sin embargo, para operaciones
de insertar y eliminar, las listas enlazadas son extremadamente rápidas: la inserción o
eliminación de un nodo involucra solo cambiar un link. Además las listas enlazadas no
tienen una capacidad máxima después de la cual el contenido necesita ser reasignado.
; ¿Listo para la
De hecho, una lista enlazada proporciona una manera alternativa para implementar las
certificación?
estructuras de datos de la cola y la pila. Si sus requerimientos realizan accesos frecuentes
¿Comprende las
a datos pero rara vez necesita insertar o eliminar datos, un arreglo es la implementación
estructuras de datos
ideal. Si en su lugar, los requerimientos llaman con frecuencia operaciones de insert y
comunes? — USD 3.2
delete, entonces puede ser más recomendable utilizar una lista enlazada.

Desarrollo General de Software


89
� Comprender los Algoritmos de Ordenamiento
È EN RESUMEN
Los algoritmos de ordenamiento tales como Ordenamiento de burbuja y el Ordenamien
ordenan ítems en una lista en un orden en particular. Comprender los algoritmos de ordenamie
a comprender, analizar y comparar distintas maneras de resolver un problema.
Los algoritmos de ordenamiento son algoritmos que ordenan los ítems en una lista en
un cierto orden. Por ejemplo, puede utilizar un algoritmo de ordenamiento para ordenar
una lista de estudiantes en orden ascendente de su apellido. En la época de los primeros
procesamientos de datos, el ordenamiento era un problema muy importante. En estos días,
puede encontrar capacidades de ordenamiento básicas ya integradas en librerías populares
y estructuras de datos. Por ejemplo, en el .NET Framework, puede hacer uso del método
Array.Sort para ordenar un arreglo. Sin embargo, aún es importante mirar el ordenamiento
como una manera de comprender la resolución de un problema y análisis de algoritmos.
En esta sección, le echará un vistazo a dos algoritmos de ordenamiento comunes:
ordenamiento de burbuja y ordenamiento rápido.
Ordenamiento de Burbuja
El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de comparación e in
una lista en el orden correcto.
www.pdftron.com
El ordenamiento de burbuja funciona comparando dos elementos para verifcar si están
fuera de lugar, si lo están, los intercambia. El algoritmo continúa haciendo esto hasta que
la lista entera está en el orden deseado. El ordenamiento de burbuja obtiene su nombre
de la manera en que funciona el algoritmo; como el algoritmo progresa, los ítems más
pequeños son “burbujeados” hacia arriba.
Visualicemos el ordenamiento de burbuja con ayuda de un ejemplo. Digamos que desea
ordenar todos los ítems en la siguiente lista en orden ascendente: (20, 30, 10, 40). Los
ítems deberían ser ordenados en orden del más pequeño al más grande. El algoritmo
IBEROÁMERICA
de ordenamiento de burbuja intenta solucionar este problema en una o más pasadas,
con cada pasada escaneando completamente la lista de ítems. Si el algoritmo encuentra
elementos fuera de lugar, los intercambia. El algoritmo termina cuando escanea toda la
lista sin intercambiar ningún elemento, si no hubo intercambios entonces ninguno de los
elementos esta fuera de lugar y la lista ha sido completamente ordenada.
Tabla 3-1
Paso
Antes
Después
Comentarios
ETC
Primera pasada del
1.
20, 30,
20, 30,
El algoritmo compara los primeros dos elementos
ordenamiento de burbuja
10, 40
10, 40
(20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.
2.
20, 30,
20, 10,
El algoritmo compara los siguientes dos elementos
10, 40
30, 40
(30 y 10),y ya que están fuera de lugar, los elementos
son intercambiados.
3.
20, 10,
20, 10, 30,
El algoritmo compara los siguientes dos elementos
30, 40
40
(30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.

90
Lección 3
Al fnal de la primera pasada, el ordenamiento de burbuja ha desempeñado un intercambio
y hay una posibilidad que los ítems aún no están completamente ordenados. De manera
que el ordenamiento de burbuja da otra pasada a la lista.
Tabla 3-2
Paso
Antes
Después
Comentarios
Primera pasada del
1.
20, 10,
10, 20,
El algoritmo compara los primeros dos elementos
ordenamiento de burbuja
30, 40
30, 40
(20 y 10),y como están fuera de lugar, los elementos
son intercambiados.
2.
10, 20, 30,
10, 20,
El algoritmo compara los siguientes dos elementos
40
30, 40
(20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.
3.
10, 20,
10, 20,
El algoritmo compara los siguientes dos elementos
30, 40
30, 40
(30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.
Al fnal de la segunda pasada, el ordenamiento de burbuja ha desempeñado un intercambio
y aun no puede garantizar que la lista está completamente ordenada. De manera que el
ordenamiento de burbuja da otra pasada a la lista:
Tabla 3-3
Paso
Antes
Después
Comentarios
Primera pasada del
1.
10, 20,
10, 20,
El algoritmo compara los siguientes dos elementos
ordenamiento de burbuja
30, 40
30, 40
(10 y 20),ya que están en el orden correcto, no es
necesario el intercambio.
2.
10, 20,
10, 20,
El algoritmo compara los siguientes dos elementos
30, 40
30, 40
(20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.
www.pdftron.com
3.
10, 20,
10, 20,
El algoritmo compara los siguientes dos elementos
30, 40
30, 40
(30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.
Al fnal de la tercera pasada, el ordenamiento de burbuja no realizó ningún intercambio.
Eso garantiza que la lista ahora esta ordenada y el algoritmo puede fnalizar.
En C# este algoritmo puede ser expresado por el siguiente método:
IBEROÁMERICA
staticint[] BubbleSort(int[] numbers)
{
Tome Nota
bool swapped;
Cuando se utiliza
el ordenamiento
de burbuja puede
do
ETC
asegurarse que
{
un arreglo estará
ordenado en un paso
swapped = false;
menos que el número
for (int i = 0; i <numbers.Length - 1; i++)
de ítems. De manera
que si hay cuatro
{
ítems, como se ilustró
if (numbers[i] > numbers[i + 1])
arriba, el arreglo será
ordenado (sin importar
{
en qué orden empieza)
//swap
en tres pasadas.
Desarrollo General de Software
91
int temp = numbers[i + 1];
numbers[i + 1] = numbers[i];
numbers[i] = temp;
swapped = true;
}
}
} while (swapped == true);
return numbers;
}
Ordenamiento Rápido (QuickSort)
El algoritmo de ordenamiento rápido utiliza las operaciones de partición y comparación para o
de una lista en el orden correcto.
El algoritmo de ordenamiento rápido utiliza la técnica de divide y conquista para
particionar continuamente una lista hasta que el tamaño del problema sea realmente
pequeño y difícilmente requiera algún ordenamiento. Los siguientes pasos explican esto
más a detalle:
• Un lista de tamaño cero o uno siempre es ordenada por sí misma.
www.pdftron.com
• Para una lista más grande, puede elegir algún elemento como elemento pivote.
Luego particionar la lista de tal manera que todos los elementos más pequeños
que o iguales al elemento pivote van a la lista izquierda y todos los elementos más
grandes que el elemento pivote van a la lista derecha. Ahora la combinación de la
lista izquierda, el elemento pivote y la lista derecha están ordenadas.
• El problema ahora se particiona en dos listas más pequeñas, la lista de la izquierda
y la lista de la derecha.
• Ambas listas pueden ser resueltas utilizando la técnica descrita en las viñetas
anteriores.
IBEROÁMERICA
• Finalmente, unir todas las pequeñas listas ordenadas con el fn de crear la lista
ordenada completa.
La siguiente tabla explica el algoritmo de ordenamiento rápido con un pequeño ejemplo.
Tabla 3-4
Paso
Datos a ser ordenados
Comentarios
ETC
Visualizando el
ordenamiento rápido
1.
50, 10, 30, 20, 40
Inicia con una lista no ordenada y elige
un elemento pivote, en este caso 30.
2.
20, 10
30
50, 40
Partición de la lista: los ítems menores
al pivote van a la lista izquierda y los
ítems más grandes que el pivote van a
la lista derecha. Para ordenar la lista
izquierda. Elija un pivote (10). Para
ordenar la lista derecha, seleccione
un pivote (40) para la lista derecha.

92
Lección 3
3.
-
10
20
30
-
40
50
En la lista izquierda, 20 es mayor que
10 y 50 es más grande que 40, por lo
tanto ambos van en la lista derecha.
Nos quedan listas con solo un número,
las cuales por definición están
ordenadas.
4.
10, 20, 30, 40, 50
La lista unida final es la lista ordenada.
El defecto principal del algoritmo descrito podría parecer la memoria adicional requerida
por la creación de listas más pequeñas separadas. Sin embargo, crear listas separadas
no es necesario. Utilizando una técnica ligeramente modifcada, el arreglo puede ser
particionado, como se muestra en el siguiente código:
staticint Partition (int[] numbers, int left,
int right, intpivotIndex)
{
intpivotValue = numbers[pivotIndex];
// se mueve el elemento pivote al fnal
int temp = numbers[right];
numbers[right] = numbers[pivotIndex];
numbers[pivotIndex] = temp;
// newPivot almacena el indice del primer número
// mayor que el pivote
www.pdftron.com
intnewPivot = left;
for (int i = left; i < right; i++)
{
if (numbers[i] <= pivotValue)
{
temp = numbers[newPivot];
numbers[newPivot] = numbers[i];
IBEROÁMERICA
numbers[i] = temp;
newPivot++;
}
}
ETC //mueve el elemento pivote a su posición //almacenada
temp = numbers[right];
numbers[right] = numbers[newPivot];
numbers[newPivot] = temp;
returnnewPivot;
}
En esta técnica, primero el elemento pivote es movido al fnal del arreglo. Luego todos

Desarrollo General de Software


93
los elementos menores que o iguales al elemento pivote son movidos al frente del arreglo.
Finalmente, el elemento pivote es ubicado justo antes del elemento más grande que él,
efectivamente particionando el arreglo.
Este algoritmo de partición puede entonces ser utilizado por el ordenamiento rápido para
particionar la lista, reducir el problema en problemas más pequeños y entonces lo resuelve
recursivamente:
staticint[] QuickSort(int[] numbers,
int left, int right)
{
if (right > left)
{
intpivotIndex = left + (right - left) / 2;
//particiona el vector
pivotIndex= Partition(
numbers, left, right, pivotIndex);
//ordena la partición izquierda
QuickSort(
numbers, left, pivotIndex - 1);
// ordena la partición derecha
QuickSort(
; ¿Listo para la
numbers, pivotIndex + 1, right);
certificación?
}
www.pdftron.com
¿Comprende los
return numbers;
algoritmos de
ordenamiento
}
comunes? — USD 3.3
Debido al enfoque de partición, el algoritmo de ordenamiento rápido, es mucho más
rápido que el algoritmo de ordenamiento de burbuja.
IBEROÁMERICA
ETC

94
Lección 3
Resumen de matriz de habilidades
En esta lección aprendió:
• La administración del ciclo de vida de aplicación son las distintas actividades que
giran alrededor de un nuevo producto de software desde su comienzo a cuando el
producto de software madura y tal vez se retira.
• La prueba de software es el proceso de verifcar el software contra sus requerimientos.
Las pruebas toman lugar después que la mayoría del trabajo de desarrollo está
completado.
• Las estructuras de datos son técnicas de organización y almacenamiento de datos
en la memoria de la computadora. Como los datos son almacenados afecta cómo
son recuperados y manipulados. Comprender una estructura de datos involucra
comprender no solo el patrón de almacenamiento sino también los métodos
utilizados para crear, acceder y manipular la estructura de datos.
• Un arreglo es una colección de ítems, del mismo tipo de datos, almacenados en
ubicaciones de memoria contiguas y direccionadas utilizando uno o más índices.
• Una cola es una colección de ítems que permite operaciones tales que el primer
ítem agregado a la colección es el primero en ser removido.
• Una pila es una colección de ítems que permite operaciones tales que el ultimo
ítem agregado a la colección es el primero en ser removido.
• Una lista enlazada es una colección de nodos ordenados de tal manera que cada
nodo contiene un enlace al siguiente nodo en la secuencia.
• El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de
comparación e intercambio para ordenar los elementos en una lista en el orden
www.pdftron.com
correcto.
• El algoritmo de ordenamiento rápido utiliza las operaciones de partición y
comparación para ordenar los elementos de una lista en el orden correcto.

» Evaluación de Conocimientos
Llene los Espacios en Blanco
IBEROÁMERICA
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
1. En la prueba de________, los testers utilizan sus conocimientos del sistema interno
para probar el sistema.
2. Con cada nueva reparación, los testers de software ejecutan una serie de ______ para
ETC asegurarse que la funcionalidad que se sabía que funcionaba aun funciona.
3. El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de ______ y
______ para ordenar los elementos de una lista en el orden correcto.
4. Una ______ es una colección de ítems que permite operaciones tales que el ultimo
ítem agregado a la colección es el primero en ser removido.
5. El______ es el proceso de determinar los requerimientos detallados del negocio para
un nuevo sistema de software.
6. Una lista enlazada es una colección de nodos tales que cada nodo contiene un ____ al
Comprender los conceptos básicos de bases de datos
95
siguiente nodo en la secuencia.
7. La operación______agrega un ítem a la cola mientras que la operación ______remueve
un ítem desde una cola.
8. El algoritmo de ordenamiento rápido utiliza las operaciones de ______ y comparación
para ordenar los elementos de una lista en el orden correcto.
9. Un ______ es responsable de analizar las necesidades del negocio y convertirlas en
requerimientos que pueden ser ejecutados por el equipo de desarrollo.
10. Tanto la prueba Alfa y la prueba Beta son parte de las pruebas de ______de un sistema.
Elección Múltiple
Encierre en un círculo la letra que corresponda a la mejor respuesta.
1. El producto que está desarrollando aún no está terminado, pero le gustaría liberar el
producto a una audiencia de clientes más amplia para su retroalimentación y pruebas.
¿Bajo cuál de los siguientes niveles de pruebas caerá esta actividad?
a. Prueba de Integración
b. Prueba de Sistema
c. Prueba de Aceptación
d. Prueba de Regresión
2. Los testers del software tienen acceso a su código fuente. Los testers necesitan escribir
casos de prueba que garanticen que el método retorna valores correctos. ¿En cuál de los
siguientes niveles de pruebas caerá esta actividad?
www.pdftron.com
a. Prueba de Integración
b. Prueba de Unidad
c. Prueba Alfa
d. Prueba Beta
3. ¿Cuál de las siguientes estructuras de datos permite acceso directo a todos sus ítems?
a. Arreglo
b. Pila
IBEROÁMERICA
c. Cola
d. Lista enlazada
4. ¿Cuál de las siguientes actividades en el ciclo de vida de aplicación es utilizado por un
arquitecto para crear el proyecto técnico del sistema?
a. Análisis de requerimientos
b. Diseño
ETC c. Desarrollod. Mantenimiento
5. En su aplicación, usted está utilizando una estructura de datos de cola para manipular
datos. Necesita encontrar cuál ítem de datos será procesado después, pero no desea
realmente procesar los ítems aun. ¿Cuál de las siguientes operaciones de la cola
utilizará?.
a. Enqueue
b. Dequeue

96
Lección 3
c. Peek
d. Contains
6. Está desarrollando un programa que requiere que registre los llamados de método.
Puede invocar solo un método a la vez. Sin embargo, un llamado de método puede a su
vez invocar a otros métodos. Cuando un método termina y retorna el control al método
que lo llama. ¿Cuál estructura utilizará para registrar estos llamados de método?.
a. Cola
b. Arreglo
c. Lista enlazada
d. Pila
7. Está desarrollando un programa que simula una cola de trabajo. A menudo los trabajos
se hacen más rápidos de lo que puede procesarlos y en ese caso los trabajos esperan su
turno para ser procesados. Necesita asegurarse que el trabajo que llega primero es el
que se procesa primero también. ¿Cuál de las siguientes estructuras de datos es más
adecuada para este requerimiento?
a. Arreglo
b. Cola
c. Lista enlazada
d. Pila
8. Usted escribe el siguiente código en su programa:
a. int[] numbers = {2, 3, 1, 4};
b. numbers[2] = 4;
9. ¿Cuáles serán los contenidos del arreglo después de que la segunda sentencia es
www.pdftron.com
ejecutada?.
a. {2, 4, 1, 4}
b. {2, 3, 4, 4}
c. {2, 4, 1, 2}
d. {4, 3, 1, 4}
10. Está desarrollando un programa que desempeña operaciones de insertar y eliminar
frecuentes en los datos. Su requerimiento también dicta una capacidad para acceder a
registros previos y siguientes cuando el usuario presiona el botón de previo o siguiente.
IBEROÁMERICA
¿Cuál de las siguientes estructuras de datos se ajustará mejor a sus requerimientos?.
a. Arreglo
b. Lista enlazada circular
c. Lista enlazada
d. Lista doblemente enlazada
11. Está desarrollando un programa que desempeña operaciones de insertar y eliminar
ETC frecuentes en los datos. los datos necesitan ser accedidos como una pila con la
funcionalidad del último que entra es el primero que sale. Su solución debe requerir
tan poca memoria como sea posible. ¿Cuál de las siguientes estructuras de datos se
ajustará mejor a sus requerimientos?.
a. Arreglo
b. Lista enlazada circular
c. Lista enlazada
d. Lista doblemente enlazada

Comprender los conceptos básicos de bases de datos


97

» Evaluación de Competencia
Caso 3-1: Utilizando Arreglos
Está escribiendo un programa que utiliza un arreglo bidimensional. El arreglo tiene cuatro
flas cinco columnas. Necesita imprimir el elemento mayor en cada fla del arreglo. ¿Cómo
escribiría tal programa?.
Proyecto 3-2: Utilizando Colas
Está escribiendo un programa que utiliza dos colas. Los datos en cada cola ya están en
orden ascendente. Necesita procesar el contenido de ambas colas de tal manera en que la
salida sea impresa en la pantalla ordenada. ¿Cómo escribiría tal programa?.

» Evaluación de Competencia
Proyecto 3-3: Utilizando Pilas
Está escribiendo un programa que utiliza dos pilas. Los datos en cada pila ya están en
orden descendiente. Necesita procesar el contenido de ambas pilas de tal manera que la
salida sea impresa en la pantalla en orden ascendente. ¿Cómo escribiría tal programa?.
Proyecto 3-4: Utilizando Listas Enlazadas
Está escribiendo un programa que almacena la lista de nombres de productos en una lista
www.pdftron.com
enlazada. El usuario introducirá un nombre de producto y un programa necesita verifcar
si la lista enlazada contiene el producto dado. ¿Cómo escribiría tal programa?.
IBEROÁMERICA
ETC

98
Lección 3
www.pdftron.com
IBEROÁMERICA
ETC

Lección 4
Comprender las Aplicaciones Web
Matriz de Dominio de Objetivos
Habilidad Tecnológica
Descripción del Dominio de Objetivo
Número del Dominio
del Objetivo
Comprender el Desarrollo de una Página Web
Comprender el Desarrollo de una Página
4.1
Web
Comprender el Desarrollo de una Aplicación
Comprender el desarrollo de una aplicación 4.2
ASP.NET
Web del Microsoft ASP.NET
Comprender el IIS Web Hosting
Comprender el Web hosting
4.3
Comprender el Desarrollo de Servicios Web
Comprender los servicios Web
4.4
Términos Clave
• Hojas de estilo en cascada (CSS)
(IIS)
• Servicio Web
• Lenguaje de Marcado de Hipertexto
• JavaScript
• Lenguaje de Defnición de Servicio
(HTML)
• SOAP
Web (WSDL)
• Servicios de Información de Internet
• Administración de estado
www.pdftron.com
IBEROÁMERICA
Como desarrollador de una gran empresa necesita desplegar aplicaciones que se puedan utiliza
través de redes como la World Wide Web. La aplicación será desplegada en un servidor Web d
Windows pero sus usuarios utilizarán múltiples sistemas operativos y navegadores Web.
ETC

100
Lección 4
� Comprender el Desarrollo de una Página Web
È EN RESUMEN
Una página Web es un documento que es servido a través de la World Wide Web (WWW) y q
a través de un navegador Web. Las páginas Web se desarrollan utilizando el Lenguaje de Marc
(HTML) y se almacenan en un servidor Web. Los navegadores Web descargan el HTML solic
y lo interpretan en la pantalla del usuario.
La World Wide Web (también conocida como WWW o “la Web”) es un sistema de
documentos de hipertexto interconectados y otros recursos tales como imágenes y video
que se pueden acceder vía internet. Tecnologías múltiples trabajan juntas para hacer
posible la WWW. Discutiremos dos de estas tecnologías en esta sección:
• Protocolo de Transferencia de Hipertexto (HTTP)
• Lenguaje de Marcado de Hipertexto (HTML)
HTTP es el protocolo de comunicación fundamental utilizado por la World Wide Web.
HTTP proporciona el lenguaje común que los servidores Web y los navegadores Web
utilizan con el fn de comunicarse.
HTTP utiliza el Localizador de Recurso Uniforme (URL) para identifcar únicamente y
direcciona cada recurso en Internet. Una URL es esencialmente una dirección Web y se
parece a esto: http://www.microsoft.com/en/us/default.aspx. Cada URL inicia con un
protocolo. En este ejemplo, el protocolo es HTTP. También notará el protocolo HTTPS
(HTTP Seguro) en uso para asegurar aplicaciones donde los datos necesitan ser cifrados
antes de que puedan ser transmitidos a través de la red. La siguiente parte de la URL es la
www.pdftron.com
dirección del servidor Web: (www.microsoft.com), seguido por el localizador del recurso
dentro del servidor Web (/en/us/), y fnalmente el propio recurso solicitado (default.aspx).
Cada documento, imagen, video y otros recursos en la Web es identifcado por una URL.
Cuando un navegador envía una solicitud HTTP para una página Web a un servidor Web
(tanto la página y el servidor Web son identifcados por una URL), el servidor prepara una
respuesta HTTP para el navegador. Esta respuesta especifca el contenido y presentación
Tome Nota
de la página Web.
Los términos “Internet”
IBEROÁMERICA
y “la Web” son
El lenguaje que el servidor Web y el navegador Web utilizan para describir una página
comúnmente utilizados
Web es el Lenguaje de Marcado de Hipertexto (HTML). HTML es un lenguaje basado
de forma indistinta
en texto que utiliza varias etiquetas de marcado describiendo como el contenido es
pero son en realidad
desplegado. HTML permite que imágenes, videos y otros objetos sean referenciados en
diferentes y no deben
un archivo para crear páginas Web multimedia. HTML puede incrustar scripts tales como
confundirse entre sí. El
JavaScript que afecta el comportamiento de las páginas Web. HTML también puede ser
Internet es un sistema
utilizado para incluir hojas de estilo en cascada (CSS) para defnir el formato y presentación
de comunicaciones
ETC del contenido de una página. El navegador Web lee el código HTML e interpreta los
de datos global
resultados en la pantalla.
que proporciona
conectividad entre
Una página Web puede contener hipervínculos a otros recursos tales como imágenes
computadoras. En
y videos. Cada uno de estos recursos es identifcado por su propia URL. Con el fn de
contraste, la Web es
interpretar completamente una página, el navegador hará solicitudes HTTP adicionales
uno de los servicios
para obtener esos recursos y desplegarlos como parte de la página Web.
disponibles en Internet
que nos permite
En las siguientes secciones, aprenderá más acerca de varios componentes que conforman
acceder a recursos
una página Web tales como HTML, CSS y JavaScript.
hiper vinculados.

Comprender las Aplicaciones Web


101
Comprender HTML
El Lenguaje de Marcado de Hipertexto (HTML) es el lenguaje utilizado por los servidores y n
describir una página Web.
El propósito de HTML es proporcionar un lenguaje estándar para describir páginas Web de
forma que diferentes navegadores Web pueden comprenderlo y desplegar las páginas Web.
Tome Nota
HTML es un lenguaje basado en texto, lo cual signifca que puede escribir y editar paginas
HTML está basado
HTML utilizando cualquier editor de texto. Cuando HTML es enviado al navegador Web,
en texto. HTML
la mayoría de los navegadores le permiten visualizar el código fuente HTML de la página.
utiliza etiquetas para
incrustar imágenes,
HTML consiste de un conjunto de etiquetas (también llamadas elementos HTML)
audio, video y otros
que defnen la estructura y contenido de una página. Por ejemplo, la etiqueta <html>
muchos tipos de
especifca el inicio del documento HTML. Las etiquetas HTML siempre son rodeadas por
multimedia y contenido
paréntesis angulares. Las etiquetas HTML siempre se utilizan en pares. Cada inicio de
interactivo en la
etiqueta tiene una etiqueta par al fnal. Las etiquetas fnales tienen un slash que indica que
página.
es una etiqueta de fnal. Por ejemplo, la etiqueta de fnal para <html>es </html>.
Una página HTML consta de dos partes: un encabezado y un cuerpo. El encabezado es
encerrado dentro de las etiquetas <head>y</head>y es utilizado para proporcionar un
título al documento y vínculos a ítems externos que pueden ser utilizados en la página,
tales como archivos CSS y archivos de JavaScript. El cuerpo es encerrado dentro de las
etiquetas <body>y</body> y es utilizado para proporcionar la estructura complete y
contenido de la página que será desplegada dentro del navegador Web.
Este es un ejemplo de una etiqueta que despliega una imagen:
Tome Nota
Note que el documento
<img height=”400px” width=”400px”
www.pdftron.com
HTML no contiene
la imagen en sí.
alt=”Mimas Cassini” src=
La etiqueta img
específica la URL de
“http://upload.wikimedia.org/wikipedia/commons/b/bc/Mimas_
la imagen, la cual el
Cassini.jpg”/>
navegador descarga
separadamente y la
La etiqueta <img> especifca atributos adicionales. Por ejemplo, el atributo src especifca
interpreta como parte
la ubicación del archivo de imagen, y los atributos height y width especifcan qué
de la página.
IBEROÁMERICA
dimensiones utilizar cuando se interpreta la imagen en el navegador.
Este es otro ejemplo de una etiqueta HTML:
<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>
Saturn’s moon</a>
ETC Aquí, <a> es la etiqueta de anclaje, la cual es utilizada para crear hipervínculos en la
página Web. El atributo href especifca la URL objetivo y el texto dentro de los paréntesis
Tome Nota
angulares es el que es mostrado como un enlace.
Esta lección no cubre
todos los elementos
Tome los pasos en el siguiente ejercicio para crear un documento HTML.
HTML. Para aprender
más sobre elementos
HTML, busque
“Elementos HTML” en
el MSDN.
102
Lección 4
Æ Trabajar con HTML
PREPÁRESE. Para crear un documento HTML, haga lo siguiente:
1. Abra el Visual Studio. Crear un Nuevo proyecto basado en la plantilla de aplicación web
vacía de ASP.NET. Nombre al proyecto TrabajandoConHTML y nombre la solución Leccion0
2. Seleccione Proyecto, Agregar Nuevo Ítem, y seleccione la platilla de Pagina HTML. Nomb
el archivo default.htm.
3. Remplace el código por defecto en el archivo HTML con el siguiente código:
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Saturn’s Moon</title>
</head>
<body>
<h1>Mimas Cassini</h1>
La etiqueta img es utilizada para mostrar la imagen de
<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>
Saturn’s moon</a>: <br />
<img height=”400px” width=”400px”
alt=”Mimas Cassini”
src=”http://goo.gl/3BeK”/>
www.pdftron.com
</body>
</html>
4. Seleccione Depurar y después Inicie la Depuración (o presione F5). La páginadefault.htm s
abrirá en un navegador Web. Note que la salida se parece a la figura 4-
1, donde puede ver
las etiquetas <img>y<a>en acción.
Figura 4-1
Una página HTML simple
IBEROÁMERICA
con una imagen y un
hipervínculo.
ETC

Comprender las Aplicaciones Web


103
Comprender las Hojas de Estilo en Cascada
Las hojas de estilo en cascada (CSS) le permiten almacenar el estilo e información se
Esta separación hace más fácil el actualizar la apariencia de su sitio Web. Visual Studio incluy
construir y pre visualizar sus hojas de estilo.
CSS es un lenguaje que describe toda la información acerca de mostrar una página
Web. Cuando se interpreta páginas Web en un navegador, HTML especifca lo que será
mostrado. Por ejemplo, HTML puede especifcar que su documento tiene un encabezado
H1 con un texto dado, mientras CSS puede especifcar la fuente y el color que serán
aplicados al encabezado H1.
CSS le permite separar la presentación de una página Web de su contenido. Esta separación
le permite cambiar uno sin afectar a otro. Mezclar el contenido y el estilo juntos reduce la
posibilidad de mantenimiento de un sitio Web. Por ejemplo, digamos que quiere cambiar
el color y fuente de todos los encabezados de H1 en su sitio Web. Un enfoque podría ser
abrir un editor HTML y modifcar cada archivo en el sitio Web que utiliza la etiqueta
H1. Esto podría ser una solución aceptable si el sitio Web tiene solo una o dos páginas,
pero ¿y si el sitio web tiene un gran número de páginas, digamos 50 o 100? Imagine
cambiar manualmente cada página. Si tal cambio es solicitado muy a menudo, el proceso
Tome Nota
de desarrollo Web será muy tedioso y propenso a errores (¿Cómo garantiza que no omitió
Cuando se utiliza
ninguna etiqueta?).
efectivamente, CSS es
una gran herramienta
Afortunadamente, con CSS puede poner toda la información de estilo en un archivo
para incrementar la
separado y conectar todas las páginas Web en un sitio Web con el archivo CSS. Una vez
consistencia del ancho
que está confgurado, para modifcar cualquier estilo (tal como el color y fuente de los
del sitio y la posibilidad
encabezados H1), simplemente cambia el estilo en el archivo CSS, un simple cambio
de mantenimiento.
afectará todas las páginas en el sitio Web.
www.pdftron.com
Diseño de Hojas de Estilo en Cascada
El lenguaje CSS está basado en texto y es fácil de leer y entender. A continuación se
muestra un ejemplo de una página HTML que defne estilo CSS:
<html xmlns=”http://www.w3.org/1999/xhtml”>
IBEROÁMERICA
<head runat=”server”>
<title>Comprendiendo CSS</title>
<style type=”text/css”>
body
ETC { font-family: Verdana;
font-size: 9pt;
}
div

104
Lección 4
{
color:Red;
}
.block
{
background-color: Yellow;
border-color: Blue;
border-width: thin;
border-style: outset;
font-family: Arial;
}
</style>
</head>
<body>
www.pdftron.com
Sample body text <br />
<div>Sample DIV text</div>
<div class=”block”>Sample DIV text
with block class</div>
<span class=”block”>Sample SPAN text
IBEROÁMERICA
with block class</span>
</body>
</html>
ETC Las defniciones CSS deben estar dentro del elemento <style> y son defnidos bajo el
elemento <head>. Este CSS defne dos estilos de elemento y un estilo de clase. El primer
estilo aplica al elemento cuerpo HTML y especifca que todo el texto en el elemento
cuerpo debería utilizar la fuente Verdana con tamaño de fuente 9 pt. El segundo elemento
de estilo especifca que el texto dentro del elemento DIV será escrito en rojo. Finalmente,
una clase llamada “block” es defnida. Las defniciones de clase de CSS son prefjadas
con un punto (“.”). Los contenidos de cualquier elemento HTML que utilice esta clase
será mostrado con fondo Amarillo y un borde. Cuando muestra la página de arriba en el
navegador, se parecerá a lo mostrado en la Figura 4-2.

Comprender las Aplicaciones Web


105
Figura 4-2
Formateando HTML
con hojas de estilo en
cascada
Note que el texto resaltado es mostrado como resultado de la clase block. Pero la clase
CSS block no especifca el color del texto. En el primer texto resaltado, la clase block
es aplicada al elemento DIV, en el segundo texto resaltado, la clase block es aplicada al
elemento SPAN. En el primer caso, como la clase block es aplicada al texto DIV, el estilo
de color del elemento DIV es llevado a la interpretación fnal.
En el ejemplo previo, el archivo CSS fue escrito dentro de HTML. Una aproximación
más útil es escribir el CSS en un archivo separado por su cuenta y luego enlazar el archivo
HTML al archivo CSS. Aprenderá como hacer esto en el siguiente ejercicio.
Æ Trabajar con Archivos CSS
www.pdftron.com
PREPÁRESE. Para escribir el archivo CSS y enlazar a un archivo HTML, haga
lo siguiente:
1. Agregue un Nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto ComprendiendoCSS.
2. Seleccione Proyecto y después Agregar nuevo elemento. Seleccione la plantilla de Hoja de
Estilo. Nombre el archivo estilos .css. Remplace el código por defecto en el archivo c
siguiente código:
IBEROÁMERICA
body
{
font-family: Verdana;
font-size: 9pt;
}
ETC div { color:Red;
}
.block
{
background-color: Yellow;

106
Lección 4
border-color: Blue;
border-width: thin;
border-style: outset;
font-family: Arial;
}
3. Seleccione Proyecto, después Agregar nuevo elemento y seleccione la plantilla de Página
HTML. Nombre el archivo default.htm. Remplace el código por defecto en el archivo con el
siguiente código:
<!DOCTYPE html PUBLIC
“-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<link rel=”STYLESHEET”
type=”text/css” href=”styles.css” />
<title>Understanding CSS</title>
</head>
<body>
Sample body text <br />
<div>Sample DIV text</div>
www.pdftron.com
<div class=”block”>Sample DIV text
with block class</div>
<span class=”block”>Sample SPAN text
with block class</span>
</body>
</html>
IBEROÁMERICA
4. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm s
abrirá en un navegador Web. Note que la salida es similar a la Figura4-2.
El elemento HTML <link>es utilizado para enlazar el archivo CSS con la página HTML:
Tome Nota
<link rel=”STYLESHEET”
Cuando el CSS es
type=”text/css” href=”styles.css” />
almacenado en
ETC
archivos separados, el
El elemento <link> siempre se pone dentro del elemento <head>. El atributo href
navegador del usuario
especifca la dirección del archivo CSS a utilizar. Para enlazar múltiples páginas con un
descargará y los
archivo CSS, necesitará poner el elemento <link>dentro de cada página HTML.
almacenará localmente.
Aunque pueden ser
Visual Studio incluye un diseñador de estilo integrado que puede ayudarle en el diseño de
utilizados en múltiples
nuevos estilos CSS o para modifcar estilos existentes. Cuando abre un archivo .css, verá
paginas sin ninguna
un Nuevo menú llamado Styles. Puede crear un nuevo estilo seleccionando Styles, Add
necesidad de volver
Style Rule. También puede modifcar el estilo seleccionado actualmente seleccionando
a descargarlos, esto
Styles, Build Style option. Esta opción abre el editor de Modify Style como se muestra en
reduce la transferencia
la Figura 4-3.
de datos innecesaria.

Comprender las Aplicaciones Web


107
Figura 4-3
El cuadro de diálogo
Modify Style
Comprender JavaScript
JavaScript es un lenguaje de scripting de lado del cliente que se ejecuta dentro de un navegado
crear páginas Web mucho más interactivas de lo que es posible utilizando sólo HTML plano. J
en millones de páginas Web y es soportado por todos los navegadores Web modernos.
www.pdftron.com
JavaScript es utilizado para hacer sitios Web más sensibles y páginas Web más interactivas.
JavaScript lleva a cabo esto ejecutando el código en el lado del cliente (el navegador Web)
Tome Nota
y minimizando las idas y vueltas innecesarias al y del servidor. Tomemos un ejemplo en
Muchos sitios
el cual un usuario necesita introducir detalles personales tales como el nombre, dirección
Web modernos
de correo electrónico y número de teléfono. Un requerimiento común es desempeñar
proporcionan una
validación de datos para garantizar que los campos introducidos no están vacíos y que la
experiencia altamente
dirección de correo electrónico y el número de teléfono están en el formato requerido. Sin
interactiva que rivaliza
JavaScript, necesitaría entregar el formato al servidor, el cual desempeñará la validación de
con aplicaciones
IBEROÁMERICA
datos y retornará los resultados al cliente. Esta transmisión de información toma tiempo
de escritorio. Tales
y degrada la experiencia del usuario. Una solución de JavaScript puede desempeñar este
aplicaciones pueden
tipo de validación de datos dentro del navegador, proporcionando una mejor experiencia
ser desarrolladas
al usuario.
utilizando la
programación Ajax.
El código de JavaScript se ejecuta localmente dentro del navegador Web (el cliente), como
Ajax es una abreviatura
opuesto al servidor Web. Aunque JavaScript también algunas veces es llamado como
para XML y JavaScript
lenguaje de scripting del lado del cliente y con JavaScript es llamado programación del
ETC
Asíncrono. Ajax utiliza
lado del cliente.
extensivamente el
JavaScript con el
El comportamiento del tiempo de ejecución de la ejecución de código del lado del cliente
fin de proporcionar
depende del navegador que lo ejecuta. Sin embargo, es independiente de la tecnología del
aplicaciones Web
servidor o la estructura de programación. Para la ejecución de JavaScript en un navegador
sensibles. ElASP.NET
Web, no importa si la página Web fue generada por ASP.NET o PHP o si la página está
AJAX framework le
siendo servida por un servidor Web de Windows o un servidor Web de Linux.
permite implementar la
funcionalidad de Ajax
en páginas Web de
JavaScript y el lenguaje de programación C# utilizan una sintaxis infuida por el lenguaje de
ASP.NET.
programación C. sin embargo, JavaScript y C# son muy diferentes en como son ejecutados.

108
Lección 4
JavaScript es ejecutado por el navegador Web. El código de JavaScript es interpretado en
lugar de ser compilado, como en el caso de C#.
Todo el código de JavaScript debe ser ubicado dentro del elemento <script>. El elemento
<script> esta generalmente dentro del elemento <head>, aunque no se requiere. Se le
permite tener múltiples elementos <script> dentro de una página. Para ver el JavaScript
en acción, tome los siguientes pasos:
Æ Trabajar con JavaScript
PREPÁRESE. Para comenzar a trabajar con JavaScript, realice las siguientes
tareas:
1. Agregar un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto ComprendiendoJavaScript.
2. Seleccione Proyecto, después Agregar nuevo elemento y seleccione la plantilla de Pagina
HTML. Nombre el archivodefault.htm. Remplace el código por defecto en el archivo c
siguiente código:
<!DOCTYPE html PUBLIC
“-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Comprendiendo JavaScript</title>
www.pdftron.com
<script type=”text/javascript”
language=”javascript”>
username = prompt(“Introduzca su Nombre”);
message = “Hola, “ + username +
“. Su nombre tiene “;
nameLen = username.length;
IBEROÁMERICA
if (nameLen > 5)
message = message + “mas de “;
else if (nameLen < 5)
message = message + “menos de “;
else
ETC message = message + “exactamente “;
message = message + “5 caracteres.”;
alert(message);
</script>
</head>
<body>
</body>
</html>

Comprender las Aplicaciones Web


109
3. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm
se abrirá en un navegador Web. Note que el código de JavaScript le pide que introduzca su
nombre. El siguiente diálogo muestra un mensaje basado en la longitud del nombre introducid
como se muestra en las Figuras 4-4 y 4-5.
Figura 4-4
Petición al Usuario de
JavaScript
Figura 4-5
Cuadro de diálogo de
JavaScript
www.pdftron.com
Como con los archivos CSS, también puede poner su código de JavaScript en un archivo
separado y enlazar el archivo de JavaScript con el archivo HTML utilizando el elemento
script, como se muestra abajo:
<script src=”SampleScript.js”>
</script>
IBEROÁMERICA
Aquí el archivoSampleScript.js contiene todo el código de JavaScript y el elemento
Tome Nota
script enlaza a este archivo utilizando el atributo src. Almacenar el JavaScript en archivos
Aunque todos
externos ofrece muchas ventajas:
los navegadores
modernos soportan el
• Mayor facilidad de mantenimiento: Si utiliza el mismo código de JavaScript en
JavaScript, pueden
cada página, puede almacenar el código en una página central en lugar de repetirlo
ETC
ser configurados
en todas las páginas. Cuando es hora de modifcar el código de JavaScript, tendrá
para desactivar el
que cambiar el código sólo en un lugar.
JavaScript. Algunos
• Mejora del rendimiento: Almacenar código en un archivo separado reduce el
usuarios desactivan
tamaño de la página Web. También, el navegador puede descargar y almacenar en
el JavaScript. Puede
cache el archivo de JavaScript externo de forma que no es descargado de nuevo a
utilizar un elemento
menos que sea modifcado.
<noscript>para mostrar
un mensaje específico
Visual Studio incluye soporte complete de IntelliSense para código de JavaScript. Incluso
a los usuarios quienes
los controles ASP.NET, como el control TreeView o los controles de validación, utiliza
no están ejecutando
JavaScript donde es posible interpretar contenido dinámicamente.
JavaScript.

110
Lección 4
Programación del lado del cliente vs. lado del servidor
Si un programa es de lado del cliente o lado del servidor depende de donde se ejecuta el progr
La programación del lado del cliente se refere a los programas que se ejecutan
completamente en la computadora local del usuario. Los ejemplos de programas del lado
del cliente son la aplicación de Formularios de Windows y el código de JavaScript que
se ejecuta dentro del navegador Web. Los programas del lado del cliente no consumen
recursos del servidor.
Por otro lado, la programación del lado del servidor se refere a los programas que son
ejecutados completamente en el servidor y que hacen uso de los recursos computacionales
del servidor. Los únicos recursos del cliente utilizados son involucrados en realmente
recuperar los resultados de procesamiento del servidor. Las aplicaciones Web y los servicios
Web son un ejemplo de la programación del lado del servidor. La programación del lado
del servidor utiliza una tecnología del lado del servidor tal como ASP.NET, PHP, o Ruby
on Rails.
Las aplicaciones hibridas que utilizan tanto programación del lado del cliente y del lado
del servidor se han hecho cada vez más populares. Puede diseñar aplicaciones de cliente
; ¿Listo para la
inteligente que se ejecutan localmente en las computadoras cliente pero que hacen uso de
certificación?
servicios Web para llevar a cabo ciertas tareas. Las aplicaciones Ajax utilizan una mezcla
de programación del lado del servidor y código del lado del cliente para crear aplicaciones
¿Comprende cómo
Web interactivas y altamente sensibles.
utilizar HTML,
JavaScript y CSS
para el desarrollo
ASP.NET le permite crear aplicaciones que se ejecutan completamente en el servidor
de una página W
o
eb?
aplicaciones Ajax hibridas que proporcionan interfaces rápidas sensible mientras que
— USD 4.1
almacenan la mayoría de la información en la Web.
www.pdftron.com

� Comprender el desarrollo de una aplicación de ASP.
NET
È EN RESUMEN
IBEROÁMERICA
ASP.NET es la parte del .NET Framework que le permite desarrollar formularios Web program
Web. Como con cualquier aplicación de .NET Framework, puede desarrollar aplicaciones ASP
lenguaje que sea compatible con el tiempo de ejecución en.NET, incluyendo Visual Basic y C#
La infraestructura de ASP.NET tiene dos partes principales:
• Un conjunto de clases e interfaces que permite la comunicación entre el navegador
ETC Web y el servidor Web. Estas clases están organizadas en el espacio de nombres
System.Web.
• Un proceso en tiempo de ejecución, también conocido como el proceso trabajador
de ASP.NET (aspnet_wp.exe), que maneja la solicitud Web para recursos de ASP.
NET.
En un nivel alto, una aplicación Web de ASP.NET es ejecutada a través de una serie de
solicitudes y mensajes de respuesta de HTTP entre los navegadores cliente y los servidores
Web. El proceso ocurre como sigue:

Comprender las Aplicaciones Web


111
1. El usuario solicita un recurso del servidor Web tecleando una URL en el navegador Web. El
navegador envía una solicitud HTTP al servidor Web destino.
2. El servidor Web analiza la solicitud HTTP y busca el proceso capaz de
ejecutar la solicitud.
3. El resultado de la solicitud HTTP es retornada al navegador cliente en la forma de
respuesta HTTP.
4. El navegador lee la respuesta HTTP y la interpreta como una página Web para
el usuario.
Este proceso está representado en la Figura 4-6.
Solicitud HTTP

Respuesta HTTP
Como desarrollador, estará interesado en conocer lo que sucede tras bambalinas cuando un
servidor Web ejecuta una solicitud para una página ASP.NET. La siguiente lista describe
el proceso:
5. Cuando el Servicio de Información de Internet (IIS) recibe una solicitud HTTP, util
extensión del nombre del archivo para determinar qué programa de interfaz de programación
de aplicación (ISAPI) del servidor ejecutar para procesar la solicitud. Cuando la solicitud es
para una página ASP.NET, pasa la solicitud al ISAPI DLL capaz de manejar las solicitudes
para páginas de ASP.NET, el cual es aspnet_isapi.dll.
www.pdftron.com
Tome Nota
6. El proceso aspnet_isapi.dll pasa la solicitud al proceso trabajador de ASP.NET (aspnet_
La clase Page
wp.exe), el cual cumple la solicitud.
proporciona algunos
métodos y propiedades
7. El proceso trabajador de ASP.NET compila el archivo .aspx en un assembly y le pide al CL
importantes que
que ejecute el assembly.
pueden controlar cómo
8. Cuando el assembly se ejecuta, toma los servicios de varias clases en la librería de clases
una solicitud de página
del .NET Framework para llevar a cabo su trabajo y genera mensajes para el cliente
es procesada. Para
solicitante.
la lista completa de
métodos y propiedades,
IBEROÁMERICA
9. El proceso trabajador de ASP.NET colecta las respuestas generadas por la ejecución de la
mire http://msdn.
página Web, crea un paquete de respuesta y lo pasa al proceso aspnet_isapi.dll.
microsoft.com/en-us/
10. Aspnet_isapi.dll reenvía el paquete de respuesta a IIS, el cual a su vez pasa la respuesta a
library/system.web.
la maquina cliente solicitante.
ui.page.aspx.
Antes de la ejecución, cada página ASP.NET es convertida en una clase. Esta clase deriva
la mayoría de su funcionalidad de la clase System.Web.UI.Page. La clase Page proporciona
ETC algunas propiedades importantes tales como Request, Response, Session y Server.
Ciclo de vida y modelo de evento de una página ASP.NET
Durante su ejecución una página ASP.NET pasa a través de muchas etapas diferentes de proce
estas etapas va a través de pasos de procesamiento específcos tales como inicialización, carga,
evento en ejecución e interpretación.
Conforme una página se ejecuta, va a través de varias etapas de procesamiento. La página
también dispara algunos eventos con los cuales puede adjuntar un manejador de evento

112
Lección 4
para ejecutar su código personalizado en distintas etapas de procesamiento de la página.
Los desarrolladores de ASP.NET deben tener una buena comprensión del ciclo de vida de
una página de manera que pueden escribir código que es ejecutado exactamente en la etapa
deseada del procesamiento de la página.
La tabla 4.1 enlista las diferentes etapas del ciclo de vida y sus eventos asociados.
Tabla 4-1
Etapa
Significado
Eventos Asociados
Etapas importantes en
Solicitud de página
Cuando una solicitud de página es
el ciclo de vida de una
recibida, se inicia el ciclo de vida de la
página ASP.NET
página. En este punto, ASP.NET decide si
la página será fácilmente servida desde
la caché o si necesita ser analizada y
compilada.
Inicio
En esta etapa, se determina si la solicitud
PreInit
es una devolución de datos o una nueva
solicitud. Algunas propiedades de la
página tales como Request, Response,
IsPostBack y UICulture son establecidas
en esta etapa.
Tome Nota
Inicialización
Durante la etapa de inicialización,
Init
En un formulario
todos los controles en la página son
de contacto típico,
inicializados y se hacen disponibles.
introduzca información
Un manejador de evento para el evento
y presione el botón
Init es el mejor lugar para el código que
de enviar. Cuando
desea que se ejecute antes de seguir
envía esta página, la
con el procesamiento de la página.
www.pdftron.com
página puede procesar
Carga
Si la solicitud es una devolución de
Load
los datos enviados
datos, esta etapa es utilizada para
para tomar alguna
restaurar las propiedades de control
acción tal como el
con información desde el estado de
almacenamiento de
vista y el estado de control. Un método
los datos en una base
que maneja el evento Load es el mejor
de datos o enviar un
lugar para almacenar el código de
correo electrónico.
inicialización para cualquier control
En muchos casos, la
específico para esta página.
página principal es
IBEROÁMERICA
mostrada nuevamente
Manejador de
Si la solicitud es una devolución de
con una confirmación
evento Postback
datos, el control de los manejadores
del envío del formulario.
de evento son llamados, entonces, los
Ocurre una devolución
valores de entrada son validados y la
de datos cuando
propiedad IsValid para la clase Page es
la información es
establecida.
publicada a la misma
Pre interpretación
Esta fase señala que la pagina esta
PreRender
ETC
página Web para el
por interpretar sus contenidos. Un
procesamiento. Una
manejador de evento para el evento
devolución de datos
PreRender es la última oportunidad para
es distinta a la carga
modificar la salida de la página antes de
inicial de la página
que sea enviada al cliente.
debido a que la página
Interpretación
En esta etapa, la página llama al
recibe información
adicional como datos
método Render para cada control y
de formulario como
rellena la respuesta que será enviada al
parte del postback de la
navegador.
página.

Comprender las Aplicaciones Web


113
Descarga
En esta etapa, la respuesta es enviada
Unload
al cliente y se desempeña la limpieza
de la página. Como parte de la limpieza,
las propiedades tales como Request y
Response son descartadas.
Cuando desea manejar un evento, debe escribir el código que registra al método para
manejar el evento (también llamado manejador de evento) con el evento. Esto se hace
generalmente utilizando el patrón de registro de evento común a través del .NET
Framework:
object.event += new EventHandler(eventhandler);
Aquí, reemplace object con el nombre del objeto que expone el evento, event con el nombre
del evento, y eventhandler con el nombre del método que maneja al evento.
Sin embargo, ASP.NET proporciona seis métodos especiales que son reconocidos como
manejadores de evento por defecto y que no necesitan el código de registro. Estos son
llamados especialmente métodos Page_Init, Page_Load, Page_DataBind, Page_PreRender
y Page_Unload. Estos métodos son tratados como manejadores de evento para los eventos
correspondientes expuestos por la clase page. Este evento automático es controlado por el
atributo AutoEventWireup de la directiva @Page. Por defecto el valor de este atributo
es True, lo cual signifca que estos métodos llamados especialmente son automáticamente
enlazados con sus eventos correspondientes.
Æ Comprender el ciclo de vida de una página ASP.NET
www.pdftron.com
PREPÁRESE. Para ver cuántos eventos diferentes de la clase Page son ejecutados, desempeñe
lo siguiente.
1. Crear un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto como PageEvents.
2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web.
Nombre el archivo WebForm1.aspx.
3. En la etiqueta HTML para la página (WebForm1.aspx), asegúrese que el atributo
AutoEventWireup para la directiva @Page está establecida como True:
IBEROÁMERICA
<%@ Page Language=”C#” AutoEventWireup=”true”
CodeBehind=”WebForm1.aspx.cs”
Inherits=”PageEvents.WebForm1” %>
4. Haga clic derecho en la ventana de código y seleccione Ver Código desde el menú para
cambiar a la vista de código. Remplace el código en el archivo de código subyacente
ETC (WebForm1.aspx.cs) con el siguiente código:
using System;
namespace PageEvents
{
public partial class WebForm1
: System.Web.UI.Page
{

114
Lección 4
protected void Page_Load
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_Load. <br/>”);
}
protected void Page_Init
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_Init. <br/>”);
}
protected void Page_PreRender
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_PreRender. <br/>”);
www.pdftron.com
}
protected void Page_PreInit
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_PreInit. <br/>”);
IBEROÁMERICA
}
}
}
5. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm s
abrirá en un navegador Web. Se mostrará la salida de la página en la Figura 4-7.
ETC
Los caracteres<% y %>son utilizados para incrustar bloques de código en la etiqueta HTML d
código dentro de estos bloques de código incrustado es ejecutado durante la etapa de interpreta
En los bloques de código incrustado, la sintaxis <%=expression>es utilizada para resolver una
valor en el bloque. Por ejemplo, el siguiente bloque de código:
<i><% = DateTime.Now.ToShortDateString() %></i>
Cuando se ejecuta, visualizará la fecha actual en formato de itálicas:
12/01/2010

Comprender las Aplicaciones Web


115
La directiva @Page especifca varios atributos que controlan como el ASP.NET interpreta
una página. Por ejemplo, en este ejercicio, los atributos de la directiva @Page especifcan:
• C# es el lenguaje de programación para esta página Web (Language=”C#”)
• Los eventos de la página son auto-wired (AutoEventWireup=true)
• El nombre del archivo de código que contiene la clase asociada con la pagina
(CodeBehind=”WebForm1.aspx.cs”)
• El nombre de la clase para la página a heredar (Inherits=”PageEvents.
WebForm1”)
Figura 4-7
Formulario Web
visualizando el orden de la
ejecución de evento para
una página ASP.NET
Administración de estado
www.pdftron.com
La administración de estado es importante para las aplicaciones Web debido a la naturaleza de
Hay técnicas tanto del lado del cliente y del lado del servidor disponible para la administración
La administración de estado es el proceso de administrar el estado para una página Web a
través de viajes. Los valores de las variables y controles colectivamente conforman el estado
de una página Web.
IBEROÁMERICA
ASP.NET proporciona algunas técnicas para preservar la información de estado a través de
devoluciones de datos de la página. Estas técnicas pueden ser ampliamente categorizadas
como del lado del cliente o del lado del proveedor, dependiendo de donde son consumidos
los recursos.
Administración de estado del lado del cliente
ETC Las técnicas del lado del cliente utilizan código HTML y las capacidades del navegador
Web para almacenar información de estado en la computadora cliente. Las siguientes
técnicas son utilizadas para almacenar información de estado en el lado del cliente:
• Cadenas de consulta: el estado es administrado poniendo los datos en la URL de la
página como una cadena de consulta como un conjunto de pares de valores clave.
Por ejemplo, la siguiente URL incrusta una clave (q) de la cadena de consulta
y el valor par (televisión): http://www.bing.com/search?q=television. Para
recuperar el valor en la clave en una página ASP.NET, utilice la expresión Request.
QueryString[“q”]. Aquí la QueryString es una propiedad del objeto Request.

116
Lección 4
QueryString obtiene la colección de todas las variables de cadena de consulta.
• Cookies: Las Cookies son pequeños paquetes de información que son almacenados
por el navegador Web localmente en la computadora del usuario. Las Cookies son
utilizadas comúnmente para almacenar las preferencias del usuario y contenidos de
carritos de compra y para darles una experiencia de navegación personalizada en
visitas subsecuentes a la página Web. La clase HttpCookie representa una cookie
en su código, el siguiente código le muestra cómo establecer una cookie en una
computadora cliente:
HttpCookie cookie =
new HttpCookie(“Name”, “Bob”);
cookie.Expires = DateTime.Now.AddMinutes(10);
Response.Cookies.Add(cookie);
• El siguiente código muestra cómo leer una cookie:
if (Request.Cookies[“Name”] != null)
{
name =Request.Cookies[“Name”].Value;
}
• Campos ocultos: Los campos ocultos contienen información que no es visualizada
en la página pero que son parte del código de la página HTML. Los campos ocultos
www.pdftron.com
pueden ser creados utilizando el elemento HTML <input type=”hidden”. El
control de servidor HTML ASP.NET HtmlInputHidden también mapea a este
elemento HTML.
• Estado de Vista: Es el mecanismo que utiliza el ASP.NET para administrar el
estado de los controles a través de devoluciones de datos de página. Para facilitar
esto, cuando ASP.NET ejecuta una página, reúne los valores de todos los controles
que no son de devolución de datos que están modifcados en el código y los formatea
en una sola cadena codifcada. Esta cadena es almacenada en una campo oculto en
un control llamado VIEWSTATE. Por defecto, el ViewState está habilitado en una
IBEROÁMERICA
aplicación ASP.NET. Puede deshabilitar la ViewState en el nivel de un control
estableciendo la propiedad EnableViewState del control a false:
<asp:GridView ID=”GridView1”
runat=”server” EnableViewState=”false” />
Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo
ETC EnableViewState de la directiva de página a false:
<%@ Page EnableViewState=”false” %>
Puede deshabilitar el estado de vista en el nivel de aplicación agregando la siguiente
línea en el archivo web.confg:
<pages enableViewState=”false” />

Comprender las Aplicaciones Web


117
Administración de estado del lado del servidor
La administración de estado del lado del servidor utiliza recursos del servidor para
almacenar la información de estado. Utilizando técnicas del lado del servidor se elimina
la posibilidad de que un usuario tratara de hackear el código del lado del cliente o de leer
los datos de la sesión. Sin embargo, el almacenar y procesar información de la sesión en el
servidor incrementa la carga del servidor y requiere de recursos del servidor adicionales
para servir las páginas Web.
ASP.NET soporta la administración de estado del lado del servidor en dos niveles:
Tome Nota
El estado de sesión
• Estado de Sesión: Una aplicación de ASP.NET crea una sesión única para
puede ser configurado
cada usuario que manda una solicitud para una aplicación. ASP.NET identifca
para almacenarse
distintivamente cada una de estas sesiones enviando un SessionId único a la URL
en otro servidor o un
solicitada. Este SessionId es enviado como una cookie o es incrustado en la URL,
Servidor SQL. Esto es
dependiendo de la confguración de la aplicación. La habilidad de únicamente
muy útil cuando una
identifcar y relacionar solicitudes puede ser utilizada para almacenar datos
solicitud del usuario
específcos de la sesión que también se conoce como estado de sesión de la aplicación
puede ser procesada
Web. Un ejemplo común del estado de sesión es para almacenar el contenido de
por uno de los muchos
los carritos de compra para usuarios conforme navegan a través de la tienda basada
servidores en una
en Web.
granja Web- Una
• Estado de Aplicación: el estado de aplicación es utilizado para almacenar datos que
granja Web es una
son usados a los largo de la aplicación. El estado de aplicación puede ser accedido
colección de servidores
fácilmente a través de la propiedad Application de la clase Page. Esta propiedad
Web utilizados
proporciona acceso al objeto HttpApplicationState que almacena el estado de
colectivamente para
aplicación como una colección de pares de valores clave.
servir un sitio Web.
Las granjas Web son
El siguiente ejercicio muestra cómo utilizar el estado de sesión. Este ejercicio utiliza dos
necesarias para el
formatos Web. El WebForm1.aspx obtiene un nombre de usuario y lo almacena en el
www.pdftron.com
soporte de tráfico en
estado de sesión. El formato entonces transfere al usuario al WebForm2.aspx, el cual
sitios Web populares.
recupera el nombre del usuario desde la sesión.
Æ Utilizar el Estado de Sesión
PREPÁRESE. Para utilizar el estado de sesión, haga lo siguiente:
1. Agregue un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto UtilizandoEstadoSesion.
IBEROÁMERICA
2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web.
Nombre el archivo WebForm1.aspx
3. Cambie la etiqueta HTML, del WebForm1.aspx a lo siguiente:
<%@ Page Language=”C#” AutoEventWireup=”true”
ETC CodeBehind=”WebForm1.aspx.cs”
Inherits=”UtilizandoEstadoSesion.WebForm1” %>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title></title>

118
Lección 4
</head>
<body>
<form id=”form1” runat=”server”>
<div>
<asp:Label ID=”Label1” runat=”server”
Text=”Introduzca su nombre:” /><br />
<asp:TextBox ID=”TextBox1” runat=”server” />
<br /><br />
<asp:Button ID=”Button1” runat=”server”
Text=”Submit” onclick=”Button1_Click” />
</div>
</form>
</body>
</html>
www.pdftron.com
4. Haga clic derecho en la ventana del código y seleccione Ver Código desde el menú contextu
para cambiar al archivo de código subyacente (WebForm1.aspx.cs). Remplace el código en
este archivo con el siguiente código:
using System;
namespace UsingSessionState
{
IBEROÁMERICA
public partial class WebForm1
: System.Web.UI.Page
{
ETC protected void Page_Load
(object sender, EventArgs e)
{
if (Session[“Name”] != null)
Response.Redirect(“WebForm2.aspx”);

Comprender las Aplicaciones Web


119
}
protected void Button1_Click
(object sender, EventArgs e)
{
Session.Add(“Name”, TextBox1.Text);
Response.Redirect(“WebForm2.aspx”);
}
}
}
5. Agregue un nuevo formulario Web al proyecto (WebForm2.aspx). Cambie la etiqueta de la
página a lo siguiente:
<%@ Page Language=”C#” AutoEventWireup=”true”
CodeBehind=”WebForm2.aspx.cs”
Inherits=”UsingSessionState.WebForm2” %>
<html xmlns=”http://www.w3.org/1999/xhtml”>
www.pdftron.com
<head runat=”server”>
<title></title>
</head>
<body>
IBEROÁMERICA
<form id=”form1” runat=”server”>
<div>
<asp:Label ID=”Label1” runat=”server” /><br />
<asp:Button ID=”Button1” runat=”server”
ETC Text=”Limpiar Sesión”
onclick=”Button1_Click” />
</div>
</form>
</body>

120
Lección 4
</html>
6. Cambie el código en el archivo de código subyacente (WebForm2.aspx.cs) en el formulario
a lo siguiente:
using System;
namespace UsingSessionState
{
public partial class WebForm2
: System.Web.UI.Page
{
protected void Page_Load(
object sender, EventArgs e)
{
if (Session[“Name”] != null)
Label1.Text = String.Format(
“Bienvenido,{0}”, Session[“Name”]);
www.pdftron.com
else
Response.Redirect(“WebForm1.aspx”);
}
protected void Button1_Click(
object sender, EventArgs e)
IBEROÁMERICA
{
Session.Remove(“Name”);
Response.Redirect(“WebForm1.aspx”);
ETC } }}
7. Seleccione Depurar y después Inicie la depuración (o presione F5). La páginaWebFo
aspxse abrirá en un navegador Web. Vera la página Web mostrada en la Figura 4-
8.Introduzca
un nombre y haga clic en el botón enviar. Esta página almacena el nombre introducido en el
estado de sesión.
Comprender las Aplicaciones Web
121
8. Será transferido al WebForm2.aspx mostrado en la Figura 4-
9. WebForm2.aspx recupera el
nombre de usuario desde el estado de sesión. En la misma ventana del navegador, de forma
que está dentro de la misma sesión, intente acceder al WebForm1.aspx. Notará que mientras
la sesión contenga una entrada de nombre, usted será re direccionado al WebForm2.asp
Presione el botón de Limpiar Sesión. Esto limpia la sesión y usted es transferido al WebForm1
aspx.
Figura 4-8
La página almacena el
nombre introducido al
estado de sesión
Figura 4-9
La página recupera el
nombre visualizado desde
el estado de sesión
; ¿Listo para la
www.pdftron.com
certificación?
¿Comprende las bases
del desarrollo de una
aplicación Web en
Microsoft ASP.NET?
— USD 4.2
� Comprender el IIS Web Hosting
IBEROÁMERICA
È EN RESUMEN
El Web hosting involucra el confgurar el servidor web con las confguraciones y archivos de có
que los usuarios remotos pueden tener acceso satisfactoriamente a la aplicación Web.
ETC Las aplicaciones de ASP.NET deben ser desarrolladas en un servidor Web de Servicios
de Información de Internet (IIS). IIS es una parte integral de los sistemas operativos de
Windows Server y proporciona toda la funcionalidad para hospedar sitios Web.
Implementar una aplicación de ASP.NET no es complicado ya que ASP.NET proporciona
la implementación xcopy. Lo que signifca que todo lo que necesita hacer para implementar
un sitio Web de ASP.NET a un servidor Web es copiar archivos a las ubicaciones correctas.
Puede copiar archivos utilizando el comando xcopy de Windows o utilizando una
aplicación del Protocolo de Transferencia de Archivos (FTP).

122
Lección 4
Comprender los Servicios de información de Internet
Servicios de Información de Internet (IIS) es un servidor Web para hospedar una aplic
operativo Windows. Un Servidor Web IIS utiliza conceptos de sitios, aplicaciones y directorio
Puede utilizar IIS para hospedar múltiples sitios Web y compartir información con
usuarios a través del Internet o una intranet. IIS utiliza una relación jerárquica entre sitios,
aplicaciones y directorios virtuales como bloque de construcción básico para hospedar
contenido en línea.
IIS puede ser administrado utilizando el IIS Manager tool, el cual es parte del sistema
operativo Windows. El IIS Manager tool, como se muestra en la Figura 4-
10, proporciona
una interfaz de usuario grafca para confgurar sitios Web, aplicaciones y directorios
virtuales. La pantalla en la Figura 4-
10 es de una computadora ejecutando Windows 7. La
interfaz de usuario del IIS Manager es diferente en Windows XP.
Figura 4-10
Interfaz del Administrador
de Servicios de
Información de Internet
(IIS)
Tome Nota
Algunas aplicaciones
Web complejas
podrían necesitar que
implemente archivos
www.pdftron.com
DLL al Cache de
ensamble global (GAC).
En tal situación, usted
podría necesitar crear
un paquete instalador
de Windows para
implementar en lugar
de utilizar xcopy o FTP.
IBEROÁMERICA
Creación de directorios virtuales y Sitios Web
Un Sitio Web es un contenedor de aplicaciones y directorios Virtuales. Un directorio virtual es
se mapea a un directorio físico en un servidor Web.
Un sitio web es un contenedor de aplicaciones y directorios virtuales y puede ser accedido
utilizando una dirección de un sitio Web. Por ejemplo, la URL www.northwind.com
ETC podría apuntar a un sitio Web que tenga muchos directorios virtuales tales como órdenes
y cuentas, cada uno de los cuales puede ser accedido en combinación con la dirección del
sitio Web tal como www.northwind.com/ordersywww.northwind.com/account.
Un servidor Web nunca expone la dirección física actual y la ubicación de los archivos al
mundo externo. En lugar de eso, utiliza un sistema de alias que mapea a los directorios
físicos. Estos alias también son llamados directorios virtuales. Los directorios virtuales se
han convertido en parte de la URL, como se vio en el ejemplo anterior. Cuando IIS recibe
una solicitud para una tal URL, mapea el directorio virtual a la ubicación física de los
archivos.

Comprender las Aplicaciones Web


123
Para crear un directorio virtual utilizando el IIS manager, siga los siguientes pasos:
1. Abra el IIS Manager. Para abrir el IIS Manager en Windows 7, teclee IIS en el menú inicio
luego haga clic en el acceso directo Administrador de los Servicios de Información de Internet
(IIS). Para acceder al IIS Manager en Windows XP, vaya a Inicio, Ejecutar, teclee “inetmgr” y
haga clic en el botón Aceptar.
2. Expanda los nodos en el panel izquierdo (referencia en la Figura 4-
10) y seleccione el nodo
de Default Web Site.
3. Haga clic derecho en el nodo Default Web Site y seleccione la opción Add Virtual Director
desde el menú de accesos directos. En Windows XP, el comando será New, Virtual Directory.
En este punto aparecerá un asistente para la creación del directorio virtual en su pantalla. Le
pedirá la información que necesita en el siguiente paso.
4. En el dialogo Add Virtual Directory, proporcione un Alias y una ruta física, como se muestr
en la Figura 4-11 y haga clic en OK.
Figura 4-11
Cuadro de diálogo Add
Virtual Directory
www.pdftron.com
IBEROÁMERICA
Implementar Aplicaciones Web
Implementación de un solo sitio Web es llevada a cabo copiando los archivos a la ubicación co
sitio Web complejo podría necesitar utilizar un Instalador de Windows.
Hay dos mejores manearas en las cuales puede implementar archivos a un sitio Web:
ETC • Utilizando xcopy o FTP: Muchas aplicaciones Web y servicios Web solo requieren
que los archivos sean copiados en el servidor Web. No requieren ninguna acción
especial como reiniciar los servicios IIS, registrar los componentes en el Registro de
Windows, etc. La implementación de xcopy o FTP es ideal para tales casos.
; ¿Listo para la
• Utilizar un Instalador de Windows: Un Instalador de Windows puede desempeñar
certificación?
un número de acciones personalizadas durante el proceso de implementación y por
¿Comprende las bases
lo tanto, puede ser utilizado para implementar sitios Web muy complejos que
del Web Hosting con el
requieren la creación automática de directorios virtuales, servicios de reinicio,
Servidor Web de IIS?
registrar componentes, etc.
— USD 4.3

124
Lección 4
� Comprender el desarrollo de Servicios Web
È EN RESUMEN
Un servicio Web es un componente de software que puede ser accedido a través de la red utiliz
red estándar tales como HTTP. Los servicios Web son descritos utilizando el Lenguaje de Des
Web (WSDL).
Los Servicios Web proporcionan una manera para interactuar con objetos de programación
ubicados en computadoras remotas. Lo que hace especial a los servicios Web es que toda
la comunicación entre los servidores de servicio Web y sus clientes es a través de mensajes
de Lenguaje de Etiquetado Extensible (XML) transmitidos a través del Protocolo de
Transferencia de Hipertexto (HTTP).
Utilizando estas tecnologías estándar, los objetos remotos pueden ser publicados y
consumidos por otros sistemas no compatibles. Por ejemplo, un objeto remoto escrito
en C# y publicado como un servicio Web en un servidor Web de Windows puede ser
procesado por código Java ejecutándose en una máquina de Linux.
Antes de entrar en detalles de la creación y consumo de servicios Web, nos familiarizaremos
con dos tecnologías clave que hacen posibles los servicios Web:
• Protocolo Simple de Acceso a Objetos (SOAP)
• Lenguaje de Descripción de Servicios Web (WSDL)
SOAP
www.pdftron.com
SOAP es el protocolo para el intercambio estructurado de información en una comunicación d
dos computadoras remotas.
SOAP es el protocolo que defne como las computadoras remotas intercambian mensajes
como parte de una comunicación de servicio Web. SOAP se basa en XML en su formato de
mensaje y uso de HTTP para transmisión de mensajes. El utilizar SOAP para comunicarse
tiene dos benefcios mayores. Primero, ya que los mensajes están formateados como XML,
son más fáciles de entender para sistemas no compatibles. Segundo, ya que estos mensajes
IBEROÁMERICA
son transmitidos a través de HTTP penetrante, pueden alcanzar normalmente cualquier
maquina en Internet sin ser bloqueados por algún cortafuegos.
Este es un paquete típico de SOAP enviado desde un cliente a un servicio Web:
<?xml version=”1.0” encoding=”utf-8”?>
ETC <soap:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Body>

Comprender las Aplicaciones Web


125
<ToLower xmlns=”http://northwindtraders.com”>
<inputString>SAMPLE STRING</inputString>
</ToLower>
</soap:Body>
</soap:Envelope>
Puede notar que algunos de los elementos obvios de este paquete SOAP:
• El paquete consiste de un envelope que contiene un cuerpo, cada uno de ellos es
identifcado con una etiqueta XML.
• El cuerpo consiste del nombre del método que será invocado. En este paquete
SOAP. El nombre del método es ToLower y toma un solo parámetro por el
nombre de inputString y un valor dado.
Este es un paquete de respuesta desde el servidor:
<?xml version=”1.0” encoding=”utf-8”?>
<soap:Envelope
Tome Nota
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
Un servicio Web
puede existir sin un
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
archivo WSDL, pero
debe saber el mensaje
xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>
exacto SOAP entrante
<soap:Body>
www.pdftron.com
que el servicio Web
espera antes de que lo
<ToLowerResponse
pueda utilizar.
xmlns=”http://northwindtraders.com”>
<ToLowerResult>sample string</ToLowerResult>
</ToLowerResponse>
</soap:Body>
IBEROÁMERICA
</soap:Envelope>
En el paquete de respuesta, el elemento XML de ToLowerResponse es el resultado de la
invocación del método en el servidor.
WSDL
ETC
WSDL es un lenguaje basado en XML para describir servicios Web.
WSDL signifca Lenguaje de Descripción de Servicios Web y proporciona un estándar
por el cual un servicio Web puede decirle al cliente qué tipo de mensajes aceptará y
qué resultados serán retornados. Un archivo WSDL actúa como la interfaz publica de un
servicio Web e incluye la siguiente información:
• Los tipos de datos que puede procesar
• Los métodos que expone
• Las URLs a través de las cuales estos métodos pueden ser accedidos
126
Lección 4
Crear Servicios Web
En esta sección aprenderá como crear y publicar un servicio Web.
En esta sección, aprenderá como crear un servicio Web simple llamado TextWebService
que expone dos métodos, ToLower y ToUpper. Estos métodos respectivamente convierten
una cadena dada a letras minúsculas y mayúsculas. Aunque es simple, este cubre todos
los aspectos de la creación de un servicio Web que puede involucrar una lógica de
procesamiento más compleja.
Æ Creando un Servicio Web
PREPÁRESE. Para crear un servicio Web, haga lo siguiente:
1. Agregue un nuevo proyecto basado en plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto TextWebService como se muestra en la
Figura 4-12.
Figura 4-12
Seleccione la plantilla de
aplicación web vacía de
ASP.NET para Servicios
Web
www.pdftron.com
IBEROÁMERICA
2. Seleccione Proyecto, Agregar nuevo elemento desde el menú. Seleccione la plantilla
Servicio Web como se muestra en la Figura 4-
13.Nombre el servicio WebTextWebService.asmx.
3. Cambie el código por defecto para la clase TextWebService en el archivo TextWebService.
asmx.cs como se muestra debajo:
[WebService(Namespace = “http://northwindtraders.com/”)]
ETC [WebServiceBinding(ConformsTo
= WsiProfles.BasicProfle1_1)]
public class TextWebService : System.Web.Services.WebService
{
[WebMethod]
public string ToUpper(string inputString)

Comprender las Aplicaciones Web


127
{
return inputString.ToUpper();
}
[WebMethod]
public string ToLower(string inputString)
Tome Nota
{
Puede utilizar el
return inputString.ToLower();
nombre de dominio
de su compañía como
}
parte del espacio de
nombre (namespace)
}
para distinguir
4. Seleccione Depurar después Generar TextWebService para compilar el proyecto y garantiza
sus servicios Web
que no hay errores. El servicio Web ahora está listo para utilizarse.
publicados de otras
compañías.
En el código de arriba hay algunas cosas importantes para notar. Cada clase es expuesta
como un servicio Web XML que necesita tener un atributo WebService. El atributo
WebService tiene una propiedad Namespace que establece por defeco ahttps://tempuri.
org/. Ya que es correcto tener este valor en el tiempo de desarrollo, el valor de namespace
debería ser cambiado antes de que el servicio Web sea publicado. Cada servicio Web debe
tener un namespace único con el fin de que las aplicaciones cliente se distingan de otros
servicios Web.
Cada método que es expuesto desde el servicio Web necesita tener un atributo WebMethod.
Los métodos marcados con los atributos WebMethod son también conocidos como
www.pdftron.com
métodos Web. Los dos métodos utilizados en este ejercicio convierten una cadena dada en
letras mayúsculas y minúsculas, respectivamente.
Para probar un servicio Web simple tal como el TextWebService creado arriba, todo lo que
necesita es un navegador Web. Puede seleccionar métodos para invocar, pasar parámetros y
revisar los valores de retorno desde dentro del navegador, como se muestra en el siguiente
ejercicio.
Figura 4-13
IBEROÁMERICA
Seleccione la plantilla de
Servicio Web para crear
un servicio Web
ETC
128
Lección 4
Æ Probar un Servicio Web
PREPÁRESE. Para probar un servicio Web, desempeñe las siguientes tareas:
1. Abra el proyecto TextWebService que creó en el ejercicio previo. Seleccione Depurar y
después Inicie la depuración. Un navegador es lanzado mostrando la página de
prueba del
servicio Web, como se muestra en la Figura 4-14.
Figura 4-14
Página de prueba de un
servicio Web
2. Haga clic en el enlace de Descripción del servicio en la página de prueba. Es capaz de ver
el WSDL para este servicio Web. Haga clic en el botón para regresar a la página de prueba.
www.pdftron.com
3. Todos los métodos Web aparecen como un enlace a la página de prueba. Para invocar un
método Web, haga clic en su enlace. Se mostrará una página para probar el método Web
seleccionado, como se muestra en la Figura 4-15.
Figura 4-15
Una página de prueba de
un método Web
IBEROÁMERICA
ETC

Comprender las Aplicaciones Web


129
4. La página de prueba del método Web muestra el SOAP y otros mensajes que el servicio
Web comprende. También contiene un formato que le permite introducir parámetros del
método y probar el método Web. Introduzca una cadena de entrada de prueba y haga clic
en el botón invocar. Se mostrará el resultado en la siguiente página, como se muestra en
la Figura 4-16.
Figura 4-16
Valor de retorno desde un
servicio Web
5. Pruebe invocar ambos métodos y cierre el navegador Web.
Cuando da clic en el botón Invocar, la página de prueba construye los paquetes SOAP
apropiados para ser procesados por el servicio Web y luego visualice los resultados
retornados desde el servicio Web.
Consumir Servicios Web
En esta sección, aprenderá cómo acceder a servicios Web desde una aplicación cliente.
www.pdftron.com
Ya aprendió cómo invocar un servicio Web desde la página de prueba de un servicio Web.
En esta sección, aprenderá cómo llamar un servicio Web por medio de programación desde
dentro de una aplicación cliente de ASP.NET.
Æ Acceder a un Servicio Web desde una aplicación cliente
PREPÁRESE. Para acceder a un servicio Web desde una aplicación cliente, desempeñe los
siguientes pasos:
IBEROÁMERICA
1. Agregue un proyecto nuevo a la solución Leccion04 basado en la plantilla de aplicación
web vacía de ASP.NET. Nombre el proyecto TextWebServiceClient.
2. Haga clic derecho en el nombre del proyecto en la ventana del Explorador de Soluciones y
seleccione la opción Add Web Reference desde el menú. En el cuadro de diálogo Add Web
Reference, introduzca la URL del servicio creado en el ejercicio previo y presione Enter
(puede copiar la URL desde la barra de direcciones del navegador). Esta acción carga la
ETC lista de operaciones disponibles en el servicio Web, como se muestra en la
Figura 4-17.
3. En el cuadro de diálogo Web Reference, cambie el nombre de la referencia Web a
textWebServicey haga clic en el botón Add Reference. Esto agregará una referencia Web
al proyecto, como se muestra en la Figura 4-18.
4. Cambie el código en Default.aspx a lo siguiente:
<%@ Page Title=”Home Page” Language=”C#”
AutoEventWireup=”true”
CodeBehind=”Default.aspx.cs”

130
Lección 4
Inherits=”TextWebServiceClient._Default” %>
<html>
<head><title>TextWebService Client
</title></head>
<body>
<form runat=”server”>
<h2>Formulario de prueba para TextWebService</h2>
<p>
<asp:TextBox ID=”TextBox1”
runat=”server”
Text=”Introduzca texto” />
<br />
<asp:Button ID=”Button1”
runat=”server”
Text=”Invocar Métodos de Servicio”
onclick=”Button1_Click” />
</p>
<p>
<strong>Results:</strong><br />
ToLower method:
<asp:Label ID=”toLowerLabel”
runat=”server”
Text=”Label” ForeColor=”Green” />
www.pdftron.com
<br />
ToUpper method:
<asp:Label ID=”toUpperLabel”
runat=”server”
Text=”Label” ForeColor=”Green” />
</p>
</form>
</body>
IBEROÁMERICA
</html>
5. Abra la Vista de Diseño de Default.aspx y de doble clic en el control Button. Esto agrega
código para el manejador de evento Click. Modifique el código como se muestra
debajo:
Tome Nota
protected void Button1_Click(
ETC
Cuando invoca un
object sender, EventArgs e)
método de servicio
{
Web, tiene la
var webService =
elección de utilizar un
new textWebService.TextWebService();
método sincrónico o
asincrónico. Podría
toLowerLabel.Text =
desear utilizar el
webService.ToLower(TextBox1.Text);
método asincrónico
toUpperLabel.Text =
para incrementar
la sensibilidad de la
webService.ToUpper(TextBox1.Text);
aplicación cliente.
}

Comprender las Aplicaciones Web


131
6. Seleccione Depurar y después Inicie la depuración para ejecutar la aplicación
Web.
Introduzca algún texto de ejemplo y haga clic en el botón Invocar Métodos de
Servicio.
Verá los resultados de TextWebService como se muestra en la Figura 4-19.
Figura 4-18
Nodo de referencias Web
del proyecto
Figura 4-19
www.pdftron.com
Nodo de referencias Web
del proyecto
IBEROÁMERICA
En el ejercicio de arriba, cuando agrega una referencia Web, Visual Studio crea un proxy
local que representa el servicio remoto. El proxy simplifca la comunicación con el servicio
ETC Web aceptando mensajes, reenviándolos al servicio Web y regresándolos desde el servici
Web.
Puede utilizar fácilmente este proxy para crear objetos del servicio Web e invocar métodos.
; ¿Listo para la
Como resultado, trabajar con objetos remotos es similar a trabajar con objetos locales.
certificación?
Cuando crea una referencia Web, Visual Studio lee el archivo WSDL apropiado para
¿Comprende las
determinar cuáles clases y métodos están disponibles en el servidor remoto. Cuando llama
bases del desarrollo
de servicios Web?
a un método en un objeto remoto, el .NET Framework traduce su llamado y lo resuelve en
— USD 4.4
mensajes SOAP y los transmite sin intervención de su parte.

132
Lección 4
Resumen de Habilidades
En esta lección aprendió:
• Una página Web es un documento que es servido a través de la World Wide Web
(WWW) y puede ser visualizado por un navegador Web.
• El lenguaje de Marcado de Hipertexto (HTML) es el lenguaje utilizado por los
servidores y navegadores Web para describir una página Web.
• Las hojas de estilo en cascada (CSS) le permiten almacenar y formatear información
separadamente del código HTML. Esta separación le facilita actualizar su sitio
Web. Visual Studio incluye herramientas para construir y pre visualizar sus hojas
de estilo.
• JavaScript es un lenguaje de scripting del lado del cliente que se ejecuta dentro de
un navegador Web para ayudar a crear páginas Web mucho más interactivas de lo
que es posible utilizando solo HTML plano.
• Técnicas de administración de estado del lado del cliente tales como cadenas
de consulta, cookies, campos ocultos y estado de vista utilizando HTML y las
capacidades del navegador Web para almacenar información de estado en la
computadora cliente.
• Técnicas de administración de estado del lado del servidor tales como estado de
sesión y estado de aplicación utilizan recursos de servidor para la administración
de estado.
• Los Servicios de Información de Internet (IIS) es un servidor Web para hospedar
aplicaciones Web en el sistema operativo Windows. Un servidor Web IIS utiliza los
conceptos de sitios, aplicaciones y directorios virtuales.
www.pdftron.com
• Los servicios Web le proporcionan una manera para invocar objetos remotos
utilizando tecnologías estándar tales como XML y HTTP.
• SOAP es el protocolo que defne como las computadoras remotas intercambian
mensajes como parte de la comunicación del servicio Web. SOAP se basa en XML
para su formato de mensaje y utiliza HTTP para la transmisión del mensaje.
• WSDL proporciona un estándar por el cual un servicio Web puede decirle a su
cliente cuales tipos de mensajes aceptará y qué resultados serán retornados.
IBEROÁMERICA

» Evaluación de Conocimiento
Completar los espacios en blanco
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
ETC 1. En HTML la fcha de anclaje (<a>), el atributo _________ especifca la URL
objetivo.
2. Puede poner código CSS en un archivo separado y enlazarlo a la página Web utilizando
el elemento HTML _________.
3. El código de JavaScript en una página Web es ejecutado en el_________.
4. Puede utilizar un elemento _________ para visualizar un mensaje específco a los
usuarios cuando el navegador no está ejecutando JavaScript.

Comprender los conceptos básicos de bases de datos


133
5. Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo
_________de la directiva Page a false en la página ASP.NET.
6. El estado de_________ es utilizado para almacenar información que es utilizada
globalmente a lo largo de una aplicación, como opuesto al estado de_________ que
almacena información para una sesión de usuario.
7. Una aplicación Web es accedida utilizando un nombre de _________ en lugar de un
nombre de carpeta física.
8. Debe marcar las clases con el atributo _________ para exponerlos como un servicio
Web.
9. Todos los métodos en una clase de servicio Web, solo los métodos marcados con los
atributos _________ son expuestos como métodos de servicio Web.
10. SOAP se basa en _________ como su formato de mensaje y utiliza _________ para
la transmisión del mensaje.
Opción Múltiple
Encierre en un círculo la letra que corresponda a la mejor respuesta.
1. Escriba el siguiente código en su página Web:
<html>
<head>
<title>Pagina de Ejemplo</title>
<style type=”text/css”>
www.pdftron.com
div
{
font-family: Verdana;
font-size: 9pt;
}
</style>
IBEROÁMERICA
</head>
<body>
<div style=
“font-weight: bold; font-size: 12pt;”>
Texto de Ejemplo</div>
ETC </body></html>
2. ¿Cuál sería el estilo para el texto visualizado como parte del elemento<div>?
a. font-family: Verdana; font-weight: bold; font-size: 12pt;
b. font-family: Verdana; font-weight: bold; font-size: 9pt;
c. font-family: Verdana; font-size: 12pt;
d. font-family: Verdana; font-size: 9pt;

134
Lección 4
3. Está desarrollando un sitio Web de mapas que permite a los usuarios explorar
interactivamente el mapa utilizando acciones tales como panning and zooming. Desea
que el sitio Web sea responsivo y accesible en la mayoría de los navegadores Web
modernos. Sin embargo, desea que los usuarios instalen plug-
ins adicionales con el
fn de utilizar su sitio Web. ¿Cuál de las siguientes tecnologías debería utilizar para
visualizar los mapas?
a. HTML.
b. Tecnología de programación del lado del Servidor tal como ASP.NET.
c. Adobe Flash.
d. JavaScript.
4. Su página ASP.NET contiene una variable de nivel de página del tipo Customer. Desea
preservar el valor de esta variable a través de devoluciones de datos de página (postbacks),
pero no necesita esta variable en ninguna otra página en la aplicación. ¿Cuál de las
siguientes técnicas de administración de estado es la mejor manera de llevar a cabo esto?
a. Cadenas de consulta
b. Cookies
c. Estado de Vista
d. Sesión
5. Está desarrollando una aplicación Web para un banco en línea. Su aplicación permite
a los usuarios acceder a la información de sus cuentas y transacciones desde dentro de
un navegador Web. Cuando un usuario inicia sesión en la aplicación Web, desea que
la aplicación muestre el nombre de usuario y el balance de cuenta en todas las páginas
de la aplicación hasta que el usuario cierra sesión. También desea que la aplicación sea
segura de usuarios maliciosos. ¿Cuál de las siguientes técnicas de administración de
estado debería utilizar?
www.pdftron.com
a. Cookies
b. Estado de vista
c. Estado de vista con cifrado
d. Sesión
6. Está desarrollando un formulario Web para visualizar la información del clima. Cuando
un usuario solicita el formulario Web, el formulario necesita hacer alguna inicialización
para cambiar la apariencia del formulario y asignar valores a algunos controles. ¿Dónde
debería poner el código?
IBEROÁMERICA
a. En el manejador de evento PreInit de la clase Page.
b. En el manejador de evento Init de la clase Page.
c. En el manejador de evento Load de la clase Page.
d. En el manejador de evento PreRender de la clase Page.
7. Desea visualizar valores de las expresiones de C# en una página ASP.NET. ¿Cuál de los
siguientes tipos de bloque de código debería utilizar para encerrar la expresión?
ETC a. <script runat=»server»>…</script>
b. <script>…</script>
c. <%= … %>
d. <form>…</form>

Comprender los conceptos básicos de bases de datos


135
8. Ha desarrollado una aplicación de timesheet que será utilizada por todos los
trabajadores en su compañía. Ha utilizado ASP.NET para desarrollar esta aplicación
y la ha implementado en el servidor Web de la compañía. ¿Qué deben instalar todos
los trabajadores de la compañía en sus computadoras antes de que puedan acceder a la
aplicación de timesheet?
a. .NET Framework Redistributable
b. .NET Framework Software Development Kit
c. Visual Studio
d. Navegador Web
9. Su aplicación cliente llama a un servicio Web que desempeña cálculos complejos
que consumen tiempo. El usuario se queja que mientras los resultados están siendo
retornados la interfaz de usuario se congela momentáneamente. ¿Qué enfoque debería
tomar para resolver este problema?
a. Instalar un mejor procesador en el servidor Web.
b. Instalar un mejor procesador en la computadora cliente.
c. Actualizar a una conexión de Internet más rápida.
d. Utilizar llamados asincrónicos para invocar al servicio Web.
10. Ha creado un servicio Web de ASP.NET que convierte de una moneda a otra. Uno de
los métodos en su servicio Web está defnido con este código:
public double Convert(double amount,
string from, string to)
{
// Código para desarrollar la conversión de moneda
www.pdftron.com
}
11. Los usuarios del servicio Web reportan que pueden establecer una referencia al servicio
Web pero el método Convert no está disponible para ellos. ¿Cuál podría ser el problema?
a. El archivo .asmx del servicio Web no está disponible en el servidor Web.
b. La clase del servicio Web no está marcada con el atributo WebService.
c. El método Convert no está marcado con el atributo WebMethod.
d. Los servicios Web pueden solo exponer métodos y retornar valores de texto.
IBEROÁMERICA
12. Está trabajando en dos proyectos de Visual Studio. El primer proyecto es un servicio
Web que retorna un objeto DataSet perteneciente al espacio de nombre System.Data. El
segundo proyecto accede al servicio Web creado por el primer proyecto. ¿Cuál proyecto
en este caso requiere una referencia al espacio de nombre de System.Data?
a. El proyecto del Servicio Web.
b. El proyecto cliente que accede al servicio Web.
ETC c. Tanto el proyecto cliente y el proyecto del servicio Web.
d. Ni el proyecto cliente ni el proyecto del servicio Web.

136
Lección 4

» Evaluación de Competencia
Proyecto 4-1: Utilizando JavaScript y HTML
Está desarrollando una página Web que proporciona una interfaz de usuario responsiva.
Visualiza una imagen en la página. Cuando el usuario mueve el ratón sobre la imagen,
la imagen original es remplazada por una nueva imagen. Cuando el ratón sale del área
de la imagen, la imagen original es visualizada nuevamente. Necesita llevar a cabo este
requerimiento utilizando código del lado del cliente de JavaScript y HTML. ¿Cómo
crearía una página Web que funcione como se describe arriba?
Proyecto 4-2: Utilizando cadenas de consulta
Está desarrollando una porción de un sitio Web que permite a usuarios introducir su
nombre y dirección de correo electrónico para suscribirse a su boletín informativo por
correo electrónico. Su solución consiste de dos páginas Web. La primera página colecta
el nombre de usuario y la dirección de correo electrónico y transfere el control a una
segunda página. La segunda página acepta el nombre y la dirección de correo electrónico
como parámetros de cadena de consulta y visualiza un mensaje de confrmación al usuario.
Necesita escribir código para estas dos páginas. ¿Qué código escribirá para llevar a cabo
este requerimiento?

» Evaluación de Dominio
Proyecto 4-3: Llamando un Servicio Web asincrónicamente
www.pdftron.com
La clase proxy generada por Visual Studio para un servicio Web incluye métodos para
la llamada del servicio Web sincrónicamente así como también asincrónicamente. Por
defecto, la aplicación utiliza el método sincrónico. Si lo prefere la invocación asincrónica,
necesita llamar la versión asincrónica del método. Las versiones asincrónicas no esperan al
servicio Web que retorne una respuesta y utiliza un mecanismo de callback para obtener
la respuesta cuando esté lista. La invocación asincrónica de un servicio Web podría ayudar
a que las aplicaciones cliente sean más responsivas. En este proyecto, llamará al método
ToLower del TextWebService creado previamente en una forma asincrónica. ¿Qué código
IBEROÁMERICA
escribiría para invocar asincrónicamente un servicio Web?
Proyecto 4-4: Utilizando el estado de sesión
Está desarrollando una porción de un sitio Web que permite a los usuarios introducir su
nombre y dirección de correo electrónico a un boletín informativo por correo electrónico.
Su solución consiste de dos páginas Web. La primera página colecta el nombre de usuario
ETC y dirección de correo electrónico, las agrega al estado de sesión y transfere el control a la
segunda página. La segunda página recupera el nombre y la dirección de correo electrónico
desde el estado de sesión y visualiza un mensaje de confrmación. Necesita escribir código
para estas dos páginas. ¿Qué código escribirá para llevar a cabo este requerimiento?

Lección 5
Comprender las Aplicaciones de Escritorio
Matriz de Dominio de Objetivos
Habilidad Tecnológica
Descripción de Dominio de Objetivo
Número del Dominio
del Objetivo
Comprender los Objetos
Comprender las aplicaciones de los
5.1
Windows® Forms
Comprender Valores y Referencias
Comprender las aplicaciones basadas en
5.2
consola
Comprender la Encapsulación
Comprender los Servicios de Windows
5.3
Términos Clave
• Parámetros de la línea de comando
• Eventos
• Servicio de Windows
• Consola
• Instalador
• Delegados
• Herencia visual
www.pdftron.com
Es un desarrollador de software para una gran organización de negocios. Necesita desarrollar u
IBEROÁMERICA
aplicación que se integre perfectamente con los escritorios de Windows de los usuarios
proporcione una interfaz de usuario similar a las aplicaciones de escritorio populares en la plat
de Windows. La aplicación necesita ser funcional ya sea que esté conectada o desconectada de
red. La aplicación debe ser capaz de comunicarse con dispositivos tales como escáneres e imp
portátiles.
ETC

138
Lección 5
� Comprender las aplicaciones de los Windows Forms
È EN RESUMEN
Las aplicaciones de los Windows Forms son aplicaciones cliente inteligentes que consisten de
que muestran una interfaz visual al usuario. Estas aplicaciones se integran bien con el sistema
dispositivos conectados y pueden trabajar ya sea conectado a Internet o no.
Diseñar un Windows Form
Un Windows Form es una superfcie visual que es capaz de visualizar una variedad de controle
texto, botones y menús. Visual Studio proporciona un diseñador de Windows Forms con base
que puede utilizar para crear fácilmente sus aplicaciones.
Para diseñar Windows Forms, primero decida que controles le gustaría ubicar en el
formulario. Los Windows Forms proporcionan una gran colección de controles comunes que
puede utilizar fácilmente para crear una excelente interfaz de usuario. Si la funcionalidad
que está buscando no está disponible como un control común, tiene la opción de, ya sea
crear un control personalizado por usted mismo o comprar un control de un proveedor
externo.
Puede utilizar la funcionalidad proporcionada por el Diseñador de Windows Forms del
Visual Studio para ubicar y organizar controles rápidamente por sus requerimientos.
Visual Studio proporciona acceso sencillo a los controles disponibles vía su Cuadro de
Herramientas, como se muestra en la Figura 5-1.
www.pdftron.com
Figura 5-1
Cuadro de Herramientas
de Visual Studio
IBEROÁMERICA
ETC
Tome Nota
Un control es un
Un formulario y sus componentes generalmente responden a las acciones del usuario tales
elemento de la interfaz
como presionar una tecla o el movimiento del ratón. Estas acciones son llamadas Eventos.
de usuario distinto que
La mayoría del código que escribe como desarrollador de Formularios de Windows es
acepta entradas de un
capturar tales eventos y manejarlos creando una respuesta apropiada para cada evento. En
usuario o visualiza una
el siguiente ejercicio creará un Formulario de Windows que muestra el valor de la fecha
salida al usuario.
seleccionada por el usuario.
Comprender las Aplicaciones de Escritorio
139
Æ Crear un Windows Form
PREPÁRESE. Lance el Microsoft Visual Studio.
1. Cree un nuevo proyecto basado en la plantilla de Aplicación para Windows Forms como se
muestra en la Figura 5-2. Nombre el proyecto como WindowsFormsDesign.
Figura 5-2
Dialogo para nuevo
proyecto de Visual Studio
2. El proyecto de Aplicación de Windows Form carga con un formulario por defecto (Form1.
cs) abierto a la vista del Diseñador para ser accedidos desde la ventana del Cuadro de
www.pdftron.com
herramientas. Si aún no ve la ventana del Cuadro de herramientas seleccione Ver y después
or. La vista del Diseñador le permite trabajar visualmente con el formulario. Por ejemplo,
puede organizar controles en la superficie del formulario y establecer sus propiedades.
Los controles pueden visualizarse en la ventana del Cuadro de herramientas. Desde el
Cuadro de herramientas arrastre y suelte un control Date Time Picker y un control Label
en la superficie del Diseñador y organice los controles como se muestra en la
Figura 5-3.
Figura 5-3
IBEROÁMERICA
Windows Form con un
Date Time Picker y un
control Label
ETC 3. En la vista del Diseñador, seleccione el control Label y utilizando la ventana de Propie
establezca su propiedad Text a una cadena vacía.
4. En la vista del Diseñador, haga doble clic en el control Date Time Picker. Esta acción adjun
el manejador de evento por defecto para el evento Value Changed del control Date Time
Picker y cambia la vista de Diseñador a Código. Cambie el código por defecto para e
manejador de evento como sigue:

140
Lección 5
Tome Nota
private void dateTimePicker1_ValueChanged
En el ejercicio
(object sender, EventArgs e)
“Crear un Windows
Form”, utilizamos los
{
nombres de control
label1.Text =
por defecto. En
formularios complejos
dateTimePicker1.Value.ToLongDateString();
con más controles,
}
siempre es buena
idea dar nombres más
5. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el proyecto
significativos a los
En la interfaz de usuario, seleccione una nueva fecha y verifique que la fecha seleccionada
controles.
es visualizada en el control Label.
En este ejercicio, note que cuando el formulario es visualizado inicialmente el control
Label es establecido con una cadena vacía. Tan pronto como cambia la selección de fecha
manipulando el control Date Time Picker, el valor de fecha seleccionado es establecido
como el texto para el control Label.
Comprender el modelo de evento de un Windows Form
El manejo de evento juega un rol clave en la programación basada en la interfaz de usuario, a
evento, responde a varios eventos que son disparados como resultado de las acciones del usua
interactivos a los programas. El modelo de evento de Windows Forms utiliza delegaciones de
enlazar los eventos a sus respectivos manejadores de evento.
Cada formulario y control expone un conjunto predefnido de eventos. Cuando ocurre un
evento, el código en el manejador de evento asociado es invocado. En el ejercicio previo,
cuando hace doble clic en el control Date Time Picker para agregar código al manejador
www.pdftron.com
de evento, Visual Studio genera el siguiente código para agregar el manejador de evento
al evento:

this.dateTimePicker1.ValueChanged +=
newSystem.EventHandler(
this.dateTimePicker1_ValueChanged);
IBEROÁMERICA
Aquí el Value Changed es el evento del control Date Time Picker que nos gustaría
capturar. Así que, una nueva instancia del delegado de tipo Event Handler es creado y el
método dateTimePicker1_ValueChanged es pasado al manejador de evento. El método
dateTimePicker1_ValueChanged es el método en el cual realmente escribirá el código del
manejador de evento.
Este código es generado automáticamente por el Diseñador de Visual Studio. Encontrará
ETC este código en el archivo de código subyacente del diseñador (Form1.Designer.cs), dentr
de una región de código titulada código generado de Diseñador de Windows Form.
Otra cosa para notar es que la sintaxis para agregar un delegado utiliza el operador+=.
Tome Nota
Esto es debido a que el .NET Framework soporta delegados multicast donde un
Un delegado se puede
delegado puede ser enlazado a más de un método, por lo tanto permite notifcaciones de
enlazar a cualquier
uno a muchos cuando el evento es disparado.
método cuya firma
coincide con la del
manejador de evento.
Comprender las Aplicaciones de Escritorio
141
Utilizar Herencia Visual
La herencia visual le permite reutilizar la funcionalidad existente y el diseño de Windows Form
Uno de los principios esenciales de la programación orientada a objetos es la herencia.
Cuando una clase hereda de una clase base, esta deriva su funcionalidad base de la clase
base. Puede siempre extender la clase derivada para proporcionar funcionalidad adicional
y ser más útil.
Un Windows Form, en esencia, sólo es otra clase y por lo tanto la herencia se aplica
también. Sin embargo, cuando la herencia es aplicada a un Windows form, también causa
la herencia de todas las características visuales de un formulario, tal como el tamaño, color
y cualquier control ubicado en el formulario. También puede manipular cualquiera de las
propiedades que hereda de la clase base. Por lo tanto, heredar Windows Forms a menudo
es llamado herencia visual. En el siguiente ejercicio, creara un Windows Form que utiliza
herencia visual para reutilizar un formulario existente.
Æ Crear un Windows Form utilizando herencia visual
PREPÁRESE. Lance el Microsoft Visual Studio y abra el Proyecto de Aplicación para Windo
llamado WindowsFormsDesign.
1. Abra el Form1.designer.cs y cambie los modificadores de acceso del label1 y el control
dateTimePicker1 de privado a protegido, como se muestra a continuación:
protectedSystem.Windows.Forms.Label label1;
www.pdftron.com
protectedSystem.Windows.Forms.DateTimePicker
dateTimePicker1;
2. Seleccione Proyecto, Agregar Windows Forms para agregar un nuevo Windows Form
basado en la plantilla de Formulario heredado. Puede buscar rápidamente esta plantilla
tecleando su nombre en el cuadro de búsqueda, como se muestra en la Figura 5-
4. Nombre
el formulario heredado InheritedForm.cs. La plantilla de Formulario Heredado no está
disponible en las ediciones de Visual Studio Express. Si está utilizando la edición express,
sólo cree un Windows Form regular llamado InheritedForm.cs y proceda al Paso
4.
IBEROÁMERICA
Figura 5-4
Plantilla de Formulario
heredado
ETC

142
Lección 5
3. Haga clic en el botón Agregar. En el cuadro de diálogo de Selector de Herencia, seleccione
el Form1 del espacio de nombres de Windows Forms Design, como se muestra en la Figura
5-5 y haga clic en el botón Aceptar.
Figura 5-5
Cuadro de dialogo de
Selector de Herencia
4. Seleccione la vista de código para el InheritedForm, verá que la clase InheritedForm hereda
del Form1 como se muestra a continuación. Si no utilizó la plantilla de Formulario heredado
en el Paso 2, necesitará modificar manualmente el código para agregar el código para la
herencia (mostrado en negritas en el código de abajo):
public partial class InheritedForm
www.pdftron.com
: WindowsFormsDesign.Form1
{
publicInheritedForm()
{
InitializeComponent();
}
IBEROÁMERICA
}
5. En la vista del Diseñador del InheritedForm, establezca la propiedad Text a “Formu
Heredado”.
6. En la vista del Diseñador, haga doble clic en InheritedForm. Esta acción agrega un manejad
de evento para el evento Load del formulario y cambia la vista de Diseño a Código. Cambie
ETC el código por defecto para el manejador de evento como se muestra a
continuación:
private void InheritedForm_Load(
object sender, EventArgs e)
{
label1.Text =
dateTimePicker1.Value.ToLongDateString();
}

Comprender las Aplicaciones de Escritorio


143
7. Abra el Program.cs y modifique el método Main como se muestra abajo para garantizar qu
el InheritedForm es lanzado cuando ejecuta la aplicación:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application
.SetCompatibleTextRenderingDefault(false);
Application.Run(new InheritedForm());
}
8. Seleccione Depurar y después Inicie la depuración (o presione F5) para
ejecutar el
proyecto. Cuando el InheritedForm es cargado, la fecha seleccionada
actualmente
es mostrada en el control label. A diferencia del Form1 creado previamente
donde
inicialmente el control label estaba vacío.
El formulario InheritedForm demuestra que tiene toda la funcionalidad del Form1
simplemente heredando el formulario. Cuando cambia el modifcador de acceso de los
controles miembro de Form1, label1 y dateTimePicker1, de privado a protegido, será
capaz de acceder a ellos desde dentro del formulario heredado. Este ejercicio también
demuestra cómo puede extender la funcionalidad del formulario base en los formularios
heredados.
Comprender las aplicaciones de interfaz de documentos múltiples (MDI)
www.pdftron.com
Las aplicaciones de interfaz de documentos múltiples son aplicaciones donde múltiples ventan
una sola ventana padre.
Las aplicaciones MDI permiten a múltiples ventanas compartir un solo menú y barra de
herramientas de la aplicación. Las aplicaciones MDI a menudo tienen un menú llamado
Ventana que permite a los usuarios administrar múltiples ventanas hijo ofreciendo
características tales como cambiar entre ventanas hijo y organizar ventanas hijo. La Figura
IBEROÁMERICA
5-6muestra al Microsoft Excel 2010 en modo MDI:
Figura 5-6
Microsoft Excel 2010
como una aplicación MDI
ETC
144
Lección 5
Tome Nota
Las aplicaciones MDI contrastan con aplicaciones de interfaz de documentos simple (SDI)
donde cada ventana contiene su propio menú y barra de herramientas. Las aplicaciones SDI
Puede ser complicado
se basan en el sistema operativo para proporcionar la funcionalidad de administración de
implementar soporte
ventana (por ejemplo, en Windows, puede cambian entre múltiples ventanas utilizando la
para múltiples
monitores en
Barra de Tareas de Windows).
aplicaciones MDI ya
que la ventana padre
Hay mucho debate entre los diseñadores de interfaz de usuario sobre qué interfaz de
necesita extenderse a
aplicación funciona mejor. Generalmente hablando, SDI es considerado más adecuado
múltiples monitores.
para usuarios novatos mientras que MDI es considerado más adecuado para usuarios
avanzados. Muchas aplicaciones populares tales como Microsoft Word y Microsoft Excel
soportan tanto SDI y MDI. Word y Excel se instalan por defecto como aplicaciones SDI
pero proporcionan a los usuarios una opción para cambiar entre SDI y MDI. Por ejemplo,
en Word 2010 y Excel 2010, puede cambiar a modo MDI desactivando la opción “Mostrar
todas las ventanas en la barra de tareas” en el menú de opciones.
Æ Crear una aplicación MDI
PREPÁRESE. Lance el Microsoft Visual Studio y cree un nuevo proyecto de Aplicació
Windows Forms llamado MDIApplication.
1. Seleccione la ventana de Propiedades para el Form1 y establezca la propiedad Text a “MDI
Application” y la propiedad IsMdiContainer a True.
2. Seleccione el control MenuStrip desde el Cuadro de Herramientas y agréguelo al formulari
Agregue un elemento del menú del nivel superior &Window, y agregue &New Window y
&Arrange en el siguiente nivel. Bajo el menú Arrange, agregue tres opciones, &Cascade,
www.pdftron.com
&Horizontal y &Vertical, como se muestra en la Figura 5-7.
Figura 5-7
Agregando opciones de
menú
IBEROÁMERICA
3. Para el control MenuStrip, establezca su propiedad MdiWindowListItem al nombre d
menú Ventana (windowToolStripMenuItem por defecto).
ETC 4. En el Explorador de Soluciones, haga clic derecho en el proyecto y seleccione Agrega
Windows Form. Agregar Windows Form con el nombre ChildForm.
5. Haga doble clic en el formulario hijo y agregue el siguiente código para manejar el evento
Load:
private void ChildForm_Load(
object sender, EventArgs e)
{
Text = DateTime.Now.ToString();
}

Comprender las Aplicaciones de Escritorio


145
6. En el formulario padre, haga doble clic en Ventana, el elemento del menú de Nueva Ventan
y agregue el siguiente manejador de evento para su evento Click:
private void newWindowToolStripMenuItem_Click(
Tome Nota
object sender, EventArgs e)
El signo & antes de un
carácter en un texto
{
de menú no se muestra
ChildForm child = new ChildForm();
sino que hace del
child.MdiParent = this;
carácter un acceso
directo al menú. Por
child.Show();
ejemplo, el menú &
}
Window puede ser
invocado presionando
7. En el formulario padre, haga doble clic en Window, Arrange, Cascade, Horizontal y Vertica
Alt+W. Las teclas
respectivamente y agregue manejadores de evento para sus eventos Click:
de acceso no serán
private void cascadeToolStripMenuItem_Click(
notorias hasta que el
object sender, EventArgs e)
usuario presione la
tecla Alt. Una opción
{
en Windows controla
LayoutMdi(MdiLayout.Cascade);
si las teclas de acceso
}
directo son visibles
o no.
private void horizontalToolStripMenuItem_Click(
object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileHorizontal);
}
www.pdftron.com
private void verticalToolStripMenuItem_Click(
object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileVertical);
}
8. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el
proyecto. Seleccione Ventana, Nueva Ventana para crear múltiples ventanas hijo nuevas.
Cambie entre las ventanas hijo. Note que solo hay una instancia de aplicación en la barra
IBEROÁMERICA
de tareas de Windows. Ahora utilice las opciones en menú Window, Arrange para ordenar
las ventanas hijo. Por ejemplo, una aplicación con tres ventanas hijo podría parecerse a la
imagen en la Figura 5-8 cuando las ventanas hijo son ordenadas
horizontalmente.
Figura 5-8
Una aplicación MDI
con tres ventanas
ETC
hijo ordenadas
horizontalmente

146
Lección 5
Revisemos algunas de las propiedades y métodos importantes utilizadas en este ejercicio.
Primero, para el formulario padre, la propiedad IsMdiContainer está establecida como
true. Esta propiedad indica que el formulario es un contenedor para múltiples formularios
hijo MDI. Correspondientemente, para cada formulario hijo, establece la propiedad
MdiParent para especifcar el formulario contenedor padre.
En seguida, la propiedad MdiWindowListItem del MenuStripes utilizado para indicar
cuál elemento de menú será utilizado para mostrar la lista de ventanas hijo MDI. Cuando
esta propiedad está establecida, el elemento de menú enlistará todas las ventanas hijo y
también le permitirá cambiar entre ventanas hijo. Como resultado de un código en el
; ¿Listo para la
método ChildForm_Load, la barra de título para cada formulario muestra la fecha y hora
certificación?
del instante cuando el formulario fue cargado.
¿Comprende
cómo desarrollar
Finalmente, el método LayoutMdies utilizado por los elementos de menú en el menú
aplicaciones de
Ventana para ordenar las ventanas hijo. El método acepta un parámetro de tipo MdiLayout
Windows Forms?
enumeration. El valor determina si la ventana hijo necesita mostrarse de forma horizontal
— USD 5.1
o vertical, en cascada o como ícono.
� Comprender las aplicaciones basadas en consola
È EN RESUMEN
Las aplicaciones de consola no tienen una interfaz de usuario gráfca y utilizan una ventana de
para interactuar con el usuario. Las aplicaciones basadas en consola son más adecuadas para ta
de una interfaz de usuario.
www.pdftron.com
Una aplicación de consola es ejecutada desde la ventana de consola. La entrada en
Tome Nota
la aplicación de consola puede ser proporcionada utilizando parámetros de la línea de
Para habilitar la lectura
comando o la aplicación de consola puede leer interactivamente caracteres desde la ventana
o escritura a la consola
de consola. Similarmente, la salida de la aplicación de consola también es escrita en la
desde una aplicación
ventana de comandos . Puede habilitar la lectura o escritura a la consola creando una
de Windows Forms,
aplicación y utilizando la plantilla de Aplicación de Consola en Visual Studio.
establezca el tipo de
salida del proyecto a
También puede utilizar aplicaciones de consola para crear comandos que pueden ser
IBEROÁMERICA
Aplicación de consola
ejecutados desde la línea de comando. Por ejemplo, puede tomar ventaja de las tuberías y
en las propiedades del
fltros proporcionados por el sistema operativo para pasar la salida de un comando como
proyecto.
entrada a otro comando, de este modo creando comandos más poderosos y combinando
comandos simples.
Trabajar con argumentos de la línea de comandos
ETC
En esta sección, aprenderá cómo aceptar parámetros de línea de comando dentro de una aplica
El siguiente ejercicio crea una aplicación de consola sencilla que acepta el nombre de un
archivo de texto como un argumento de línea de comando y muestra el contenido de ese
archivo.
Comprender las Aplicaciones de Escritorio
147
Æ Crear una aplicación de consola
PREPÁRESE. Lance el Microsoft Visual Studio.
1. Crear un nuevo proyecto basado en la plantilla de Aplicación de Consola como se muestra
en la Figura 5-9. Nombre el proyecto DisplayFile.
Figura 5-9
Plantilla de Aplicación de
Consola
2. En el Program.cs, modifique el código dentro del método Main como se
muestra abajo:
static void Main(string[] args)
www.pdftron.com
{
if (args.Length< 1)
return;
string[] lines = File.ReadAllLines(args[0]);
foreach (string item in lines)
{
Console.WriteLine(item);
IBEROÁMERICA
}
}
3. Agregue lo siguiente al archivo utilizando la directiva :
using System.IO;
4. Seleccione Generar y después Generar Solución (o presione F6) para generar
el proyecto.
ETC 5. Cree un archivo de texto utilizando Visual Studio o el bloc de notas y guárdelo como S
txt en la misma carpeta como el archivo ejecutable (el ejecutable es creado por defecto en
bin\debug folder bajo la carpeta del proyecto).
6. Abra el símbolo del sistema, navegue a la ruta del archivo EXE del proyecto. Ejecute el
siguiente comando:
DisplayFile sample.txt
7. Se mostrará el comando que muestra el contenido del archivo de texto en la
ventana de
comandos.

148
Lección 5
8. De forma alternativa, también puede pasar el argumento de la línea de comando desde
dentro del Visual Studio utilizando la ventana de propiedades de proyecto, como se muestra
en la figura 5-
10.Para ver la ventana de propiedades del proyecto, seleccione la opción del
menú Propiedades del proyecto DisplayFile.
Figura 5-10
Estableciendo opciones
de inicio en la ventana de
propiedades del proyecto
; ¿Listo para la
certificación?
¿Comprende
cómo desarrollar
aplicaciones basadas
en consola? — USD 5.2
� Comprender los Servicios de Windows
È EN RESUMEN
Un Servicio de Windows es una aplicación que se ejecuta en el fondo y no tiene ninguna inter
www.pdftron.com
La naturaleza de los servicios de Windows los hacen ideales para crear programas de larga
ejecución que se ejecutan en el fondo y no proporcionan directamente ninguna interacción
de usuario. Un servicio de Windows puede ser iniciado, pausado y detenido. Un servicio
de Windows también puede ser confgurado para iniciar automáticamente cuando la
computadora es iniciada.
Tome Nota
Debido a que un
Algunos ejemplos de un servicio de Windows incluyen un servidor Web que escucha las
IBEROÁMERICA
servicio de Windows
solicitudes entrantes y envía una respuesta o la cola de impresión de un sistema operativo
es capaz de ejecutarse
que proporciona servicios de impresión a los programas de aplicación.
en el fondo, no
necesita que un
Los servicios juegan un rol importante en la arquitectura de la aplicación Enterprise. Por
usuario inicie sesión
ejemplo, puede tener un servicio que escuche órdenes entrantes e inicie un fujo de trabajo
con el fin de funcionar.
de procesamiento de orden cuando una orden es recibida.
Los servicios de
ETC
Windows ejecutan
sus propias sesiones
de Windows en el
contexto de seguridad
especificado.
Dependiendo en
qué servicios son
necesitados, puede
especificar una cuenta
de usuario bajo el cual
ejecutar el servicio.
Comprender las Aplicaciones de Escritorio
149
Crear un servicio de Windows
Para crear un servicio de Windows en Visual Studio, utilice la plantilla de aplicación de Servic
servicio de Windows necesita ser instalado antes de poder ser utilizado.
Todos los servicios de Windows deben derivarse de la clase ServiceBase. Esta clase base
Tome Nota
proporciona la estructura y funcionalidad básica para crear un servicio de Windows. Puede
La edición de Visual
invalidar los métodos de clase baseOnStart, OnStop, OnPause y OnContinue, para agregar
Studio Express no
su lógica personalizada que desearía para ejecutar, en respuesta de los cambios en estados
proporciona plantillas
de servicio.
para crear proyectos
de servicio de
El siguiente ejercicio demuestra cómo crear un servicio de Windows simple que escribe
Windows. Necesitará
mensajes a un Event log de aplicación. Los EventLogs son parte de Windows que son
Visual Studio para
utilizados por tareas del sistema operativo y aplicaciones ejecutándose en el fondo para
completar los
registrar errores u otros mensajes informativos. Windows defne tres event logs por
ejercicios que utilizan
defecto: Sistema, Aplicación y Seguridad. Las aplicaciones generalmente utilizan el event
los proyectos de
log de Aplicación para informar su mensaje. La utilidad del Visor de Sucesos puede ser
Servicio de Windows.
utilizada para ver los mensajes en los event logs.
Æ Crear un servicio de Windows
PREPÁRESE. Lance el Microsoft Visual Studio.
1. Cree un nuevo proyecto basado en la plantilla de Servicio de Windows.
Nombre el
proyecto FirstService, como se muestra en la Figura 5-11.
www.pdftron.com
Figura 5-11
Seleccionar la plantilla de
proyecto de Servicio de
Windows
IBEROÁMERICA
ETC 2. Seleccione la ventana de propiedades para Service1 y establezca las propiedades (Nam
y el ServiceName a “FirstService”.
3. En el Explorador de Soluciones, renombre el archivo Service1.cs a FirstService.cs. Abra
Program.cs y verifique que las referencias a Service1 han sido cambiadas a
FirstService.
4. Seleccione las ventanas de propiedades para el servicio y establezca la propiedad Can
Pause And Continue y la propiedad Can Shutdown a True.

150
Lección 5
5. Abra el diseñador para FirstService y agregue un componente EventLog desde el cuadro de
herramientas. El componente EventLog le permite conectarse con los eventlogs.
6. Vea el código para FirstService y modifique el constructor como se muestra a continuación
En este código, primero crea una fuente de evento con el nombre FirstService. El EventSource
es utilizado para distinguir mensajes generados por una aplicación específica de todos los
mensajes en un event log. Luego, establezca la propiedad Source del componente event
log al nombre del eventsource. La propiedad Log del componente event log, eventLog1, es
utilizado para especificar el event log utilizado para registrar los mensajes:
publicFirstService()
{
InitializeComponent();
if (!EventLog.SourceExists(“FirstService”))
{
EventLog.CreateEventSource(
“FirstService”, “Application”);
}
eventLog1.Source = “FirstService”;
eventLog1.Log = “Application”;
}
7. Agregue el siguiente código a los métodos de cambio de estado de servicio para definir su
comportamiento. El método WriteEntry del componente event log, eventLog1, es utilizado
para escribir un mensaje a un event log. Como parte del método puede especificar el tipo
www.pdftron.com
de mensaje. Por ejemplo, su mensaje puede ser error, advertencia o solo una pieza de
información:
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry(
“Iniciando el servicio”,
EventLogEntryType.Information, 1001);
IBEROÁMERICA
}
protected override void OnStop()
{
eventLog1.WriteEntry(
“Deteniendo el Servicio”,
ETC EventLogEntryType.Information, 1001);
}
protected override void OnPause()
{
eventLog1.WriteEntry(
“Pausando el servicio”,
EventLogEntryType.Information, 1001);

Comprender las Aplicaciones de Escritorio


151
}
protected override void OnContinue()
{
eventLog1.WriteEntry(
“Continuando el servicio “,
EventLogEntryType.Information, 1001);
}
protected override void OnShutdown()
{
eventLog1.WriteEntry(
“Apagando el servicio “,
EventLogEntryType.Information, 1001);
}
8. Seleccione Generar y después Generar Solución (o presione F6) para generar
el proyecto.
El código para FirstServicein valida los métodos OnStart, OnStop, OnPause, OnContinue
y OnShutdown para escribir mensajes al event log. No todos los servicios necesitan
invalidar estos métodos. Si un servicio necesita invalidar estos métodos depende del valor
de las propiedades Can Pause And Continue y Can Shutdown del servicio de Windows.
El método WriteEntry del event log toma el mensaje para escribirlo en el log, el tipo de
la entrada del event log (Información, Error, advertencia, etc.), y un eventId, el cual es una
id para especifcar la aplicación para identifcar el evento.
www.pdftron.com
El servicio de WindowsFirstService ahora está listo pero antes de que pueda utilizarse,
debe ser instalado en la base de datos de servicios de Windows. Esto se hace agregando
un Instalador de Servicio de Windows al proyecto de Servicio de Windows. El siguiente
ejercicio le muestra cómo hacer esto.
Tome Nota
La propiedad
Æ Agregar un instalador al servicio de Windows
StartType de la clase
ServiceInstaller indica
IBEROÁMERICA
PREPÁRESE. Lance el Microsoft Visual Studio.
cómo y cuándo un
servicio es iniciado. La
1. Abra el proyecto FirstService creado en el ejercicio previo. Haga clic derecho en la
propiedad StartType
superficie del Diseñador de FirstService.cs y seleccione la opción Agregar instalador
puede tener uno de
desde el menú de contexto.
tres valores posibles.
El valor Manual, el
2. Esta acción agrega un nuevo archivo ProjectInstaller.cs al proyecto. Abra el Diseñad
cual también es el
para ProjectInstall.cs. se dará cuenta que se agregan dos componentes al Diseñador, como
ETC
valor por defecto,
se muestra en la Figura 5-12.
indica que necesita
3. Acceda a las propiedades para el componente ProcessInstaller1y cambie la propiedad
iniciar el servicio
AccountaLocalService.
manualmente. El valor
Automatic indica que el
4. En seguida, accede a las propiedades del componente serviceInstaller1. Cambie la
servicio será iniciado
propiedad de DisplayNameaFirstService y la propiedad Description a “Una simple prueba
automáticamente
de servicio”. Note que el valor de la propiedad StartType es establecida por defecto a
cuando Windows
Manual.
inicie. El valor Disabled
5. Seleccione Generar, Generar Solución (o presione F6) para generar el proyecto. El servicio
indica que el servicio
de Windows ahora está listo para ser instalado.
no puede ser iniciado.

152
Lección 5
Figura 5-12
Vista de Diseñador para
ProjectInstaller.cs
Tome Nota
Cuando agrega un instalador a un proyecto de servicio de Windows, las clases
Con el fin de minimizar
ServiceProcessInstaller y ServiceInstaller son agregadas al proyecto. La clase
los riesgos a la
ServiceProcessInstaller desempeña tareas de instalación que son comunes a todos los
seguridad, a menos
servicios de Windows en una aplicación. Estas incluyen la confguración de la cuenta
que un servicio de
de inicio de sesión para el servicio de Windows. La clase ServiceInstaller, por otra parte,
Windows necesite
desempeña las tareas de instalación que son específcas a un solo servicio de Windows, tales
privilegios de
como la confguración de ServiceNameyStartType.
seguridad más altos
con el fin de funcionar,
La propiedad Account de la clase ServiceProcessInstaller especifca el tipo de cuenta
deberá abstenerse
bajo el cual se ejecutan los servicios. La propiedad Account es el tipo de enumeración de
de utilizar la cuenta
ServiceAccount donde los valores posibles son LocalService, LocalSystem, NetworkService
Local System para
y User. El valor LocalSystem especifca una cuenta con privilegios altos mientras la cuenta
ejecutar un servicio de
LocalService actúa como un usuario sin privilegios.
Windows.
Un archivo ejecutable que tiene el código para las clases del instalador de servicio puede
ser instalado utilizando la herramienta de instalador de línea de comando (installutil.exe).
El siguiente ejercicio muestra como instalar una aplicación de servicio de Windows en la
base de datos de servicios de Windows.
www.pdftron.com
Æ Instalar un Servicio de Windows
Tome Nota
PREPÁRESE. Para instalar un servicio de Windows, haga lo siguiente:
Instalar un servicio
1. Ejecute el símbolo del sistema de Visual Studio como administrador. Para acceder a
de Windows requiere
símbolo del sistema, vaya a Inicio seleccione Todos los Programas, después Visual Studio,
acceso al Registro de
posteriormente VisualStudio Tools y elija Símbolo del sistema de Visual Studio. Para ejecutar
Windows. Por lo tanto,
un programa como administrador en Windows, haga clic derecho en el acceso directo del
IBEROÁMERICA
necesita asegurarse
programa y seleccione la opción Ejecutar como administrador desde el menú.
que ejecuta el
installUtil.exe como
2. Cambie el directorio al directorio de salida del proyecto FirstService. Este es el directorio
administrador.
donde se ubican los archivos ejecutables.
3. Ejecute el siguiente comando, verá los resultados como se muestra en la Figura 5-
13
(instalar un servicio de Windows requiere acceso al Registro de Windows. Por lo tanto,
necesita asegurarse que ejecuta el installUtil.exe como administrador):
ETC installutil FirstService.exe
4. El servicio de Windows de FirstService ahora está instalado.
La aplicación de servicio de Windows ahora esta almacenada en la base de datos de
servicios de Windows. Anteriormente, cuando agrego un ServiceInstaller para FirstService,
Tome Nota
establece una propiedad StartTypedel componente serviceInstaller1 a Manual. Como
Para desinstalar un
resultado, necesitará iniciar manualmente el servicio cuando sea necesario. El siguiente
servicio de Windows,
ejercicio demuestra cómo iniciar, pausar, continuar y detener un servicio de Windows.
utilice InstallUtil.exe
con la opción -u.
Comprender las Aplicaciones de Escritorio
153
Figura 5-13
Vista de Diseñador para
ProjectInstaller.cs
Æ Trabajar con un servicio de Windows
PREPÁRESE. Lance la ventana de Administración de Equipos haciendo clic derecho en Mi P
seleccionando Administrar desde el menú.
1. En la ventana de Administración de Equipos, expanda la sección de Servicios y Aplicacion
y seleccione Servicios. Se muestra una lista de todos los servicios instalados en la
computadora como en la Figura 5-14.
Figura 5-14
La sección de servicios
le permite trabajar con
servicios instalados
www.pdftron.com
IBEROÁMERICA
2. Seleccione el servicio First Service y haga clic en el hiperenlace Iniciar, como se muestra
en la Figura 5-
14. Observa un cuadro de diálogo mostrando el progreso, como se muestra
ETC en la Figura 5-15. Cuando el servicio es iniciado, el estatus del servicio
cambia a Iniciado.
3. Expanda el nodo de Visor de Sucesos y seleccione el log de Windows de Aplicación. Podrá
ver un mensaje de First Service diciendo “Iniciando el Servicio”, como se muestra en la
Figura 5-16.
4. Regrese a la lista de Servicios e intente pausar, reanudar o detener el First Service. Revise
de nuevo el event log para verificar que los mensajes apropiados están siendo
mostrados.
En los últimos ejercicios vio cómo crear, instalar y utilizar un servicio de Windows.
También aprendió cómo agregar mensajes por medio de programación al even log de
Aplicación de Windows.

154
Lección 5
Figura 5-15
Mensaje de control de
servicio cuando se está
iniciando un servicio
Figura 5-16
Mensaje de control de
servicio cuando se inicia
un servicio
www.pdftron.com
IBEROÁMERICA
ETC
; ¿Listo para la
certificación?
¿Comprende cómo
desarrollar servicios de
Windows? — USD 5.3

Comprender los conceptos básicos de bases de datos


155
Resumen de Habilidades
En esta lección aprendió:
• Un Formulario de Windows es una superfcie visual que puede mostrar una
variedad de controles tales como cuadros de texto, botones y menús. Visual Studio
proporciona un diseñador de Windows Forms para arrastrar y soltar que puede
utilizar para crear sus aplicaciones.
• Cada formulario y control expone un conjunto predefnido de eventos. Cuando
ocurre un evento, el código en el manejador de evento asociado es invocado. El
modelo de eventos de los formularios de Windows utiliza delegados de .NET
Framework para enlazar los eventos a sus respectivos manejadores de eventos.
• La herencia Visual le permite reutilizar la funcionalidad existente y el diseño para
formularios de Windows.
• Las aplicaciones de interfaz de documentos múltiples son aplicaciones donde
múltiples ventanas hijo residen bajo una sola ventana padre.
• Las aplicaciones de consola no tienen una interfaz de usuario gráfca y utilizan una
ventana de consola de modo texto para interactuar con el usuario. Las aplicaciones
basadas en consola son más adecuadas para tareas que requieren una interfaz mínima
o que no requieren de una interfaz de usuario.
• Los servicios de Windows son ideales para la creación de aplicaciones de larga
ejecución que se ejecutan en el fondo y no tienen una interfaz de usuario.
• Puede crear servicios de Windows utilizando la plantilla de Servicio de Windows
de Visual Studio.
• Antes de que un servicio pueda ser utilizado, debe ser instalado en el Registro
de Windows. Para hacer esto, agrega el componente Installer a la aplicación de
www.pdftron.com
servicio de Windows. Esto le permitirá instalar el servicio de Windows utilizando
una herramienta de instalación tal como InstallUtil.exe.

» Evaluación de Conocimiento
Llene los espacios en blanco
IBEROÁMERICA
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
1. Utilice la propiedad _________________de la clase ServiceInstaller para especifcar
un breve comentario que explica el propósito del servicio.
2. La propiedad _________________ de la clase _________________ indica el tipo de
cuenta bajo el cual el servicio de Windows se ejecutará.
ETC 3. La propiedad ________________ de la clase EventLog es utilizada para especifcar el
nombre de la aplicación a utilizar cuando se escribe en un event log.
4. _____________________ le permite reutilizar la funcionalidad y diseño existentes
para formularios de Windows.
5. Las aplicaciones de _____________________ son aplicaciones donde múltiples
ventanas hijo residen bajo una sola ventana padre.
6. Un _________________ es ideal para la creación de aplicaciones de larda ejecución
que se ejecutan en el fondo y no tienen ninguna interfaz de usuario.

156
Lección 5
7. Las _________________ no tienen interfaz de usuario gráfca y utilizan una ventana
de consola de modo texto para interactuar con el usuario.
8. Las aplicaciones _______________ proporcionan su propia funcionalidad de
administración de ventana, mientras que las aplicaciones_______________ se basan
en el sistema operativo para la administración de ventana.
9. Un delegado puede ser enlazado a cualquier método del cual coincide la frma con la
de la_______________________.
10. Los _______________________ pueden ser enlazados a más de un método,
permitiendo notifcaciones de uno a muchos cuando un evento es disparado.
Opción Múltiple
Encierre en un círculo la letra que corresponda a la mejor respuesta.
1. Necesita diseñar un servicio de Windows que no puede ser pausado. ¿Cuál de las
siguientes opciones le ayudara a llevar a cabo esto?
a. Establecer la propiedad Can Pause And Continue del servicio de Windows a
False.
b. Establecer la propiedad del servicio de Windows a True.
c. Establecer la propiedad del servicio de Windows a True, pero establecer la
propiedad de Can Shutdown a False.
d. No anular los métodos On Pause y On Continue en el servicio de Windows.
www.pdftron.com
2. Ha desarrollado un servicio de Windows. Necesita instalar este servicio de Windows
con el fn de instalar su funcionalidad. ¿Cuál de las siguientes opciones debe elegir para
llevar a cabo esto?
a. Utilizar el Explorador de Servidores de Visual Studio.
b. Utilizar el nodo de Servicios en la ventana de Administración de Equipos.
c. Utilizar InstallUtil.exe.
d. Utilizar gacutil.exe.
IBEROÁMERICA
3. Ha desarrollado un servicio de Windows. Este servicio necesita ejecutarse como un
usuario sin privilegios con el fn de minimizar cualquier riesgo de seguridad. ¿Cuál de
las siguientes cuentas debe utilizar para ejecutar este servicio de Windows?
a. LocalSystem
ETC b. NetworkService
c. LocalService
d. User (donde la propiedad UserName está establecida a un miembro del rol de
administrador).
4. Está diseñando una aplicación de servicio de Windows que contiene sólo un servicio
de Windows. Le gustaría que este servicio se inicie automáticamente cuando la
computadora es reiniciada. ¿Cuál de las siguientes clases debe utilizar para especifcar
esta confguración?

Comprender los conceptos básicos de bases de datos


157
a. ServiceBase
b. ServiceInstaller
c. ServiceProcessInstaller
d. ServiceController
5. Necesita cambiar la visualización y comportamiento de un formulario de Windows de
forma que pueda contener múltiples ventanas hijo. ¿Qué debe hacer¿
a. Establecer la propiedad IsMdiContainer del formulario a true.
b. Establecer la propiedad de MdiParent para todas las ventanas hijo.
c. Establecer la propiedad MdiChilddel formulario.
d. Establecer la propiedad IsMdiChild del formulario.
6. Está desarrollando un formulario de Windows que responde a los eventos del ratón.
Cuando el ratón se mueve, necesita invocar al método Form1_HandleMouse. Cualquier
código que escriba no debería afectar ningún código de manejador de evento existente.
¿Qué sentencia debe utilizar para agregar el manejador de evento al evento?
a. this.MouseDown = new MouseEventHandler
(Form1_HandleMouse);
b. this.MouseMove = new MouseEventHandler
(Form1_HandleMouse);
c. this.MouseDown+= new MouseEventHandler
(Form1_HandleMouse);
www.pdftron.com
d. this.MouseMove+= new MouseEventHandler
(Form1_HandleMouse);
7. Está desarrollando un formulario de Windows con una interfaz de documentos
múltiples (MDI). Necesita escribir código que ordene las ventanas hijo verticalmente
dentro de la región del cliente con el formulario MDI padre. ¿Cuál de las siguientes
sentencias debe utilizar?
IBEROÁMERICA
a. LayoutMdi(MdiLayout.TileVertical);
b. LayoutMdi(MdiLayout.Cascade);
c. MdiLayout(LayoutMdi.TileVertical);
d. MdiLayout(LayoutMdi.Cascade);
8. Está desarrollando una aplicación para que sea ejecutada desde la línea de comando.
ETC ¿Cuál de los siguientes métodos debe utilizar para la salida de la línea de comando?
a. Console.Read
b. Console.Write
c. File.Read
d. File.Write

158
Lección 5
9. Está desarrollando una aplicación que muestra una superfcie visual capaz de mostrar
una variedad de controles tales como cuadros de texto, botones y menús. La aplicación
debería también permitir múltiples ventanas hijo que residan bajo una sola ventana
padre. ¿Cuál de los siguientes tipos de aplicación debe desarrollar?
a. Aplicación basada en consola.
b. Aplicación de Servicio de Windows.
c. Aplicación de interfaz de documentos simple (SDI).
d. Aplicación de interfaz de documentos múltiples (MDI).
10. Está extendiendo una aplicación de Windows existente. Le gustaría crear un nuevo
formulario que deriva sus características visuales tales como tamaño, color y algunos
controles desde un formulario creado previamente. ¿Qué técnica debe utilizar para
crear el nuevo formulario?
a. Herencia Visual
b. Encapsulación Visual
c. Abstracción Visual
d. Polimorfsmo Visual

» Evaluación de Competencia
Proyecto 5-1: Utilizar Herencia Visual
Necesita crear un Formulario de Windows similar a uno que creó en el ejercicio
VisualInheritance. Sin embargo, esta vez el requerimiento es que el color del fondo
www.pdftron.com
debe coincidir con el color seleccionado actualmente del escritorio del usuario. ¿Cómo
desarrollaría tal formulario?
Proyecto 5-2: Manejar el Evento Mouse Down
Está desarrollando un juego que permite a los usuarios golpear un área objetivo en un
formulario de Windows con el ratón. Necesita desarrollar un formulario experimental que
muestre las coordenadas X y Y de la ubicación cliqueada por el usuario en la barra de título
del formulario. ¿Cómo debe llevar a cabo esto?
IBEROÁMERICA

» Evaluación de Competencia
Proyecto 5-3: Trabajar con Entradas de Consola
Está desarrollando un programa que manipula texto. Necesita escribir una aplicación de
ETC consola que acepte texto del usuario y lo convierta a texto en letras mayúsculas. ¿Qué
código necesita escribir para cumplir este requerimiento?
Proyecto 5-4: Utilizar la utilidad Net (net.exe)
La utilidad de línea de comando net.exe viene instalada con Windows. Esta utilidad le
permite desempeñar varios comandos de red, incluyendo el control de los servicios de
Windows. En este ejercicio, utilizará el net.exe para trabajar con el servicio de Windows
creado previamente de First Service. ¿Qué pasos toma con el fn de pausar, detener e iniciar
un servicio de Windows utilizando la utilidad Net?

Lección 6
Comprender las Bases de Datos
Matriz de Dominio de Objetivos
Habilidad Tecnológica
Descripción de Dominio de Objetivo
Número del Dominio
del Objetivo
Comprender los Objetos
Comprender los sistemas de administración 6.1
de bases de datos relacionales
Comprender los Valores y Referencias
Comprender los métodos de consulta de
6.2
bases de datos
Comprender el encapsulamiento
Comprender los métodos de conexión de
6.3
bases de datos
Términos Clave
• Diagrama de entidad - relación
• Procedimiento almacenado
• Lenguaje de consulta estructurado
• Primera forma normal
parametrizado
• Tercera forma normal
• Archivos planos
• Segunda forma normal
• XML
• Normalización
• Procedimiento almacenado
www.pdftron.com
Es un desarrollador de software para la Northwind Corporation. Como parte de su trab
IBEROÁMERICA
interactúa y procesa datos acerca de clientes, productos, proveedores y órdenes. Su trabajo inv
interactuar con bases de datos relaciones tales como Microsoft SQL Server. Sin embargo, tamb
trabaja con información almacenada en otros formatos tales como archivos planos, archivos X
datos en memoria. Para ser efectivo en su trabajo, necesita saber cómo conectarse a varias fuen
datos y cómo recuperar y actualizar efectivamente datos en varios tipos de fuentes de datos.
ETC

160
Lección 6
� Comprender los conceptos de bases de datos
relacionales
È EN RESUMEN
Una base de datos relacional es una colección de datos interrelacionados que está basado en el
desarrollado por E.F. Codd. El modelo relación defne entidades de datos distintas, sus atributo
entidades.
Comprender las bases de datos
Una base de datos es una colección organizada de datos interrelacionados que es administrada
Una base de datos le permite almacenar, administrar y recuperar información de negocios
importante. Si una base de datos es diseñada apropiadamente, puede ser utilizada por
múltiples aplicaciones y por múltiples usuarios. Un sistema de administración de base
de datos (DBMS), por otro lado, es un software que organiza bases de datos y proporciona
facilidades tales como almacenamiento, acceso de datos, seguridad, respaldo, etc. Los
ejemplos de DBMS populares incluyen el Microsoft SQL Server, Microsoft Access, Oracle
y MySql.
Los sistemas de administración de bases de datos pueden ser implementados basados en
diferentes modelos. El modelo relacional es el modelo de base de datos más popular. En
el modelo relacional, los datos están organizados en tablas donde cada tabla puede tener
www.pdftron.com
múltiples flas. Los DBMS basados en modelos relaciones son llamados DBMS relacionales.
SQL Server, Access, Oracle y MySql son todos RDBMSs.
Otros sistemas de administración de bases de datos están basados en modelos diferentes.
Por ejemplo, el Object DBMS (ODBMS) está basado en el modelo de objeto donde los
datos son almacenados como una colección de objetos. En esta lección. Nos enfocaremos
solamente a las bases de datos relacionales más populares.
Los DBMS relacionales utilizan el lenguaje de consulta estructurado (SQL) para recuperar
IBEROÁMERICA
y manipular datos. Los sistemas de administración de bases de datos relacionales más
populares proporcionan soporte para la versión estandarizada de SQL, permitiéndole
utilizar sus habilidades a través de distintos sistemas de bases de datos relacionales.
Comprender los conceptos de bases de datos relacionales
Una base de datos relacional organiza datos en tablas bidimensionales que consisten de flas y
ETC Una base de datos relacional organiza información en tablas. Una tabla es una lista de fla
y columnas que es conceptualmente similar a una hoja de trabajo de Microsoft Excel. Una
fla también es llamada registro o tuple. A una columna también se le conoce como campo.
La columna o campo especifca el tipo de datos que serán almacenados en cada registro
de la tabla. Por ejemplo, las órdenes personalizadas pueden ser almacenadas en una tabla
Orders donde cada fla representa una orden única. Las columnas tales como Order Date
especifcan si un valor valido es del tipo correcto de dato. Un ejemplo de la tabla Order
aparece en la Figura 6-1.

Comprender las Bases de Datos


161
Figura 6-1
Una tabla de base de
datos
Comprender el diseño de bases de datos relacionales
Diseñar una base de datos relacional es un proceso que determina la estructura de base de dato
que satisfaga los requerimientos del negocio.
La información de una organización probablemente es el activo más importante. Cuando
diseña una base de datos, unos de los principios rectores es garantizar la integridad de la
base de datos. Integridad signifca que los datos en la base de datos son siempre precisos
y consistentes .
El proceso de diseño de base de datos consiste de los siguientes pasos:
1. Desarrollar un enunciado de misión para la base de datos. Esto identifcará el
propósito de la base de datos, cómo será utilizada y quién la utilizará. Este paso
www.pdftron.com
establece el tono para el resto del proceso de diseño.
2. Determinar la información que necesita sea almacenada. En este paso, identifca los
tipos de datos que necesitan ser almacenados en la base de datos. Generalmente la
información es reunida como parte de los requerimientos de la tarea de análisis por
medio de diagramas entidad - relación.
3. Dividir los datos en tablas y columnas. En este paso identifca las tablas y la
información que desea almacenar en esas tablas.
IBEROÁMERICA
4. Elegir claves principales. Una clave principal es una columna o conjunto de
columnas que identifcan únicamente a cada fla de datos en una tabla.
5. Identifcar relaciones. En este paso identifca cómo los datos en una tabla están
relacionados a los datos en otra tabla. Por ejemplo, para cada cliente en la tabla
Customers, puede tener muchas órdenes en la tabla Orders, esta relación es llamada
relación de uno a muchos.
6. Aplicar el proceso de normalización. En este paso fnal, aplica reglas de normalización
ETC para garantizar que cualquier problema que pudiera afectar la integridad de los
datos está resuelto. Más adelante aprenderá acerca del proceso de normalización .
Después de que ha establecido el propósito de la base de datos, el siguiente conjunto
de pasos (Paso 2 al Paso 5) pueden ser completados como parte del modelado entidad -
relación. El paso fnal de normalización puede ser entonces aplicado a la salida desde el
modelado entidad - relación.

162
Lección 6
Comprender los diagramas Entidad - Relación
Los diagramas Entidad –
Relación se utilizan para modelar las entidades, sus atributos y las relaciones entre las
entidades. Los diagramas Entidad - Relación pueden ayudarle a determinar los datos que nece
en la base de datos.
El modelado Entidad –
Relación es un proceso de modelado para crear el modelo de datos
conceptual de un sistema. Los diagramas Entidad –
Relación (ERD) son la herramienta
de modelado gráfco para llevar a cabo el modelado Entidad –
Relación. Los bloques de
construcción básicos para un ERD son Entidad, Atributos y Relación.
• Entidad: Una entidad es la construcción de un objeto físico o un concepto.
Los ejemplos incluyen una orden, un cliente, un empleado, etc. Una entidad
generalmente es llamada por el nombre que representa.
• Atributo: Los atributos son las distintas propiedades de una entidad. Por ejemplo,
para una entidad Order, algunos atributos útiles podrían ser Order Number, Order
Date, Ship Date, Ship Via, etc. Para una entidad Employee, algunos atributos
útiles podrían ser EmployeeId,LastName, FirstName, Title, HireDate, etc. Cada
entidad debe tener un conjunto de atributos de identifcación única que es la
clave principal de la entidad. Por ejemplo, un OrderNumber es un atributo que
identifca como única a una orden y por lo tanto es una clave principal para la
entidad Order.
• Relación: Una relación es una asociación entre entidades. Por ejemplo, Takes es una
relación entre la entidad Employee y una entidad Order (EmployeeTakesOrder).
Los diagramas ER no muestran entidades simples o relaciones simples. Por ejemplo, puede
haber miles de entidades Order y cientos de entidades Customer. En lugar de eso, ellos
muestran conjuntos de entidades y conjuntos de relaciones. Por ejemplo, todas las miles
www.pdftron.com
de entidades Order conforman un conjunto de entidades. Cuando una Order o Customer
aparecen en el diagrama ER, regularmente se refere a un conjunto de entidades en lugar
de una entidad individual.
En un diagrama ER:
• Un rectángulo representa un conjunto de entidades.
• Una elipse representa un atributo.
• Un diamante representa un conjunto de relaciones.
IBEROÁMERICA
• Las líneas sólidas enlazan conjuntos de entidades a relaciones y conjuntos de
entidades a atributos.
La Figura 6-
2 muestra un ejemplo de diagrama ER. En este diagrama ER, los dos conjuntos
de entidades son Customer y Order. Los atributos asociados con Customer son ID, Name
y City. Los atributos asociados con Order son Order ID, Order Date y Ship Date. Los
atributos que forman una clave principal están subrayados. La relación entre Customer y
ETC Order es Places.
Una relación puede ser clasifcada como relación uno a uno, relación uno a muchos o
relación muchos a muchos. En la Figura 6-
2, la línea que conecta la relación Places con
Customer esta etiquetada “1”, mientras que la línea entre Places y Order esta etiquetada
“N”. Este es un ejemplo de relación uno a muchos. Por lo tanto, en esta relación un cliente
puede colocar muchas órdenes, pero una orden solo puede tener un cliente asociado con
ella.

Comprender las Bases de Datos


163
Figura 6-2
Un diagrama Entidad -
Relación
Mapear diagramas ER a una base de datos relacional
Con el fn de convertir un diagrama ER a una base de datos relacional, haga lo siguiente:
1. Mapee las entidades: Cree una tabla para cada conjunto de entidades en el diagrama.
Los atributos serán columnas. Establezca el atributo de clave principal a las columnas de clave
principal de la tabla.
2. Mapee la Relación: Puede mapear la relación uno a muchos asegurándose que la tabla
en el lado N de la relación contiene la columna clave de la tabla en el lado 1 de la relación.
Para la Figura6-
2, esto puede ser llevado a cabo agregando una columna Customer ID en la
tabla Order que mapea a la columna ID a la tabla Customer. En el contexto de la tabla Order,
es posible responder preguntas tales como “¿Cuáles son todas las órdenes colocadas por un
cliente específico?” y “¿Quién es el cliente para una orden específica?”
www.pdftron.com
El diagrama ER en la Figura 6-
2, cuando se mapea a una base de datos relación, se
generan las siguientes tablas:
Clientes
ID
Name
City
1001
Jane Doe
Berlin
IBEROÁMERICA
1002
John Doe
Tokyo
1003
Howard Steel
Sydney
Ordenes
ETC OrderID CustomerId OrderDate ShipDate
101
1001
10/1/2010
10/7/2010
102
1002
10/5/2010
10/10/2010
103
1001
10/4/2010
10/10/2010

164
Lección 6
Comprender la normalización
El proceso de normalización de datos garantiza que el diseño de la base de datos está libre de c
podría llevar a la pérdida de la integridad de datos.
El análisis Entidad –
Relación le ayuda a garantizar que ha identifcado los elementos de
información correctos para su base de datos. En la normalización, aplica un conjunto de
reglas de normalización para garantizar que tiene el diseño correcto de base de datos. Esto
es, las columnas pertenecen a las tablas correctas con el fn de garantizar que su base de
datos está libre de cualquier problema indeseado.
Por ejemplo, como parte del análisis de entidad –
relación, puede tener una tabla Book que
tiene las siguientes columnas:
Books
BookId
BookName
CategoryId
CategoryName
1
Cocina ligera
1001
Cocina
2
Profecía
1002
Misterio y Suspenso
3
Cambio
1003
Negocios
4
La Confesión
1002
Misterio y Suspenso
Pero este diseño sufre de los siguientes tres problemas:
• Anomalía de Insert: La anomalía de Insert es una situación donde no puede
insertar nueva información en la base de datos debido a una dependencia no
www.pdftron.com
relacionada. Por ejemplo, si desea que su base de datos tenga una nueva CategoryId
y un CategoryName para libros de historia, el diseño actual no lo permitirá a menos
que primero tenga un libro de historia para ubicarlo en esa categoría.
• Anomalía de Delete: La anomalía delete es una situación donde la eliminación
de datos le causa pérdida no intencionada de otra información. Por ejemplo, si
fuera a eliminar el BookId 3 de la tabla Books, el hecho de que ha tenido un
CategoryName de Negocios será pérdida.
• Anomalía de Update: La anomalía update es una situación donde actualizar un
solo dato requiere que múltiples flas sean actualizadas. Por ejemplo, digamos que
IBEROÁMERICA
ha decidido cambiar el nombre de categoría de Misterio y Suspenso a solamente
Misterio. Con el diseño de tabla actual, tendrá que cambiar el nombre de la
Tome Nota
categoría para cada libro en esa categoría. También hay el riesgo de que si actualiza
La normalización puede
el nombre de la categoría en una tabla pero no en otra, terminará teniendo datos
ayudarle a garantizar
inconsistentes en la base de datos.
un diseño de base de
datos correcto, pero no
Cada uno de estos problemas puede ser reparado siguiendo el proceso de normalización.
puede garantizarle que
ETC Hay cinco formas normales, estas formas son utilizadas como parte del proceso de
tiene los elementos de
normalización. Esta lección solo discute las primeras tres, ya que son las requeridas en la
información correctos
mayoría de los casos.
para empezar.
Primera Forma Normal
Con el fn de que una tabla esté en la primera forma normal (1NF), ninguna de las
columnas deberá tener múltiples valores en la misma fla de datos. Por ejemplo, si una
tabla Customers almacena datos como se muestra abajo, entonces la tabla Customers no
está en la 1NF debido a que la columna PhoneNumber está almacenando más de un valor.

Comprender las Bases de Datos


165
Customer
Id
FirstName
LastName
PhoneNumber
1
Jane
Doe
(503) 555-6874
2
John
Doe
(509) 555-7969, (509) 555-7970
Tome Nota
3
Howard
Steel
(604) 555-3392, (604) 555-3393
Una práctica general
consiste en subrayar
el nombre de la
columna(s) de una
Para que esta tabla este en la 1NF, necesita dividir la tabla en dos:
tabla que son parte de
la clave principal.
Customer
Id
FirstName
LastName
1
Jane
Doe
2
John
Doe
3
Howard
Steel
CustomerPhones
Id
PhoneNumber
1
(503) 555-6874
Tome Nota
www.pdftron.com
2
(509) 555-7969
Crear columnas
repetidas tales como
2
(509) 555-7970
PhoneNumber1 y
3
(604) 555-3392
PhoneNumber2 para
3
(604) 555-3393
normalizar la tabla
Customer no es una
solución aceptable
Aquí, la tabla Customer y la tabla CustomerPhones están ambas en la 1NF. Ambas tablas
debido a que la 1NF
tienen una clave principal (Id en la primer tabla y la combinación de Id y PhoneNumber
no permite repetir
en la segunda tabla) que establece una relación entre ellas. Dando cualquier Id para
IBEROÁMERICA
columnas.
un cliente, puede encontrar todos los números telefónicos para ese cliente sin ninguna
confusión. Por otra parte, LastName no es una clave principal debido a que el apellido
tendrá entradas duplicadas.
Segunda Forma Normal
Para que una tabla esté en la segunda forma normal (2NF), primero debe cumplir los
ETC requerimientos para 1NF. Además, la 2NF requiere que todas las columnas que no son
clave sean funcionalmente dependientes de toda la clave principal.
Con el fn de comprender la 2NF, primero debe comprender la dependencia funcional.
Tomemos el ejemplo de la tabla Customers de arriba. En la tabla Customers, la columna Id
es la clave principal, ya que identifca de forma única a cada fla. Las columnas FirstName
y LastName no son columnas clave debido a que no son parte de la clave principal.
Tanto FirstName y LastName son funcionalmente dependientes de Id debido a que,
dando un valor de Id, siempre puede encontrar un valor para el FirstName y LastName
correspondiente sin ninguna ambigüedad. No hay una columna que no sea clave en la

166
Lección 6
Tome Nota
tabla Customers que no sea funcionalmente dependiente de la clave principal. Las tablas
Customer y CustomerPhones ya están en la 2NF.
La 2NF solo aplica
a tablas que tengan
claves principales
Sin embargo, tome el ejemplo de la siguiente tabla:
compuestas (múltiples
columnas juntas
Ordenes
forman una clave
principal). Los valores
OrderId
CustomerId
OrderDate
CustomerName
combinados de
todos los cambios en
101
1
10/1/2010
Jane Doe
una clave principal
102
2
10/5/2010
John Doe
compuesta deben ser
103
1
10/4/2010
Jane Doe
únicos.
Si una tabla satisface
Aquí, las columnas OrderId y CustomerId juntas identifcan una fla única y por lo tanto
la 1NF y tiene una sola
hacen una clave principal compuesta. Sin embargo, la columna OrderDate es funcionalmente
columna en la clave
dependiente solo en OrderId, y CustomerNamees dependiente solo en CustomerId. Esto
principal, entonces la
viola la 2NF debido a que las columnas que no son clave son funcionalmente dependientes
tabla también se ajusta
en parte de la clave principal.
a 2NF.
Una manera posible en la que puede modifcar la tabla Orders para que se ajuste a la 2NF
es sacar a CustomerName fuera de la tabla y tener solo tres columnas OrderId, CustomerId
y OrderDate, donde solo OrderId es la clave principal. En esta solución, tanto CustomerId
y OrderDate son funcionalmente dependientes en OrderId y en consecuencia se ajusta a
la 2NF.
Tercera Forma Normal
www.pdftron.com
La tercera forma normal (3NF) requiere que 2NF debe cumplirse y que no haya dependencia
funcional entre los atributos que no son clave. En otras palabras, cada atributo que no es
clave debe ser dependiente solo de la clave principal y nada más. Por ejemplo, considere
la siguiente tabla:
Items
ItemId
SupplierId
ReorderFax
101
100
(514) 555-2955
IBEROÁMERICA
102
11
(514) 555-9022
103
525
(313) 555-5735
Aquí ItemId es la clave principal. El ReorderFaxes un número de fax para el proveedor y por
lo tanto es funcionalmente dependiente en el SupplierId. Para satisfacer el requerimiento
de 3NF, esta tabla debe ser descompuesta en dos tablas: Items (ItemId, SupplierId) y
ETC Supplier (SupplierId, ReorderFax).
Items
ItemId
SupplierId
101
100
102
11
103
525

Comprender las Bases de Datos


167
; ¿Listo para la
Supplier
certificación?
¿Comprende las
SupplierId
ReorderFax
bases de los sistemas
100
(514) 555-2955
de administración
de bases de datos
11
(514) 555-9022
relacionales?
525
(313) 555-5735
— USD 6.1

� Comprender los métodos de consulta de bases de
datos
È EN RESUMEN
Los datos son esenciales para muchas aplicaciones de negocios y como desarrollador le gusta
trabajando en tareas relacionadas con información. En esta sección aprenderá cómo utilizar el
estructurado (SQL) y los procedimientos almacenados de SQL Server para seleccionar, inserta
información.
SQL es el lenguaje utilizado por la mayoría de los sistemas de bases de datos para administrar
datos en la base de datos. comandos de SQL pueden permitirle recuperar y actualizar
datos. Los comandos de SQL también le permiten crear y administrar objetos de bases de
datos tales como tablas. SQL puede ser considerado como un lenguaje de programación
para bases de datos relacionales. Sin embargo, SQL es declarativo por naturaleza, como
www.pdftron.com
opuesto a la naturaleza imperativa de los lenguajes de programación más comunes.
En SQL, le dice a la base de datos lo que necesita hacer y es trabajo de la base de datos
averiguar cómo hacerlo. Por ejemplo, puede decir: seleccionar las primeras 10 flas de una
tabla. Compare esto con un lenguaje de programación imperativo tal como C#, donde
necesita especifcar en detalle cómo debe ser desempeñado el trabajo: por ejemplo, crear
un ciclo que se ejecute diez veces, establezca e inicialice variables, mover el registro de
punteros, etc.
IBEROÁMERICA
SQL es un estándar ANSI (Instituto Nacional Americano de Estándares), pero diferentes
proveedores de bases de datos han implementado sus propias extensiones al estándar SQL.
La implementación de Microsoft SQL Server de SQL es llamado Transact-
SQL (T-SQL).
Hay dos maneras principales para entregar T-
SQL a SQL Server. Puede, ya sea utilizar
sentencias ad-
hoc que son ejecutadas directamente o utilizar procedimientos almacenados.
Los procedimientos almacenados con una colección de sentencias SQL y de programación
lógica que es almacenada en el servidor de base de datos como objetos nombrados.
ETC
Trabajar con consultas de SQL
Las sentencias SELECT, INSERT, UPDATE y DELETE son los cuatro tipos principales de se
para manipular datos en SQL Server.
Utilizando consultas ad-
hoc SQL es una manera fexible para trabajar con una base de
datos de SQL Server. En esta lección, aprenderá acerca de lo esencial de los cuatro tipos
principales de sentencias de SQL que le ayudan a manipular los datos de SQL Server:
168
Lección 6
• Las sentencias SELECT le permiten recuperar información almacenada en la base
de datos.
• Las declaraciones INSERT le permiten agregar nueva información a la base de
datos.
• Las sentencias UPDATE le permiten modifcar información existente en la base
de datos.
• Las sentencias DELETE le permiten eliminar información de la base de datos.
Conectarse a una base de datos de SQL server
Necesita conectarse a una base de datos de SQL Server antes de que pueda manipular informa
Tome Nota
En esta lección, aprenderá como trabajar con una base de datos de Microsoft SQL Server.
Si no tiene acceso a una versión reciente de SQL Server, puede descargar el SQL Server
En la edición del Visual
2008 Express gratis desde microsoft.com/express/database. Esta lección utilice la base
Studio Express, la
de datos de ejemplo de SQL Server de Northwind. Esta base de datos no está instalada por
ventana del Explorador
defecto con SQL Server pero puede descargar el archivo de la base de datos siguiendo las
de Servidores se llama
instrucciones en
Explorador de Bases
msdn.com/en-us/library/ms143221.aspx.
de Datos y puede
abrirse seleccionando
El siguiente ejercicio muestra como conectarse y utilizar la base de datos de Northwind
Ver, Otras Ventanas,
con Visual Studio.
Explorador de Bases
de Datos.
Æ Conectarse a la base de datos de Northwind
PREPÁRESE. Antes de empezar estos pasos, asegúrese de lanzar el Microsoft
Visual Studio.
www.pdftron.com
1. Abra la ventana de Explorador de Servidores. Seleccione el nodo Conexiones de Da
y haga clic en el botón Conectar con Base de Datos en la barra de herramientas del
Explorador de Servidores.
2. En el cuadro de diálogo de Agregar Conexión, navegue al archivo de base de datos de la
base de datos de Northwind (northwnd.mdf), como se muestra en la Figura 6-3.
Figura 6-3
Conectándose a una base
de datos
IBEROÁMERICA
ETC
Comprender las Bases de Datos
169
3. Utilice la Autenticación de Windows como modo de autenticación y presiones el bo
Probar Conexión para asegurarse que puede conectarse a la base de datos. Finalmente,
haga clic en el botón Aceptar para agregar la conexión a la base de datos.
4. Una vez que la conexión a la base de datas es establecida, la base de datos está disponible
como conexión bajo el nodo de Conexiones de Datos en el Explorador de Servidores.
Expanda la base de datos para ver tablas, procedimientos almacenados y otros objetos de
la base de datos, como se muestra en la Figura 6-4.
Figura 6-4
Accediendo a una base
de datos a través del
Explorador de Servidores
www.pdftron.com
5. Haga clic derecho en el nodo NORTHWND.MDF y seleccione propiedades. Se mostrará
la ventana de propiedades en la Figura 6-
5. Note la propiedad de Cadena de Conexión.
Se mostrará el valor de esta propiedad para conectarse a esta base de datos desde una
aplicación de C#.
Figura 6-5
Propiedades de la base
IBEROÁMERICA
de datos
ETC
PAUSA. Accederá a los datos desde la base de datos de Northwind en el
siguiente ejercicio.
170
Lección 6
Ejecutar Consultas SQL
Hay muchas maneras disponibles para comunicarse con un SQL Server con el fn de ejecutar s
Hay muchas maneras por las cuales puede enviar consultas a un SQL Server. Por ejemplo,
puede utilizar:
• Entorno de Desarrollo Integrado de Visual Studio (IDE)
• Aplicación C#
• SQL QueryAnalyzer
• Utilidad osqlcommandprompt
Las utilidades de SQL Query Analyzer y osqlcommand-
prompt son herramientas
instaladas con SQL Server.
Æ Ejecutar consultas desde Visual Studio
PREPÁRESE. Para utilizar las aplicaciones de Visual Studio IDE y C# para ejecutar consultas
desempeñe lo siguiente:
1. Seleccione la base de datos de Northwind en el Explorador de Servidores. Haga cli
derecho y seleccione Nueva Consulta, esta acción abre un Diseñador de Consultas y
muestra un cuadro de diálogo de Agregar Tabla. Seleccione la tabla Customers y haga clic
en Agregar. Haga clic en Cerrar en el cuadro de diálogo de Agregar Tabla.
2. En el panel SQL del diseñador de consulta (el cual es el área que muestra el texto de la
consulta), modifique la sentencia SQL a lo siguiente:
www.pdftron.com
SELECT * FROM Customers
3. Desde el menú de Visual Studio, seleccione Diseñador de Consultas, la opción Ejecutar SQ
o haga clic en el botón de Ejecutar SQL en la barra de Herramientas. La sentencia SQL es
enviada al servidor SQL para la ejecución y sus resultados son mostrados como se muestra
en la Figura 6-6.
Figura 6-6
IBEROÁMERICA
Diseñador de Consultas
de Visual Studio
ETC

Comprender las Bases de Datos


171
El Diseñador de Consultas en Visual Studio muestra cuatro paneles. Desde arriba para
abajo, los paneles están como sigue:
• El Panel de Diagrama, el cual muestra las tablas involucradas en la consulta y la
relación entre estas tablas, así como también todas las columnas que contiene la
tabla.
• El Panel de Criterios, el cual muestra las columnas que han sido seleccionadas como
parte de la consulta, así como también información para ordenar y fltrar.
• El panel SQL, el cual muestra la sentencia SQL actual que será ejecutada.
• El panel de Resultados, el cual muestra los resultados (si hay) después de que la
consulta ha sido ejecutada.
La barra de herramientas del Diseñador de Consultas incluye botones que puede utilizar
para esconder o mostrar cualquiera de estos cuatro paneles. Para esta lección, necesita solo
el panel SQL y el panel de Resultados.
Æ Ejecutar Consultas desde una Aplicación de C#
PREPÁRESE. Para ejecutar consultas desde aplicaciones de C#, haga lo
siguiente:
1. Cree un nuevo proyecto de Aplicación para Windows llamado Query CS.
2. En el Formulario para Windows, agregue un control TextBox, un control
Button y un
control DataGridView. Establezca la propiedad MultiLine del TextBoxaTrue.
Establezca la
propiedad Text del control Button para Ejecutar SQL.
3. Haga doble clic en el control Button para generar un manejador de evento
para su evento
Click. Modifique el manejador de evento como se muestra abajo:
private void button1_Click(
www.pdftron.com
object sender, EventArgs e)
{
if (textBox1.TextLength > 0)
{
SelectData(textBox1.Text);
}
}
IBEROÁMERICA
4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de
conexión
para que coincida con la ruta local del archivo de la base de datos en su
computadora:
private void SelectData(string selectCommandText)
{
try
{
ETC // Cambie la cadena de conexión
// para que coincide con su sistema.
string selectConnection =
@”Data Source=.\SQLEXPRESS;” +
@”AttachDbFilename=” +
@”c:\SqlSampleDB\NORTHWND.MDF;” +
@”Integrated Security=True;” +
@”Connect Timeout=30;User Instance=True”;
SqlDataAdapter dataAdapter =
new SqlDataAdapter(
selectCommandText, selectConnection);

172
Lección 6
DataTable table = new DataTable();
dataAdapter.Fill(table);
dataGridView1.DataSource = table;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
5. Agregue la siguiente directiva using al código:
usingSystem.Data;
usingSystem.Data.SqlClient;
6. Seleccione Depurar y después Iniciar Depuración para ejecutar el proyecto. Introduzca
una consulta SQL y haga clic en el control Button. Podrá ver la salida como se muestra en
la Figura 6-7.
Figura 6-7
Ejecutando consultas
desde una aplicación
de C#
www.pdftron.com
IBEROÁMERICA
El código en este ejercicio implementa un método SelectData que inicializa un objeto
SqlDataAdapter y lo utiliza para llenar un DataTable. El DataTable es entonces enlazado
como una fuente de datos para el componente DataGridView. El objeto SqlDataAdapter
actúa como una tubería entre SQL Server y el DataTable para recuperar datos. El método
Fill cambia los datos en el DataTable para que coincidan los datos en la fuente de datos. El
select CommandText es utilizado para identifcar los datos en la fuente de datos.
Seleccionar Datos
ETC
La sentencia SELECT es utilizada para recuperar datos desde una o más tablas de la base de d
La sentencia SELECT generalmente es de la siguiente forma:
SELECT lista_de_campos
FROM lista_de_tablas

Comprender las Bases de Datos


173
WHERE clausula_where
GROUP BY agrupado_por_clausula
HAVING clausula_teniendo
ORDER BY clausula_ordenar_por
Cada una de estas líneas de código en la sentencia SELECT es llamada cláusula. El SELECT
y FROM son requeridos y el resto son opcionales. Por ejemplo, está una sentencia SQL que
contiene solo las clausulas requeridas:
SELECT OrderId, CustomerId
FROM Orders
Si desea enlistar todos los campos de la tabla, también puede utilizar el siguiente atajo
en lugar de enlistar explícitamente todos los campos:
SELECT *
FROM Orders
También puede seleccionar información desde múltiples tablas, por ejemplo:
Select OrderId, Customers.CustomerId, ContactName
From Orders, Customers
www.pdftron.com
Customers.CustomerId es llamado un nombre totalmente califcado, especifcando tanto
el nombre de la tabla como el nombre del campo. Esto es necesario debido a que tanto la
tabla Orders y la Customers incluyen este campo y necesita decirle al SQL Server a cuál
desea referirse.
Si ejecuta esta consulta, obtendrá mucho más registros de los que podría haber esperado.
Esto sucede debido a que aunque le dice a SQL Server cuales tablas incluir, no incluyó
ninguna información para cómo relacionar esas tablas. Como resultado, SQL Server
IBEROÁMERICA
construye el resultado para que incluya todas las flas de la tabla Customer para cada fla
de la tabla Orders. Este tipo de unión es llamado cross join y no es muy útil en este caso.
Una consulta más útil, por supuesto, coincidiría cada orden con su respectivo cliente. La
palabra clave INNER JOIN puede ayudarle a llevar a cabo esto, como se muestra en la
siguiente consulta:
ETC SELECT OrderID, Customers.CustomerId, ContactName
FROM Orders INNER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
Esta consulta le dice a SQL Server que tome cada fla en la tabla Orders y que empate
todas las flas en la tabla Customers en las cuales el CustomerId de la orden es igual al
CustomerId del cliente. Debido a que CustomerId es único en la tabla Customers, esto es
lo mismo que solo incluir una sola fla para cada orden en los resultados. En este caso, como
resultado tendrá tantas flas como las hay en la tabla Orders.

174
Lección 6
¿Pero y si desea ver solo algunas de las flas en la tabla? Puede utilizar una clausula
WHERE. La cláusula WHERE evalúa a cada fla para una condición y decide si incluirla
o no en los resultados. Por ejemplo:
SELECT *
FROM Orders
WHERE ShipCountry = ‘Canada’
Tome Nota
Aquí la cláusula WHERE mira a cada fla en la tabla Orders para ver si ShipCountry tiene
El delimitador estándar
el valor exacto “Canadá”. Si lo tiene, la fla es incluida en los resultados, si no, la fla no es
para texto y fechas
incluida en los resultados.
en SQL es una comilla
simple.
También puede combinar múltiples condiciones en una sola cláusula WHERE. Por
ejemplo:
SELECT *
FROM Orders
WHERE (ShipCountry = ‘Canada’)
AND (OrderDate>= ‘01/01/97’)
AND (OrderDate<= ‘01/31/97’)
Aquí las condiciones WHERE fltran las órdenes donde ShipCountry es “Canadá” y la
www.pdftron.com
fecha de orden es en Enero de 1997.
Por defecto, SQL no garantiza que los resultados estén en un orden particular, sin embargo,
puede utilizar la cláusula ORDER BY para garantizar que los datos son regresados en un
orden particular. Por ejemplo, para enlistar las órdenes basadas en la fecha de orden puede
utilizar la siguiente consulta:
SELECT *
IBEROÁMERICA
FROM Orders
WHERE (ShipCountry = ‘Canada’)
AND (OrderDate>= ‘01/01/97’)
AND (OrderDate<= ‘01/31/97’)
ETC ORDER BY OrderDate
Puede modifcar el tipo de orden utilizando ya sea la palabra clave ASC (para orden
ascendente) o DESC (para orden descendiente). El tipo de orden por defecto es ascendente.
La siguiente consulta enlista las órdenes más recientes en la parte superior:
SELECT *
FROM Orders
Comprender las Bases de Datos
175
WHERE (ShipCountry = ‘Canada’)
AND (OrderDate>= ‘01/01/97’)
AND (OrderDate<= ‘01/31/97’)
ORDER BY OrderDate DESC
Es muy común para las aplicaciones de negocios el solicitar información agregada o
resumida. Tales requerimientos pueden ser direccionados utilizando la cláusula GROUP
BY y las funciones agregadas.
Por ejemplo, puede utilizar la siguiente consulta para encontrar a cuáles países está
embarcando más en sus órdenes:
SELECT ShipCountry, COUNT (ShipCountry) AS OrderCount
FROM Orders
GROUP BY ShipCountry
ORDER BY OrderCount DESC
Esto mostrará el nombre del país seguido por el número total de órdenes que embarca a
ese país. La cláusula ORDER BY ordena los resultados y ubica los países con más órdenes
en la parte superior de la lista.
Puede pensar en la cláusula GROUP BY como creador de “buckets”, en este caso uno para
www.pdftron.com
cada país. Conforme cada motor de base de datos examina cada registro, lo coloca en el
bucket apropiado. Después de que este proceso es llevado a cabo, el motor de base de datos
cuenta el número de registros que terminaron en cada bucket y genera una fla para cada
uno. La Figura 6-8 muestra el inicio de los resultados de esta consulta.
Figura 6-8
Resumiendo información
utilizando la cláusula
IBEROÁMERICA
GROUP BY
ETC

176
Lección 6
En la sentencia SQL previa, Count es una función agregada, una función que retorna un result
grupo de flas. T-
SQL soporta un número de funciones agregadas. Aquí hay algunos de los más comunes:
• Count: Retorna el número de registros.
• Sum: Valor total en una columna dada.
• Avg: Valor promedio en una columna dada.
• Min: Valor más pequeño en una columna dada.
• Max: Valor más grande en una columna dada.
Actualizar datos
La sentencia UPDATE es utilizada para actualizar datos en las tablas de la base de datos.
Otra sentencia SQL muy útil es la sentencia UPDATE. El propósito de una sentencia
UPDATE es actualizar o modifcar datos. Por ejemplo, puede actualizar un campo en un
registro en la tabla Customers utilizando esta consulta:
UPDATE Customers
SET ContactName = ‘Maria Anderson’
Tome Nota
WHERE CustomerId = ‘ALFKI’
En una sentencia
En esta consulta, la palabra clave SET le dice a SQL Server cuales columnas actualizar y la
UPDATE la cláusula
palabra clave WHERE le dice cuales flas actualizar. En la tabla Customers, el CustomerId
SET es requerida y
es una clave principal y únicamente identifca a una sola fla. De manera que esta sentencia
puede ser especificada
update puede actualizar a lo mucho una fla.
solo una vez.
www.pdftron.com
No está limitado a actualizar un solo registro. Si la cláusula WHERE selecciona múltiples
registros, todos los registros serán actualizados:
UPDATE Customers
SET Country = ‘United States’
WHERE Country = ‘USA’
IBEROÁMERICA
También puede actualizar más de un campo a la vez con la sentencia UPDATE:
UPDATE Customers
SET ContactName = ‘Maria Anderson’,
ETC CITY = ‘Tokyo’
Tome Nota
Es altamente
WHERE CustomerId = ‘ALFKI’
recomendado que
revise la cláusula
WHERE para cada
sentencia UPDATE.
Si no es cuidadoso,
podría actualizar datos
de más filas de las que
desea.

Comprender las Bases de Datos


177
Insertar Datos
La sentencia INSERT es utilizada para agregar una o más flas a la tabla de la base de datos.
La sentencia INSERT enlista los campos para una tabla objetivo seguido por un conjunto
de valores para insertar en esos campos. Por ejemplo, la siguiente sentencia INSERT
inserta una fla en la tabla OrderDetails:
INSERT INTO [Order Details]
(OrderId, ProductId, UnitPrice, Quantity, Discount)
VALUES (10248, 2, 19.00, 2, 0)
Se requieren corchetes cuando el nombre de las tablas o campos contienen espacios. Aquí,
el primer conjunto de paréntesis tienen una lista de columna y el Segundo conjunto
mantiene el valor a insertar. Si un campo tiene un valor por defecto, puede ser nulo o es un
campo de entidad, puede dejarlo fuera de la lista de campos, como en el siguiente ejemplo:
INSERT INTO [Order Details]
(OrderId, ProductId, UnitPrice, Quantity)
VALUES (10249, 2, 19.00, 2)
Esto funciona, aunque no fue especifcado, un valor para el campo Discount. También,
puede reordenar esta lista de campos mientras que reordene la lista de valores para que
www.pdftron.com
coincidan:
INSERT INTO [Order Details]
(ProductId, OrderId, UnitPrice, Quantity)
VALUES (2, 10250, 19.00, 2)
La sentencia INSERT no está limitada a insertar un solo registro. Hay un segundo formato
IBEROÁMERICA
que inserta los resultados de una sentencia SELECT en una determinada tabla. Por ejemplo,
esa consulta inserta un producto para cada proveedor en la tabla Products:
INSERT INTO Products
(SupplierId, ProductName, CategoryId)
ETC SELECT SupplierId, ‘Almond’, 7
FROM Suppliers
Esto funciona construyendo los resultados de la sentencia SELECT y luego poniendo
cada fla retornada por la sentencia SELECT en una tabla determinada. Por supuesto, las
columnas aun necesitan coincidir apropiadamente.

178
Lección 6
Eliminar datos
La sentencia DELETE es utilizada para mover datos desde tablas de bases de datos.
La sentencia DELETE remueve datos de una tabla. Con el fn de practicar y evitar eliminar
alguna información de la misma base de datos, puede copiar una tabla utilizando una
sentencia SELECT tal como:
SELECT * INTO CustomersCopy
FROM Customers
Esta sentencia selecciona todos los registros de la tabla Customers y los copia en una nueva
tabla llamada Customers Copy.
Para eliminar una sola fla de datos de la tabla CustomersCopy, puede utilizar la
siguiente sentencia DELETE:
DELETE FROM CustomersCopy
WHERE CustomerId = ‘ALFKI’
Sea cuidadoso: si omite la cláusula WHERE, eliminara toda la información de la tabla:
DELETE FROM CustomersCopy
Trabajar con procedimientos almacenados
www.pdftron.com
Un procedimiento almacenado es un conjunto de sentencias SQL que es almacenado e
procedimientos almacenados son nombrados y pueden ser utilizados por múltiples aplicacione
En contraste con las consultas ad-
hoc, los procedimientos almacenados son consultas
almacenadas permanentemente en el SQL Server. En muchas maneras, puede pensar en un
procedimiento almacenado como un SQL equivalente a un método C#.
IBEROÁMERICA
Los procedimientos almacenados tienen dos benefcios principales, primero, los puede
utilizar para guardar sentencias SQL complejas para ejecuciones futuras. Segundo, SQL
Server compila los procedimientos almacenados de forma que se ejecutan más rápido que
las consultas ad-
hoc. En esta sección, aprenderá cómo crear y ejecutar procedimientos
almacenados.
Crear y Ejecutar un procedimiento almacenado
ETC
El comando CREATE PROCEDURE puede ser utilizado para crear un nuevo procedimiento a
Puede utilizar la palabra clave CREATE PROCEDURE de T-
SQL para crear un
procedimiento almacenado. Puede ejecutar la sentencia CREATEPROCEDURE desde
cualquier interfaz que le permita introducir y ejecutar T-SQL.

Comprender las Bases de Datos


179
Æ Crear un procedimiento almacenado desde visual studio
PREPÁRESE. Para crear un procedimiento almacenado desde Visual Studio,
haga lo siguiente:
1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic
derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo
Procedimiento Almacenado.
2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo con el siguiente
código:
CREATE PROCEDURE GetCustomersFromFrance
AS
SELECT * FROM Customers
Where Country = ‘France’
RETURN
3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es agregado a
la base de datos.
4. Para ejecutar un procedimiento almacenado, haga clic en el procedimiento almacenado
Tome Nota
en el Explorador de Servidores y seleccione Ejecutar. El resultado del procedimiento
Puede utilizar la
almacenado es visualizado en la ventana de salida.
sentencia ALTER
PROCEDURE para
5. También puede ejecutar este procedimiento almacenado desde el proyecto QueryCS
modificar la definición
que creó antes. En lugar de una sentencia SQL, solo teclee el nombre del procedimiento
www.pdftron.com
de un procedimiento
almacenado y presione el botón Ejecutar SQL. El resultado del procedimiento almacenado
almacenado existente.
es visualizado en el Formulario de Windows.
Trabajar con procedimientos almacenados parametrizados
Los procedimientos almacenados parametrizados le permiten pasar argumentos de tiempo de e
IBEROÁMERICA
La habilidad de pasar parámetros incrementa signifcativamente el poder de los
procedimientos almacenados. El valor del parámetro puede ser proporcionado en tiempo
de ejecución para los procedimientos almacenados.
Considere que desea encontrar las ventas totales para cierto cliente en la base de datos de
Northwind. Debería ser capaz de especifcar el CustomerId en tiempo de ejecución.
ETC Æ Crear un procedimiento almacenado parametrizado
PREPÁRESE. Para crear un procedimiento almacenado parametrizado, haga lo
siguiente:
1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic
derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo
Procedimiento Almacenado.
2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo
con el
siguiente código:

180
Lección 6
CREATE PROCEDURE dbo.GetCustomerSales
(
@CustomerIdchar(5),
@TotalSales money OUTPUT
)
AS
SELECT @TotalSales = SUM(Quantity * UnitPrice)
FROM (Customers INNER JOIN Orders
ON Customers.CustomerId = Orders.CustomerId)
INNER JOIN [Order Details]
ON Orders.OrderId = [Order Details].OrderId
WHERE Customers.CustomerId = @CustomerId
RETURN
3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es
agregado a
la base de dados.
www.pdftron.com
En este procedimiento almacenado, tanto @CustomerId y @TotalSales son parámetros. @
CustomerId es un parámetro de entrada, debe proporcionar este parámetro cuando ejecuta
el procedimiento almacenado. @TotalSales es un parámetro de salida, retorna un valor del
procedimiento almacenado. Cuando ejecuta este procedimiento almacenado desde Visual
Studio, obtiene un cuadro de diálogo que le pide que introduzca el valor para todos los
parámetros, como se muestra en la Figura 6-9.
IBEROÁMERICA
Figura 6-9
El cuadro de diálogo
Ejecutar procedimiento
almacenado aparece para
los valores del parámetro
ETC

Comprender las Bases de Datos


181
Para ejecutar este procedimiento almacenado, introduzca ALFKI como el valor para @
CustomerId e introduzca NULL como el valor para @TotalSales. Cuando presiona el botón
OK, el valor calculado del parámetro de salida, @TotalSales, es visualizado en la ventana
de Salida.
No puede, sin embargo, ejecutar un procedimiento almacenado desde el proyecto QueryCS,
ya que el código no puede aceptar parámetros.
Æ Ejecutar procedimientos almacenados parametrizados desde C#
PREPÁRESE. Para ejecutar procedimientos almacenados parametrizados desde C#, desempeñ
las siguientes tareas:
1. Cree un nuevo proyecto de Aplicación para Windows llamado
ParameterizedSP.
2. Ubique dos controles Label (label1 y TotalSalesLabel), un TextBox (CustomerIdTextBox)
un Button (GetTotalSalesButton) y ordene los controles como se muestra en la
Figura 6-10.
3. Haga doble clic en el control Button para generar un manejador de evento para su evento
Click. Modifique el manejador de evento como se muestra abajo:
private void GetTotalSalesButton_Click(
object sender, EventArgs e)
{
TotalSalesLabel.Text = String.Format(
“Total Sales: {0}”,
GetTotalSales(CustomerIdTextBox.Text));
www.pdftron.com
}
4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de conexión para
que coincida con la ruta local del archivo de la base de datos en su computadora:
private double GetTotalSales(string customerId)
{
doubletotalSales = -1;
try
IBEROÁMERICA
{
// Cambia el string de conexión
// para coincidir con su sistema.
stringconnectionString =
ETC @”Data Source=.\SQLEXPRESS;” +
@”AttachDbFilename=” +
@”c:\SqlSampleDB\NORTHWND.MDF;” +
@”Integrated Security=True;” +
@”Connect Timeout=30;User Instance=True”;
SqlConnection connection =
newSqlConnection(connectionString);
182
Lección 6
SqlCommand command =
connection.CreateCommand();
command.CommandType =
CommandType.StoredProcedure;
Tome Nota
Si agrega una nueva
command.CommandText = “GetCustomerSales”;
fila a la tabla con una
command.Parameters.AddWithValue(
columna de identidad,
puede utilizar la
“@CustomerId”, customerId);
variable de SQL Server
command.Parameters.AddWithValue(
@@IDENTITY para
recuperar el valor de la
“@TotalSales”, null);
columna de identidad
command.Parameters[“@TotalSales”].DbType
para la fila recién
creada.
= DbType.Currency;
command.Parameters[“@TotalSales”].Direction
= ParameterDirection.Output;
connection.Open();
command.ExecuteNonQuery();
totalSales = Double.Parse(
command.Parameters[“@TotalSales”]
.Value.ToString());
connection.Close();
}
www.pdftron.com
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
returntotalSales;
}
IBEROÁMERICA
5. Agregue la siguiente directiva using al código:
usingSystem.Data;
using System.Data.SqlClient;
6. Seleccione Depurar, Iniciar Depuración para ejecutar el proyecto. Introduzca un Customer
válido. Podrá ver la salida como se muestra en la Figura 6-10.
ETC
Figura 6-10
Ejecutando
procedimientos
almacenados
parametrizados desde una
aplicación de C#

Comprender las Bases de Datos


183
En el código, los parámetros son representados por objetos SqlParameter. El código
funciona estableciendo el valor para el parámetro @CustomerId, ejecutando el objeto
SqlCommand correspondiente al procedimiento almacenado y luego recuperando la
propiedad Value del parámetroTotalSales.
Tome Nota
El código previo tiene las siguientes líneas:
El objeto utilizado con
la sentencia using
connection.Open();
debe implementar la
command.ExecuteNonQuery();
interfaz de IDisposable.
totalSales = Double.Parse(
command.Parameters[“@TotalSales”]
.Value.ToString());
connection.Close();
Aquí, primero abre la conexión a la base de datos, haga lo que necesite hacer con la
conexión y entonces fnalmente cierre la conexión. El objeto que mantiene las referencias
de la conexión a la base de datos utiliza muchos recursos de sistema y es un recurso costoso.
De forma que, se recomienda que cierre este objeto tan pronto como acabe de utilizarlo.
Si no cierra la conexión está creando una falta de memoria en el programa que podría
impactar su desempeño.
C# también le da una sentencia using que ayuda a garantizar que los objetos costosos tales
como las conexiones a bases de datos son automáticamente cerradas cuando recién acaba
de trabajar con ellas.
Esta es una versión alternativa al código de arriba que hace uso de la sentencia using para
www.pdftron.com
cerrar automáticamente la conexión a la base de datos.
// deshechar objetos con la sentencia using
using (connection)
{
connection.Open();
command.ExecuteNonQuery();
totalSales = Double.Parse(
IBEROÁMERICA
; ¿Listo para la
command.Parameters[“@TotalSales”]
certificación?
.Value.ToString());
¿Comprende los
}
distintos métodos de
consulta de bases de
La sentencia using defne un alcance para el objeto de la conexión, cuando el código alcanza
datos? — USD 6.2
ETC el fn del alcance, el objeto de la conexión es cerrado automáticamente y todos los recurso
son liberados.
; ¿Listo para la
certificación?
¿Comprende los
métodos de conexión
a bases de datos?
— USD 6.3
184
Lección 6
� Comprender los métodos de conexión a bases de
datos
È EN RESUMEN
Las aplicaciones de negocios pueden necesitar trabajar con datos en varios formatos. También
con datos almacenados dentro de archivos planos, archivos XML y objetos en memoria.
El .NET Framework proporciona clases que son optimizadas para trabajar con archivos
planos, archivos XML y objetos en memoria. La información almacenada dentro de archivos
planos puede ser manejada utilizando las clases en el espacio de nombre de System.IO.
Para trabajar con datos XML, las clases en el espacio de nombres de System.Xml pueden
ser utilizadas. Finalmente, para trabajar con objetos tales como un DataSet, se utilizan
clases del espacio de nombres de System.Data. Aprenderá más acerca de cómo trabajar con
cada uno de estos formatos en las siguientes secciones.
Trabajar con Archivos Planos
Un archivo plano es como una tabla de una base de datos que esta almacenada dentro de un ar
alone.
Un archivo plano generalmente contiene una fla de datos por línea y las columnas son
separadas por delimitadores tales como comas o tiene una longitud fja. Los datos en el
archivo plano pueden ser texto plano o binario. Estos archivos son llamados archivos
www.pdftron.com
planos para distinguirlos de formularios más estructurados de almacenamiento tales como
bases de datos relacionales y archivos XML.
Históricamente, antes de la llegada de las bases de datos modernas, los archivos planos
eran muy populares para almacenar y organizar información. Los archivos planos aún son
útiles pero sólo en casos limitados en lugar de bases de datos con propósitos generales.
Algunos de los lugares donde se utilizan los archivos planos son en un sistema operativo
o archivos de confguración de aplicación, cuando se transfere información a sistemas
remotos y cuando se migran datos entre sistemas no compatibles.
IBEROÁMERICA
La entrada y salida con base en archivos en el .NET Framework gira en torno al concepto
de streams y backingstore.
Un stream es un fujo de datos en bruto. Un almacén de respaldo es la fuente o destino
de un stream. Un almacén de respaldo podría ser cualquier cosa tal como un archivo de
disco, memoria, conexión de red, etc. Puede encontrar clases para trabajar con streams y
almacenes de respaldo en el espacio de nombres de System.IO.
ETC Los archivos planos pueden ser datos ya sea en formato de texto plano o en formato
binario. Los archivos de texto a menudo son organizados como líneas de texto separadas
por caracteres de fn de línea. Las clases StreamReader y StreamWriter le proporcionan una
manera sencilla de manipular tales archivos de texto.
Los archivos binarios almacenan su contenido como una secuencia de bytes. Aunque los
archivos binarios no son legibles por el humano como los archivos de texto, son capaces de
almacenar diferente variedad de datos tales como imágenes, sonidos, video, etc. Siempre
necesitará un programa de computadora para interpretar el contenido de un archivo

Comprender las Bases de Datos


185
binario. Las BinaryReader y BinaryWriter le proporcionan una manera sencilla para
manipular los archivos binarios.
En el siguiente ejercicio seleccione las columnas de la tabla Customers y las escribe en un
archivo de texto. Después abre el archivo de texto y visualiza su contenido en la ventana
de Consola.
Æ Leer de y escribir a un archivo de texto
PREPÁRESE. Para leer de y escribir un archivo de texto, haga lo siguiente:
1. Cree un nuevo proyecto de Aplicación de Consola llamado
WorkingWithTextFiles.
2. Agregue el siguiente código a la clase Program. Necesitará corregir la ruta de su base de
datos de Northwind en el código:
static void Main(string[] args)
{
stringmyDocumentsPath =
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments);
CopyDataToTextFile(myDocumentsPath
+ @”\CustomerList.txt”);
DisplayTextFile(myDocumentsPath
+ @”\CustomerList.txt”);
www.pdftron.com
}
static private void CopyDataToTextFile(
stringfleName)
{
try
{
IBEROÁMERICA
// Cambia elstring de conexión
// para coincidir con su sustema.
stringconnectionString =
@”Data Source=.\SQLEXPRESS;” +
@”AttachDbFilename=” +
ETC @”c:\SqlSampleDB\NORTHWND.MDF;” +
@”Integrated Security=True;” +
@”Connect Timeout=30;User Instance=True”;
SqlConnection connection =
newSqlConnection(connectionString);
SqlCommand command =
connection.CreateCommand();

186
Lección 6
command.CommandText =
“SELECT CustomerId, CompanyName, “
+ “ContactName, Phone FROM Customers”;
using (connection)
{
connection.Open();
SqlDataReader reader =
command.ExecuteReader();
using (StreamWritersw =
newStreamWriter(fleName))
{
while (reader.Read())
{
stringcustomerRow =
String.Format(“{0}, {1}, {2}, {3}”,
reader.GetValue(0),
reader.GetValue(1),
reader.GetValue(2),
reader.GetValue(3));
www.pdftron.com
sw.WriteLine(customerRow);
}
}
}
}
catch (Exception ex)
IBEROÁMERICA
{
Console.WriteLine(ex.Message);
}
}
static void DisplayTextFile(string fleName)
ETC {try {
using (StreamReadersr =
newStreamReader(fleName))
{
string line;

Comprender las Bases de Datos


187
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
3. Agregue la siguiente directiva using a su código:
usingSystem.Data.SqlClient;
using System.IO;
4. Genere y ejecute el programa, Verifique la carpeta Mis Documentos por el
archivoCustomerList.txt y verifique que los datos del cliente han sido escritos. También
verifique la salida en la ventana de Consola contra el contenido del archivo.
El código en este ejercicio primero abre una nuevo objeto StreamWriter y llama a su
método WriteLine varias veces para escribir el texto al archivo de texto. Luego crea un
objeto StreamReader para leer el texto desde el archivo que ha sido creado utilizando el
método ReadLine. Cuando ya no hay datos por leer, el objeto ReadLine retornará un valor
www.pdftron.com
nulo. El código utiliza este hecho para determinar cuándo terminar de leer desde el archivo
de texto.
Trabajar con XML
XML (Lenguaje de Etiquetado Extensible) es un formato basado en texto para la representació
En XML, puede almacenar tanto datos y metadatos (información acerca de los datos
IBEROÁMERICA
almacenados). Por ejemplo, este es un poco de XML que representa datos para dos
clientes:
<?xml version=”1.0” encoding=”utf-8”?>
<!--Customer List-->
<Customers>
ETC <Customer Id=”ALFKI”>
<CompanyName>AlfredsFutterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id=”EASTC”>
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>

188
Lección 6
</Customer>
</Customers>
Aun sin saber nada acerca de XML, puede comprender el contenido de este archivo solo
mirándolo. XML consiste de etiquetas (contenidas dentro de paréntesis) y datos. Las
etiquetas siempre aparecen en pares, con una de apertura y una de cierre. Por ejemplo,
<Customers> es una etiqueta de apertura y </Customers> es una de cierre.
La primera línea de un documento XML es la declaración XML:
<?xmlversion=”1.0” encoding=”utf-8”?>
Las etiquetas XML que empiezan con los caracteres <? Son llamados instrucciones
de procesamiento. Esta instrucción de procesamiento no dice que el documento es un
documento XML, que se ajusta a las especifcaciones de XML versión 1.0 y utiliza el
conjunto de caracteres UTF-8 para sus elementos de datos.
Las etiquetas de apertura y de cierre con su contenido se conocen cada una como elemento.
Por ejemplo, este es un elemento XML simple del documento de arriba:
<Phone>030-0074321</Phone>
Esto defne un elemento con el nombre Phone cuyo valor es 030-
0074321. Los elementos
pueden ser anidados y no se pueden sobreponer. Por ejemplo, el siguiente XML es inválido
debido a la superposición entre los elementos CompanyName y Phone:
<Customer Id=”EASTC”>
<CompanyName>Eastern Connection<Phone>
</Phone>(171) 555-0297</CompanyName>
www.pdftron.com
</Customer>
</Customers>
Los documentos XML son jerárquicos por naturaleza. Cada documento XML contiene
un solo elemento raíz que contiene todo los otros nodos. Un documento XML puede ser
visualizado como un árbol de nodos.
Los elementos pueden contener atributos. Un atributo es una pieza de información que
IBEROÁMERICA
además describe un elemento:
<Customer Id=”ALFKI”>
Aquí el elemento Customer incluye un atributo cuyo nombre es Id y cuyo valor es ALFKI.
Finalmente, un documento XML puede contener comentarios. Los comentarios inician
ETC con los caracteres <!—y terminan con los caracteres-->.
XML puede ser más complejo de lo discutido en esta sección. Pero estas bases son
sufcientes para que comprenda la mayoría de los documentos XML que es probable que
se encuentre hasta que inicie a trabajar con XML a profundidad.
Hay muchas maneras en las cuales puede trabajar con información XML. Las clases para
trabajar con información XML están organizadas en el espacio de nombres de System.
Xml. Esta lección se enfoca en las siguientes clases utilizadas comúnmente:

Comprender las Bases de Datos


189
• XmlReaderyXmlWriter: Estas clases proporcionan una manera rápida, sin
entrar a cache y solo hacia adelante para leer o escribir datos XML.
• XmlDocument: Esta clase es una representación en memoria de datos XML y
permite la navegación y edición del documento XML.
En el siguiente ejercicio utilice la clase XmlReader para leer un archivo XML llamado
Customers.xml de una manera secuencial y solo hacia adelante:
Æ Leer desde un Archivo XML
PREPÁRESE. Para leer desde un archivo XML, haga lo siguiente:
1. Cree un nuevo proyecto de Aplicación de Consola llamado
WorkingWithXmlReader.
2. Agregue el siguiente código al método Main de la clase Program:
using (XmlReader reader =
XmlReader.Create(“Customers.xml”))
{
while (reader.Read())
{
if (reader.IsStartElement())
{
switch (reader.Name)
{
www.pdftron.com
case “CompanyName”:
if (reader.Read())
{
Console.Write(
“Company Name: {0}, “,
reader.Value);
IBEROÁMERICA
}
break;
case “Phone”:
if (reader.Read())
{
ETC Console.WriteLine(
“Phone: {0}”, reader.Value);
}
break;
}
}
}

190
Lección 6
}
3. Necesitará agregar la siguiente directiva using al programa:
usingSystem.Xml;
4. Agregue un nuevo archivo XML llamado Customers.xml al proyecto. Asegúrese que
archivo XML contiene la siguiente información:
<?xmlversion=”1.0” encoding=”utf-8”?>
<!--CustomerList-->
<Customers>
<Customer Id=”ALFKI”>
<CompanyName>AlfredsFutterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id=”EASTC”>
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>
</Customer>
</Customers>
5. Genere el programa. Copie el archivo Customers.xml a la carpeta del programa ejecutable
Ejecute el programa, se mostrará una lista de todos los nombres de compañías y sus
números telefónicos.
www.pdftron.com
El código en este ejercicio primero crea una nueva instancia de XmlReader utilizando el
método XmlReader.Create. Esto lanzara una excepción si el archivo no es encontrado. Este
programa se terminará cuando el método XmlReader.Read no tenga nada por leer. Puede
utilizar las propiedades tales como Name y Value para acceder a varias porciones de XML.
Trabajar con DataSet
El XML (Lenguaje de Etiquetado Extensible) es un formato basado en texto para la re
IBEROÁMERICA
estructurados.
Un DataSet es una representación en memoria de datos relacionales. Justo como una
base de datos, un DataSet puede tener tablas, relaciones y restricciones de integridad
de datos como las restricciones únicas y las restricciones de clave foránea. Un DataSet es
generalmente creado recuperando información desde una fuente de datos tal como una
ETC base de datos. Una vez que ha creado un DataSet, puede trabajar con toda la información
en el DataSet aun cuando el enlace a la fuente de datos no está disponible temporalmente.
Cuando hay cambios en los datos, solo la copia en memoria de los datos es actualizada. La
conexión a la fuente de datos es necesaria solo cuando es tiempo de actualizar la fuente de
datos con los cambios del DataSet. El DataSet es muy útil para la creación de aplicaciones
desconectadas. Las aplicaciones desconectadas son aplicaciones que pueden continuar
funcionando sin una conexión constante a recursos de red tal como una base de datos.
Todas las clases relacionadas con el DataSet son parte del espacio de nombres de System.
Data. Un objeto DataSet es creado utilizando la clase DataSet. El DataSet consiste de una

Comprender las Bases de Datos


191
colección de objetos DataTable. Un DataTable es justo como una tabla de una base de
datos relacional. Un objeto DataTable tiene una colección de objetos DataColumn que
representan las columnas en la tabla. Las flas en el DataTable son representadas por la
colección DataRow.
El DataAdapter actúa como un Puente entre la fuente de datos y el DataSet. El DataAdapter
almacena la conexión de datos y los comandos de datos necesarios para conectarse a
fuente de datos. El DataAdapter también proporciona comandos para la recuperación de
datos desde la fuente de datos y comandos para la actualización de la fuente de datos con
cualquier cambio.
El .NET Framework proporciona tres tipos de clases DataAdapter para trabajar con
distintos tipos de Fuentes de datos:
• La clase OdbcDataAdapter es utilizada para trabajar con fuentes de datos ODBC.
La clase OdbcDataAdapter es parte del espacio de nombres de System.Data.Odbc.
Tome Nota
• La clase OleDbDataAdapter es utilizada para trabajar con fuentes de datos OLEDB.
También se puede
La clase OleDbDataAdapter es parte del espacio de nombres de System.Data.
conectar a una base
OleDb.
de datos de SQL Server
• La clase SqlDataAdapter es utilizada para trabajar con una base de datos de SQL
utilizando las clases
Server. La clase SQLDataAdapter es parte del espacio de nombres de System.Data.
SqlClient.
• dbcAdapteryOleDbAdapter. Sin embargo, la clase SQLDataAdapteres optimizada para
SQL Server. Por lo tanto, cuando se trabaja con SQL Server, es preferible utilizar la
claseSQLDataAdapter.
En una aplicación típica que crea y actualiza un DataSet, tendrá los siguientes pasos:
1. Generar y llenar cada DataTable en el DataSet con datos de la fuente de datos
www.pdftron.com
utilizando un DataAdapter.
2. Cambiar los datos en los objetos DataTable individuales agregando, actualizando o
eliminando objetos DataRow.
3. Invocar el método AcceptChanges en el DataSet. Este método conecta a las fuentes de
datos originales y las actualiza con todos los cambios hechos en el DataSet desde que
fue cargado o desde la última vez que AcceptChanges fue llamado. Alternativamente,
puede llamar al método RejectChanges para cancelar todos los cambios que fueron
hechos al DataSet desde que fue cargado o desde la última vez que AcceptChanges fue
IBEROÁMERICA
llamado.
En el siguiente ejercicio utilice las clases discutidas hasta ahora para leer datos desde la
base de datos de SQL Server de Northwind en un DataSet y luego iterar sobre la tabla
Customer para visualizar el número de órdenes para cada cliente.
ETC Æ Leer un objeto DataSet en memoria
PREPÁRESE. Para leer desde un objeto DataSet en memoria, haga lo siguiente:
1. Cree un nuevo proyecto de Aplicación de Consola llamado
WorkingWithDataSet.
2. Remplace el código en la clase Program con el siguiente código. Asegúrese
de cambiar la
cadena de conexión para que coincida con la ruta local del archivo de la base de
datos en
su computadora:
static void Main(string[] args)
{

192
Lección 6
WorkingWithDataSet();
}
static void WorkingWithDataSet()
{
string cString = @”Data Source=.\SQLEXPRESS;”
+ @”AttachDbFilename=B:\SqlSampleDB\NORTHWND.MDF;”
+ “Integrated Security=True;”
+ “Connect Timeout=30;User Instance=True”;
SqlConnection northwindConnection =
new SqlConnection(cString);
string customerCommandText =
“SELECT * FROM Customers”;
SqlDataAdapter customerAdapter =
new SqlDataAdapter(
customerCommandText, northwindConnection);
string ordersCommandText =
“SELECT * FROM Orders”;
SqlDataAdapter ordersAdapter =
new SqlDataAdapter(
ordersCommandText, northwindConnection);
DataSet customerOrders = new DataSet();
customerAdapter.Fill(
www.pdftron.com
customerOrders, “Customers”);
ordersAdapter.Fill(
customerOrders, “Orders”);
DataRelation relation =
customerOrders.Relations.Add(“CustomerOrders”,
customerOrders.Tables[“Customers”]
.Columns[“CustomerID”],
IBEROÁMERICA
customerOrders.Tables[“Orders”]
.Columns[“CustomerID”]);
foreach (DataRow customerRow in
customerOrders.Tables[“Customers”].Rows)
{
Console.WriteLine(customerRow[“CustomerID”]);
ETC foreach (DataRow orderRow in
customerRow.GetChildRows(relation))
Console.WriteLine(“\t” +
orderRow[“OrderID”]);
}
Console.WriteLine(
“Press any key to continue...”);
Console.ReadKey();
}

Comprender las Bases de Datos


193
Tome Nota
3. Necesitará agregar la siguiente directiva using al programa:
Un DataSet puede leer
usingSystem.Data;
y escribir datos como
usingSystem.Data.SqlClient;
documentos XML. Para
escribir datos como
4. Seleccione Proyecto, posteriormente configure como Startup Project para hacer que e
XML, utilice el método
proyecto sea el inicial para esta solución.
WriteXmlde la clase
DataSet. Para leer un
5. Seleccione Depurar y después Iniciar Depuración (o presione F5) para ejecutar el programa
documento de datos
Notará que la ventana de consola enlista todos los clientes de la tabla Customers. Cada
XML, puede utilizar el
CustomerID es seguido por el OrderID correspondiente a ese cliente.
método ReadXml de la
El código en este ejercicio primero crea un DataSet con dos objetos DataTable, Customers
clase DataSet.
y Orders. El DataSet también crea un objeto DataRelation que establece la relación entre
la tabla Customers y la tabla Orders en la columna CustomerID. Esta relación le permite
llamar al método GetChildRow en una fla de cliente para recuperar las flas de las órdenes
correspondientes a cada cliente.
; ¿Listo para la
certificación?
¿Comprende los
distintos métodos de
conexión a bases de
datos? — USD 6.3
www.pdftron.com
IBEROÁMERICA
ETC

194
Lección 6
Resumen de Habilidades
En esta lección aprendió:
• Las características y capacidades de un sistema de administración de base de datos.
• El proceso del diseño de una base de datos, cómo crear diagramas entidad -
relación y las reglas de normalización.
• Las bases de SQL (lenguaje de consulta estructurado). Aprendió cómo crear
consultas SELECT, INSERT, UPDATE y DELETE. También aprendió cómo crear
procedimientos almacenados y cómo acceder a consultas SQL y procedimientos
almacenados desde un programa de C#.
• Cómo conectarse a archivos planos y a archivos XML para acceder y manipular
datos en algunas Fuentes de datos no relacionales.
• Cómo trabajar con objetos de datos en memoria utilizando las clases DataSet y
DataAdapter.

» Evaluación de Conocimientos
Llene los espacios en blanco
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
1. Con el fn de que una tabla esté en la _________________, ninguna de las
columnas debe tener valores múltiples en la misma fla de datos.
www.pdftron.com
2. La _______________requiere que todas las columnas que no son clave sean
funcionalmente dependientes de toda la clave principal.
3. La _______________requiere que no haya dependencia funcional entre los atributos
que no son clave.
4. Los bloques de construcción básicos para un diagrama entidad - relación son
_______________, _______________ y_______________.
IBEROÁMERICA
5. La cláusula _______________en una sentencia SELECT evalúa cada fla para una
condición y decide si incluirlos o no en el conjunto de resultados.
6. El objeto utilizado con la sentencia using debe implementar la interfaz_______________.
7. La sentencia _______________de T-
SQL puede ser utilizada para crear un
procedimiento almacenado.
8. En el proceso de _______________, aplica un conjunto de reglas para garantizar que
ETC su diseño de base de datos ayuda con la integridad de datos y es fácil de administrar
en el futuro.
9. Encuentra clases para trabajar con streams y almacenes de respaldo en el espacio de
nombres de _______________.
10. El formato ____________ es una representación de datos jerárquica.

Comprender los conceptos básicos de bases de datos


195
Opción Múltiple
Encierre en un círculo la letra que corresponda a la mejor respuesta.
1. Su aplicación necesita almacenar la imagen del producto hacia un archivo en disco. Le
gustaría minimizar el tamaño del archivo de disco. ¿Cuál de los objetos debe utilizar
para escribir el archivo?
a. FileStream
b. StreamWriter
c. BinaryWriter
d. XmlWriter
2. Su programa de C# necesita retornar el número total de clientes en una base de datos.
El programa será utilizado varias veces al día. ¿Cuál es la manera más rápida de retornar
esta información desde su programa?
a. Escribir una consulta SQL y utilizar el método SqlCommand.ExecuteScalar para
ejecutar la consulta SQL.
b. Crear un procedimiento almacenado que retorne el número total de clientes.
Utilizar el método SqlCommand.ExecuteScalar para ejecutar el procedimiento
almacenado.
c. Escribir una consulta SQL y utilizar el método SqlDataAdapter.Fill para ejecutar
la consulta SQL.
d. Crear un procedimiento almacenado para retornar el número total de cliente.
Utilizar el método SqlDataAdapter.Fill para ejecutar el procedimiento almacenado.
www.pdftron.com
3. Necesita modifcar los registros de la tabla Productsy marcar productos como
Descontinuados. Sin embargo, necesita hacer esto solo cuando tanto UnitsInStock y
UnitsOnOrder son cero. ¿Cuál de las siguientes sentencias SQL debe utilizar?
a. INSERT
b. SELECT
c. UPDATE
d. DELETE
IBEROÁMERICA
4. Necesita actualizar los campos de Región para los clientes de Japón. Escribe la
siguiente sentencia SQL UPDATE:
UPDATE Customers
SET Region = ‘EastAsia’
ETC 5. Prueba la consulta en una base de datos de prueba y encuentra que se afectan más
registros de lo esperado. Necesita corregir la sentencia SQL. ¿Qué debe hacer?
a. Agregar una clausula WHERE a la sentencia UPDATE.
b. Agregar una clausula SET adicional a la sentencia UPDATE.
c. Agregar una clausula GROUP BY a la sentencia UPDATE.
d. Agregar una clausula HAVING a la sentencia UPDATE.

196
Lección 6
6. Está desarrollando una aplicación que necesita recuperar una lista de clientes desde
una base de datos de SQL Server. La aplicación debería moverse a través de la lista
secuencialmente una vez, procesar cada registro de cliente. ¿Cuál de las siguientes
clases debe utilizar para mantener la lista de clientes con el fn de lograr un desempeño
máximo?
a. DataSet
b. DataTable
c. DataView
d. SqlDataReader
7. La aplicación que está desarrollando necesita leer datos desde un archivo plano que
incluye ítems tales como una clave entera de 5 dígitos, seguido por un nombre de
cliente de 20 caracteres, seguido por dos campos de fecha y hora. ¿Cuál de las siguientes
clases debe utilizar?
a. FileStream
b. StreamReader
c. BinaryReader
d. DataReader
8. Está desarrollando una aplicación que necesitará copiar datos desde una vista de SQL
Server a un DataSet. Nombra al objeto DataSet como dsData. ¿Cuál de los siguientes
métodos debe utilizar para copiar los datos?
a. Fill
b. InsertCommand
www.pdftron.com
c. SelectCommand
d. Update
9. Está desarrollando una aplicación que administra clientes y sus órdenes. ¿Cuál de las
siguientes situaciones no es un buen candidato para la implantación con procedimientos
almacenados en su aplicación?
a. Recuperar la lista de todos los clientes en la base de datos
IBEROÁMERICA
b. Recuperar la lista de todas las órdenes para un cliente en particular
c. Insertar una nueva orden en la tabla Orders
d. Hacer consultas Ad-hoc por el administrador de la base de dato
10. Su aplicación se conecta a una base de datos de SQL Server que contiene una tabla
ETC llamada Employees con las siguientes columnas:
a. EmployeeID (int, identity)
b. EmployeeType (char(1))
c. EmployeeDate (datetime)

Comprender los conceptos básicos de bases de datos


197
11. Necesita escribir una consulta que elimine todas las flas de la tabla donde el valor de
EmployeeTypees ya sea C o T. No desea eliminar ninguna otra fla. ¿Cuál sentencia
debe utilizar?
a. DELETE FROM Employees
WHERE EmployeeType LIKE ‘[CT]’
b. DELETE FROM Employees
WHERE EmployeeType LIKE ‘[C-T]’
c. DELETE FROM Employees
WHERE EmployeeType LIKE ‘C’ OR ‘T’
d. DELETE * FROM Employees
WHERE EmployeeType IN (‘C’, ‘T’)
12. Su aplicación incluye un objeto SqlDataAdapter llamado SqlDataAdapter que se
conecta a la tabla Employees. Basado en este SQLDataAdapter, su aplicación también
incluye un objeto DataSet, dsEmployees. ¿Cuál línea de código debe utilizar para
cargar toda la información desde la base de datos en el objeto DataSet?
a. dsEmployees = sqlDataAdapter.Fill(“Employees”);
b. sqlDataAdapter.Fill(“dsEmployees”, “Employees”);
c. sqlDataAdapter.Fill(dsEmployees);
d. sqlDataAdapter.Fill(dsEmployees, “Employees”);
www.pdftron.com
IBEROÁMERICA
ETC

198
Lección 6

» Evaluación de Competencia
Proyecto 6-1: Crear un Diagrama Entidad - relación
Una compañía tiene un número de empleados. Cada empleado puede ser asignado a uno
o más proyectos. Un proyecto puede tener uno o más empleados trabajando en él. Dibuje
un diagrama entidad - relación para esta situación.
Proyecto 6-2: Crear un Procedimiento Almacenado
A menudo necesita una lista de clientes para cierto país. Necesita crear un procedimiento
almacenado que acepte el nombre del país como parámetro y retorne todos los clientes de
ese país. ¿Cómo haría eso?

» Evaluación de Competencia
Proyecto 6-3: Normalizar Tablas
Está convirtiendo un diagrama entidad - relación en tablas. Obtiene la siguiente tabla:
Books
BookId
BookName
CategoryId
CategoryName
1
Cocinando Sano
1001
Cocina
www.pdftron.com
2
Profecía
1002
Misterio y Suspenso
3
Cambio
1003
Negocios
4
La Confesión
1002
Misterio y Suspenso
Necesita aplicar las reglas de normalización para garantizar la integridad de datos. ¿Cómo
garantizaría que la tabla Books está en la tercera forma normal?
IBEROÁMERICA
Proyecto 6-4: Crear y Manejar Eventos
Está trabajando en una aplicación que requiere que guarde información de cliente desde
la tabla Customers de la base de datos de Northwind en un archivo XML. Este archivo
XML será utilizado por varias tareas de integración de datos. Necesita garantizar que
el nodo raíz del XML es llamado Customers. El nodo raíz entonces tendrá un nodo
Customer para cada cliente en la tabla Customers. ¿Cómo debe llevar a cabo esta tarea?
ETC

You might also like