Professional Documents
Culture Documents
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.
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
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
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.
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.
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
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:
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.
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
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.
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).
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.
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
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:
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
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.
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;
}
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
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
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;
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.
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.
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.
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
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
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.
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.
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.
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>
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:
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.
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
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” />
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”);
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.
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>
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.
}
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.
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>
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();
}
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);
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
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?
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.
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.
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.
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
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
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.
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.
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
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;
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:
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
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();
}
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.
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)
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