Programación NET Unidad 3
Programación NET Unidad 3
Programación NET Unidad 3
6º semestre
Programación .NET II
Clave:
15143530
Índice
Presentación de la unidad
En la segunda parte de la unidad, se revisará el tema de tablas, vectores, matrices o array (que
algunos autores traducen por arreglo), que son un conjunto de elementos del mismo tipo,
tendrán el mismo nombre y ocuparán un espacio contiguo en la memoria de la computadora. La
trascendencia de este tema es el aprender a manipular un conjunto de objetos con un mismo
nombre, lo que permite referirse a varios elementos semejantes que contengan información
diferente. Si se planteara esa situación con los conocimientos actuales de .NET, sería necesario
crear una variable con nombre diferente por cada dato que se necesitara.
Se concluirá esta parte trabajando con colecciones, el siguiente paso de los arreglos, donde es
posible guardar con un mismo nombre un conjunto de objetos diferentes (de diferentes tipos), y
no es necesario especificar un tamaño fijo.
Estos dos conceptos: errores y conjunto de objetos, te serán de gran utilidad en el desarrollo de
tu carrera.
Logros
Competencia específica
Las excepciones son el procedimiento recomendado en la plataforma .NET, para controlar los
errores que se produzcan durante la ejecución de las aplicaciones (divisiones por cero, lectura de
archivos no disponibles, datos incorrectamente teclados, etcétera). Esto es una diferencia
respecto a su implementación en otros lenguajes, como el caso de C++ tradicional, lo que
proporciona una cierta homogeneidad, consistencia y sencillez, entre los diferentes lenguajes
que la componen.
Una excepción en el ámbito de la programación (recordemos que las excepciones son un control
de errores utilizados por todos los lenguajes actuales de programación), se define como
“cualquier condición de error o comportamiento inesperado que se ha detectado en un
programa en ejecución”, la podemos encontrar en la base de conocimientos de Microsoft (MSDN,
2013f):
Frente al anterior método de capturar errores en los lenguajes de programación, las excepciones
proporcionan las dos ventajas siguientes:
• Claridad: el uso de códigos especiales para informar del error suele dificultar la legibilidad de
la fuente, en tanto que se mezclan las instrucciones de la lógica de éste con las del
tratamiento de los errores que pudiesen producirse durante la ejecución.
• Más información: a partir del valor de un código de error puede ser difícil deducir sus causas;
conseguirlo muchas veces implica consultar la documentación proporcionada por el
fabricante sobre el método que lo provocó, pero puede que no especifique claramente su
causa. Por el contrario, una excepción es un objeto que cuenta con campos que describen las
causas del error, y a cuyo tipo suele dársele un nombre que resuma claramente su causa, el
cual está indicado por las clases que definen el Framework.
Por estas ventajas, en la actualidad la mayoría de los lenguajes manejan los errores con base en
estas características. A continuación, se abordarán cómo manejar esta tecnología de control de
errores.
3.1.1. Uso de los comandos para el control de errores: try, catch
El manejo de las excepciones se conforma de tres comandos que consisten en las palabras
reservadas: try, catch y finally (Archer, 2010).
La base de conocimiento de Microsoft (MSDN, 2013m) define el uso de los comandos try, catch
y finally de la siguiente manera: “consiste en obtener y utilizar recursos en un bloque try, tratar
circunstancias excepcionales en el bloque catch y liberar los recursos en el bloque finally”, esto
se puede explicar de una manera sencilla en el siguiente diagrama:
A = B / C;
Por ejemplo:
Por ejemplo:
Se deben respetar las siguientes reglas en cuanto al uso de comandos para el control de errores:
2. Al menos deberá existir un bloque catch por cada bloque try, pero puede haber más de uno
para controlar diferentes errores.
3. El bloque finally es opcional, se puede o no incluir según las necesidades del objeto. Por
ejemplo: cuando se manejan bases de datos es necesario cerrarlas, exista o no un error en los
procesos de operación de la información. El bloque finally en estas situaciones es sumamente
útil.
La forma en que funcionan estos bloques es sencilla y directa. Cuando una instrucción fracasa en
su objetivo y no puede continuar (se detecta una situación excepcional), devuelve un objeto
excepción. Este objeto excepción deberá ser capturado (cachado) por el bloque catch, en donde
se decide qué acción se debe tomar; es decir, el manejo que se debe hacer del error o la forma
en que se abordará.
Es necesario especificar qué tipo de errores (excepciones) se espera que ocurran para ser
capturados.
Siguiendo con la situación propuesta, se plantea que el usuario no escriba un número, sino la
palabra hola. El programa se detiene de forma inesperada y envía la siguiente ventana:
Ahora se puede argumentar que “el programa se ejecuta de forma incorrecta”. Se infiere que es
un programa escrito de manera incorrecta.
En este caso, completamente fuera del control del desarrollador, el programa no puede forzar al
usuario a que escriba de forma correcta lo que se le solicita. Este tipo de problemas deben ser
analizados con más detalle por el desarrollador, porque, posiblemente, algunas de las capturas
del usuario final sean malintencionadas (el hecho de escribir palabras en lugar de números); pero
en ocasiones puede tratarse de errores de percepción; por ejemplo, en lugar de 30 se escribe 3O
(el número tres y la letra O). Si se ejecuta de esta forma, el error es el mismo; es decir, es un error
de captura aun cuando no haya sido con mala intención.
Es tarea del desarrollador controlar este tipo de errores y así evitar que el programa se detenga
de forma inesperada; para ello deberá proporcionar una serie de opciones con el fin de que el
programa se autocontrole, y si debe terminar lo realice de forma controlada o, como dicen
algunos autores, de forma limpia (Ferguson, Patterson y Beres, 2005).
En el ejemplo se deben colocar estas instrucciones entre bloques try y catch, para que controlen
de forma correcta las acciones de escribir un número en formato inadecuado, y no esperar que
el programa se detenga de manera repentina. Aquí es necesario reparar en un cuestionamiento
importante: ¿qué tipo de error se espera?
Eso puede verse en la siguiente imagen, que corresponde a la parte superior de la figura anterior.
En este caso se espera un error del tipo FormatException, que puede traducirse como Excepción
por un mal formato. Se puede controlar si se reescribe el programa de la siguiente manera:
Pero si el programa se ejecutara tecleando el número 3, la salida sería la misma que se observó
anteriormente:
El bloque catch
En este caso se envía al usuario un comentario en el que se indica que se produjo un error.
Al agregar este control se obtiene un programa que permite, al identificar un error, terminar de
forma controlada su ejecución.
Esta es la instrucción que detiene el programa para poder observar los resultados (hasta que no
se presione la tecla [enter]). Se debe ejecutar sin importar lo que ocurra, una manera clara que
indicará esto se muestra a continuación:
Puede observarse que el comportamiento es exactamente igual que el programa anterior, pero
se ha controlado el error y codificado su operación de una manera más clara acorde con los
estándares de .NET. El bloque finally es muy utilizado por aplicaciones que deben cerrar de
Se espera capturar un error del tipo FormatException, que será devuelto en un objeto llamado
fe (puede ser cualquier nombre válido de variable en C Sharp). Una buena práctica de
programación es utilizar las letras mayúsculas que compongan la excepción, según la base de
datos de MSDN (2013g). Este objeto tiene una gran cantidad de métodos que permite conocer
con mucho detalle el error que se produjo, en qué parte del programa apareció, etcétera.
Siempre se debe capturar el objeto que contiene información del error aunque, como en este
caso, no se utiliza por ser un ejemplo muy sencillo; pero con instrucciones como fe.toString(), se
podría contar con una explicación más amplia del error.
Se ejecuta nuevamente el programa, pero en esta ocasión se teclea el número 3.1 y se observa
el siguiente error:
Esto no es un error porque 3.1 sí es un número. No es un número entero, pero sí es número. Para
concluir, puede decirse que la claridad y el control de los mensajes de error es entera
responsabilidad del desarrollador. Ahora que se cuenta con elementos para tener una mejor idea
sobre el comportamiento de las excepciones en C Sharp mediante .NET, es conveniente definir
una serie de conceptos importantes para utilizarlos de manera eficiente.
Si se tiene un programa que llama a un objeto y el objeto llama a un método que lanza una
excepción, se inicia un proceso recursivo. Primero se espera que el método que lanzó la
excepción tenga código para su control; si no lo tiene se espera que el objeto procese la
excepción; si este no tiene código para su control, se espera que el programa inicial que llamó al
objeto controle el problema; si éste no tiene código de control, el programa se detiene y muestra
la ventana de error. A esto se le conoce como propagación de la excepción. (Archer, 2010).
Las excepciones, finalmente, son objetos y tienen toda una jerarquía de herencia. Existe una gran
cantidad para controlar cualquier situación inesperada en la ejecución de un programa.
Object
Exception
DivideByZeroException ArgumentNullException
Figura 3.Diagrama de excepciones.
Basado en Diagrama basado en la jerarquía indicada en MSDN (2013i)
Esta jerarquía muestra, de manera muy simplificada, la complejidad de los objetos que se pueden
recuperar en la instrucción catch.
Si se ejecuta el programa, es posible darse cuenta de que en el directorio (debe crearse como un
primer paso) existe un archivo llamado temp.txt y contiene la palabra hola. Se puede ejecutar
sin los bloques try y catch, pero la recomendación de los autores es utilizar esta sintaxis porque
otorga una mayor seguridad en la funcionalidad.
El mensaje que ahora aparece es: Error: Debes crear primero el directorio. También se observará
en el código que se cuenta con dos salidas para el error. La primera es para uno muy específico,
la no existencia del directorio donde se creará el archivo; mientras que el segundo es muy
general, para cualquiera producido en el momento de ingresar al disco duro.
Este orden es muy importante. Cuando una instrucción try tiene varios catch, deben ser
ordenados desde los errores muy específicos hasta los más generales. Supóngase que se cambia
el orden de las instrucciones catch de la forma en que se indica en el siguiente código:
Se observa un error indicado por el compilador, que señalará que una cláusula catch previa ya
detecta todas las excepciones de este tipo o de tipo superior. Según lo indica Ferguson,
Patterson y Beres (2005, pág.363), “Los catch deben ser ordenados de la captura del error más
específico al error más general”.
2. Al regresar al programa y ejecutarlo se observará que aparece una ventana con el siguiente
error:
Se observa que se cuenta con una nueva excepción que no se ha controlado, y salta a las dos
instrucciones catch.
Esta nueva excepción es de un tipo nuevo, pertenece a las excepciones de control de seguridad
impuestas por el sistema operativo, para asegurar que no se dañarán archivos en el sistema. Son
parte de las credenciales (así se llaman los permisos) que proporciona la clave del usuario, por
medio del cual se ingresa al sistema Windows. Su control se muestra en el siguiente código:
El compilador ayuda a colocar la excepción en el punto adecuado; marca error si se pone en otro
lugar.
Para terminar con este subtema, es de resaltarla importancia de controlar el flujo sin errores de
un programa, lo que permitirá que la aplicación se mantenga estable cuando los usuarios, de
manera intencional o no, introduzcan datos erróneos. No olvides ejecutar, desde la ventana de
MS-DOS, el siguiente comando para permitir que se escriba sobre el archivo:
C:\windows\system32\attrib c:\puntonet\temp.txt -r
En C Sharp ese control de errores, o control de excepciones, se basa en los comandos try, catch
y finally. Igualmente, como se comentó en el tema anterior, existen dos categorías de
excepciones bajo la clase Exception, en C Sharp: las predefinidas del entorno de ejecución
(common language runtime, CLR) que derivan de System.Exception, y las definidas por el usuario
en la aplicación. Existen decenas de excepciones que pueden ser controladas desde C Sharp y
predefinidas por el CLR; algunas de ellas se muestran a continuación:
Excepción Descripción
ArithmeticException Desbordamiento por una operación aritmética.
DivideByZeroException Error por una división entre cero.
FileNotFoundException El archivo no fue encontrado.
FormatException El formato del dato es incorrecto.
IndexOutOfRangeException El índice es mayor que el tamaño de la matriz o colección
utilizada.
IOException Errores de entrada y salida de información.
NullReferenceException Un dato miembro sin inicializar.
OverflowException El dato no puede guardar el valor que se le indica.
OutOfMemoryException Se terminó la memoria.
Tabla 1. Tabla. Listado de algunas excepciones en C Sharp. Nota: la lista completa se puede consultar en la base de
conocimientos de MSDN (2013 h).
En esta breve lista se puede observar el grado de control sobre los errores posibles al programar
en C Sharp. Aun así, en ocasiones puede requerirse la creación de excepciones propias por dos
razones:
1. Se trata de un error nuevo y, por lo tanto, no considerado en las excepciones estándares que
proporciona la plataforma .Net.
2. Se desea controlar situaciones posibles en la aplicación, con base en el estándar de
excepciones propuesto por .Net.
La primera situación es un tanto difícil de que ocurra, pues la biblioteca proporcionada por el
lenguaje es muy completa. La segunda es muy recurrente en la industria de desarrollo de
software, porque se refiere al control de situaciones específicas del negocio donde se utilizará el
programa; por ejemplo: si la aplicación se ejecutará en una escuela donde la calificación mínima
aprobatoria es de 7.0, esa es una regla del negocio de esa escuela en particular.
Si se desea que los usuarios distingan, mediante programación, ciertas condiciones de error de
otras, es posible crear sus propias excepciones definidas por ellos mismos; .NET Framework
proporciona una jerarquía de clases de excepción que, en última instancia, deriva de la clase base
Exception. Cuando se creen es recomendable finalizar el nombre de la clase definida por el
usuario con la palabra "Excepción" (MSDN, 2013e).
En MSDN (2013e) se recomienda que, si se define una nueva excepción, se debe implementar
tres constructores; tal como se muestra en el ejemplo:
Se debe llamar a estos tres constructores porque están definidos en la clase padre:
ApplicationException. Al sobreescribirlos, se agrega una nueva excepción a la biblioteca
proporcionada por C Sharp.
En resumen, las sugerencias que propone Microsoft (Michaellis, 2010) para el desarrollo de
excepciones propias son las siguientes:
En una empresa se desarrolla un programa donde uno de los datos a capturar es la edad del
trabajador, que debe estar entre los 18 y los 65 años (valores válidos autorizados por el IMSS
para desempeñarse en un puesto administrativo). Se requiere desarrollar una excepción que sea
lanzada cuando se capture un valor de edad que pase de este rango, en los dos sentidos, para
valores de edad menores de 18 años y mayores de 65. Se iniciará llamándola
EdadFueraDeRangoException. La excepción que resolvería este problema se muestra a
continuación.
En el bloque finally se hace una revisión de la edad, si está fuera del rango indicado por el IMSS,
se lanza una excepción; el comando throw es el propuesto por C Sharp para lanzarlas. Es posible
lanzar una excepción con cualquiera de los tres constructores. Esto permite personalizar el error
generado por esta aplicación.
Ahora se requiere integrar la siguiente modificación: el IMSS permite que una persona trabaje si
tiene más de 18 años y menos de 65. Pero por las características de la empresa, en un puesto la
edad permitida debe ser entre 25 y 40 años. Es posible utilizar esta misma excepción si se
modifica el lanzamiento con el siguiente código.
La excepción se ha vuelto muy general, lo que permite que una misma sirva para capturar
diferentes situaciones.
Para concluir este tema, debe hacerse énfasis en que, aunque el sistema de excepciones de C#
es una herramienta muy eficiente que permite, hasta cierto punto, controlar imprevistos, nada
puede sustituir a una programación cuidadosa. El propio Stroustrup (1997), científico de la
computación y catedrático en la Universidad A&M de Texas, quien desarrolló el lenguaje C++,
advierte que “Aunque las excepciones se pueden usar para sistematizar el manejo de errores,
cuando se adopta este esquema, debe prestarse atención para que cuando se lance una
excepción no cause más problemas de los que pretende resolver. Es decir, se debe atender la
seguridad de las excepciones. Curiosamente, las consideraciones sobre seguridad del mecanismo
de excepciones conducen frecuentemente a un código más simple y manejable”, (Stroustrup,
1997, pág. 345.
Con las excepciones, además de tener un mejor control sobre los errores, también se tendrá un
código más simple.
el nombre, su número de control. Un conjunto de objetos alumnos sería una lista de ellos en la
que se representan el número de control y nombre.
En este tema se trabajará con ambos conceptos con base en la propuesta de C Sharp para el
manejo de la información en conjuntos de datos, como se indicó en el Tema 3.1. Control de
errores en C Sharp. Es necesario asegurarse de que el código, al ejecutarse, capture todos los
errores. Esto es sumamente importante en relación con un conjunto de objetos.
3.2.1. Arreglos
Los arreglos son conjuntos de objetos que tienen un mismo tipo, nombre, y son controlados por
un índice que los identifica (Deitel y Deitel, 2007). Pueden tener cualquier longitud y almacenar
miles o millones de datos; la condición es que el tamaño se debe decidir al momento de crear el
arreglo.
Imagina los arreglos como un grupo de cajas que son exactamente iguales, donde se guardarán
datos. Para poder identificarlas, tendrán un número que inicia en cero y termina en “n”. A ese
número se le llamará índice porque permite identificar cada caja. Como todos los elementos
tienen el mismo nombre sólo se identifican con un número. Pueden almacenar tipos de
referencia y de valor. El primero describe el lugar donde está el dato guardado, pero no lo
almacena. De almacenar el dato se encarga el segundo tipo, el de valor (MSDN, 2013ñ).
celda, guardar su valor significaría guardar el número 100 que tiene esa celda. Es decir, se tienen
que realizar dos pasos para descubrir la cantidad que se guarda en ese lugar:
1. Ir al número de celda.
2. Ver qué número guarda esa celda.
Guardar un valor significa que se está sólo almacenado un dato, sin importar en dónde se
almacena en la memoria.
a) Unidimensionales
Conjunto de elementos que sólo tiene un índice. Algunos autores los llaman vectores. Se pueden
definir de dos maneras: la primera se conforma de la siguiente sintaxis (MSDN, 2013n):
Tipo [ ] Nombre;
Nombre = new Tipo [numero_de_elementos];
La segunda la indica C Sharp, la cual permite hacer en sólo un paso las dos instrucciones
anteriores:
Tipo [ ] Nombre = new Tipo[numero_de_elementos]
Se define un arreglo con una sola instrucción. Este arreglo es de cinco elementos, todos ellos
llamados dato, diferenciados por un índice: dato[0], dato[1], dato[2], dato[3], dato[4]. Los
arreglos en C Sharp inician en 0.
O también:
En este caso, el número de datos indican el tamaño del arreglo. A continuación se expone un
ejemplo de cómo se define esto:
En ambos casos se define un arreglo de cinco elementos llamados dato, que contienen los
números: 2, 3, 6, 8, y 2. Esto se puede representar de la siguiente manera: dato[0]=2, dato[1]=3,
dato[2]=6, dato[3]=8 y dato[4]=2.
En el primer caso sólo se define el arreglo, pero todos ellos inicializados con un cero. En el
segundo, también se define un arreglo, pero inicializado con los valores que están encerrados
entre llaves. Nuestros arreglos tendrán un valor iniciar, ambos casos son válidos en C Sharp.
b) Multidimensionales
nuestro mundo real en donde podamos comparar más de tres dimensiones). No existe un límite
para el número de dimensiones que pueden ser representadas en arreglos, pero sí es
conveniente considerar que el incremento de consumo de memoria es exponencial. Observa la
siguiente tabla; en todas las dimensiones se suponen 10 elementos:
Dimensiones Producto Elementos
1 10 10
2 10X10 100
3 10X10X10 1 000
4 10X10X10x10 10 000
5 10X10X10X10x10 100 000
Tabla 2. Dimensiones
Como se puede observar, el número de dimensiones aumenta de forma exponencial los registros
que se necesitan en memoria, (recuerda que, finalmente, todo dato se representa por un espacio
en la memoria RAM). Si aumentamos las dimensiones, aumentamos el consumo de este espacio.
Respecto a la forma de representación, un arreglo de dos dimensiones se puede declarar
mediante el siguiente formato en C Sharp:
Tipo [ , ] dato;
dato = new Tipo [filas, columnas]
O bien:
Donde filas y columnas son el número de elementos que se quieren declarar en el arreglo. Un
ejemplo sería éste:
Equivalente a:
Si se requiere definir una matriz de tres filas por cuatro columnas, los elementos se representan
de esta manera:
La forma de definir un dato es sólo cuestión de estilos del programador. Para el compilador de C
Sharp el proceso es indistinto.
Si se define un arreglo de tres filas por cuatro columnas con estos elementos: dato[0,0]=2 y
dato[1,2]=0, es posible definir arreglos de cualquier número de dimensiones. Recuerda que el
límite es el rápido agotamiento de la memoria.
Existe el concepto de matriz escalonada, que es una variación del arreglo multidimensional, una
matriz de matrices. Es una matriz unidimensional, y cada elemento en sí mismo es una matriz.
No es necesario que todas sean del mismo tamaño (MSDN, 2013j).
Se define un arreglo de tres elementos, pero el primero de ellos tiene cinco; el segundo, ocho; y
el tercero, tres. A esto se le conoce como una matriz escalonada, y son llamadas así por su
similitud con el mismo concepto en matemáticas.
Se propone un ejemplo más para entender mejor estos conceptos: en una investigación de corte
ambiental se requiere tomar la presión barométrica, la temperatura máxima y la temperatura
mínima de cinco ciudades de la república mexicana en un día determinado.
Numero Ciudad
1 México, D. F.
2 Puebla, Pue.
3 Xalapa, Ver.
4 Tepic, Nay.
5 Mérida, Yuc.
Tabla 2. Grupo de ciudades
Se desarrollará un programa que solicite los datos al usuario y después los muestre en forma de
una tabla que tenga el siguiente formato:
Tabla3. Formato
Sin embargo, de manera general, no existe ninguna limitante para crear arreglos de cualquier
tipo, en este caso doubles y string. Los arreglos representan una información a la que se accede
a través de uno o más índices, dependiendo del número de dimensiones.
¿Qué pasa si se define un arreglo de tres elementos y se desea acceder al número cinco? En el
siguiente ejemplo se creará un objeto llamado alumno, el cual tendrá como datos miembro el
nombre y edad del alumno, de tipo string e int, respectivamente. Se realizará un constructor que
recibirá los dos datos y sólo se le integrarán dos propiedades get para recuperar ambos datos.
Al definir la clase alumno con los requerimientos dados en la propuesta, se observará el siguiente
código:
Se crea el programa que lea los datos de tres alumnos y que nos permita consultar uno de ellos
al solicitar el número del alumno. La primera línea debe tener la siguiente instrucción e indicar
que se utilizarán métodos de la clase System para leer datos:
Si se ejecuta la aplicación, se da de alta a tres alumnos y se solicitan los datos del índice dos y
uno, se obtendrá la siguiente salida:
Como se revisó en el Tema 3.1. Control de errores en C Sharp, es necesario que se controlen los
errores generados al manejar arreglos. Existen varias excepciones asociadas con el manejo de
esta información, una de ellas es IndexOutOfRangeException, generada por solicitar un número
de índice mayor que los elementos definidos en la inicialización del arreglo, caso presentado en
la imagen anterior.
Para finalizar este tema, se revisará el concepto de objeto que tienen los arreglos en C Sharp.
Como lo indica la base de conocimientos de Microsoft (MSDN, 2013ñ), en C# los arreglos son
realmente objetos. Cuando se define un arreglo de cualquier número de dimensiones se está
definiendo un objeto que, además de tener datos, tendrá métodos que permitirán manejar la
información.
El siguiente ejemplo muestra algunas funciones propias que aparecen al definir un arreglo:
Como se observa, el arreglo a tiene propiedades como Length, y métodos como Average() o
Sum(); existen muchos otros métodos y propiedades que puedes consultar en la base de
conocimientos MSDN de Microsoft. Con el simple hecho de definir un arreglo, se está definiendo
un objeto, y podrá disponer de métodos que permitirán manipular los datos.
Para concluir, se recuerda la definición de arreglo, según Ferguson (2005): conjunto finito de
datos, todos ellos del mismo tipo, con un mismo nombre e identificados por un índice.
3.2.2. Colecciones
Según el tema anterior, un arreglo es un conjunto finito de datos, todos ellos del mismo tipo, con
un mismo nombre e identificados por un índice (Ferguson, Patterson y Beres, 2005). Un conjunto
finito de datos implica un problema. Imagina que te solicitan hacer un programa en el que
almacenarás, en un arreglo, diferentes tipos de productos producidos por una empresa. Cuando
se te pide hacer el programa, la empresa produce cinco tipos diferentes; te dicen que el
incremento de nuevos tipos es un proceso muy lento por la gran cantidad de trámites que se
deben hacer, que aumentan a razón de uno o dos como máximo cada año. Una solución que
propones es crear un arreglo de 20 elementos; con lo cual das una vida promedio a tu programa
de 10 años, según los datos estadísticos dados por los requisitos de la empresa. Imagina que, por
alguna razón no identificada, durante la toma de los requerimientos, ellos registran 20 productos
en sólo dos años. Inmediatamente tu programa tendrá problemas porque no podrá controlar 25
productos, pues está diseñado en un arreglo de sólo 20.
El problema anterior se presenta porque los arreglos son finitos; es decir, en el momento que
son definidos y antes de usarlos, se debe decidir el número de datos que se tendrán, el cual no
puede cambiar durante toda la vida del arreglo.
Una colección es una forma sencilla, pero no finita, de expresar un arreglo. Esto no significa que
sea infinito, sino que no se tiene por qué definir al inicio de su uso cuántos elementos se tendrán;
es decir, se puede agregar elemento tras elemento según se requiera; por supuesto existe un
límite establecido según la memoria de la computadora, el disco duro, el microprocesador,
etcétera. El término colección es traducido por muchos autores como contenedor. Es una
herramienta proporcionada por .NET Framework, compuesta por clases especializadas para
almacenamiento y recuperación de datos (Liberty, 2001).
Las colecciones son un conjunto de clases que permiten almacenar y recuperar datos siguiendo
conceptos de estructuras de datos, tales como listas, pilas, colas, árboles, diccionarios, etcétera.
Al seleccionar una de ellas, es posible guardar información dentro de la estructura, sin
preocuparse de la forma en cómo se realiza esto y cuándo se recupera, porque no es necesario
conocer los detalles de esta operación. Como lo indican Deitel y Deitel (2007), .NET Framework
proporciona una serie de componentes reutilizables llamados colecciones, que están
normalizadas para que las aplicaciones se puedan compartir con facilidad, sin tener que
preocuparse por los detalles de su implementación. Están escritas para una amplia reutilización,
diseñadas para su ejecución rápida y uso eficiente de la memoria.
Existen varias clases (o colecciones) definidas por el Framework de .NET, algunas de las más
importantes son listas y diccionarios, que se explicarán con detalle a continuación porque son el
fundamento del resto de las colecciones. La primera guarda datos en forma de objetos, la
segunda en forma de pares de valores compuestos por llave-valor. El resto funciona bajo alguno
de estos dos principios, y sólo cambian algunas características; por ejemplo, si están ordenadas
o no, si se recuperan en el mismo orden en que se inserta la información, etcétera.
List
Es equivalente al concepto de una lista doblemente ligada. En esta clase o colección se utilizará
una lista y el tipo de elementos que ésta puede guardar. Automáticamente, el Framework de
.NET proporcionará una serie de propiedades y métodos que permitirán manipular los datos (los
que tú ingreses en la lista), tales como la longitud, buscar o borrar un elemento, ordenarlo,
encontrar el máximo, el mínimo, etcétera. El siguiente código es un ejemplo de su uso.
Esto indica al compilador que se utilizarán las colecciones. El código se muestra a continuación:
Diccionario
Es una colección de elementos conformados por un par, que tiene la siguiente estructura: Llave
→ Valor.
La información no es recuperada por un índice, sino por un valor llave, tal como sucede en el
siguiente ejemplo: se desarrollará un diccionario conformado por el par, número de control (un
valor entero) y nombre (una cadena). Se da de alta la siguiente tabla:
Llave Valor
345 Juan
245 Miguel
123 Ángel
667 Pedro
Tabla 5. Ejemplo de información de un diccionario
Las llaves no pueden repetirse, pero no es trascendente si se repiten los valores. La referencia
sólo se hace por la llave. Por ejemplo, en la tabla anterior puede ser posible tener otro alumno
de nombre Ángel, pero debe tener otra llave para identificarlo. No es posible tener dos llaves
iguales que identifiquen a dos personas diferentes, sería similar a pensar que existen dos
personas con la misma CURP; por eso la CURP es una clave única de identificación de las personas,
en otras palabras es nuestra llave.
Queue (cola)
“Representa una colección de objetos de tipo primero en entrar, primero en salir” (MSDN,
2013b).
Son útiles para guardar información en el orden en que fueron recibidas, simulan una cola de
personas ante una caja y son atendidas en el orden que llegaron. Los objetos almacenados en
Queue se insertan en un extremo y se quitan del otro.
Se utiliza el método Enqueue para poner en la cola un dato, Dequeue para quitarlo, Peek para
localizar el siguiente elemento, entre muchos otros.
3 Archivo.Ppt
Stack (pila)
Representa una colección LIFO (último en entrar, primero en salir) de tamaño variable, de
instancias del mismo tipo (MSDN, 2013d).
Las pilas son útiles para almacenar información y procesar la última que llegó. Los objetos
almacenados en un Stack se insertan en un extremo y se quitan en el otro. Proporciona una serie
de métodos para el manejo de la información con base en la filosofía de la pila. Los métodos más
importantes son Count, que indica cuántos elementos se tiene en un contenedor; push, que
guarda un elemento al inicio de la pila; pop, que recupera el primer elemento al inicio de la pila.
Existe también el método toArray, que convierte el contenido en un arreglo.
Representa una colección de pares clave/valor que se ordenan conforme a la clave (MSDN,
2013c).
Un comparador es una clase que le indicará a la colección cómo se deben ordenar los
objetos. Hasta este momento no se ha tenido necesidad de indicar cómo se deben ordenar
los objetos dentro de una colección, porque los datos utilizados se ordenan de manera
natural, numérica o alfabética. Pero en el caso de que se cuente con una colección con los
datos de un alumno tales como nombre, edad, sexo, semestre y carrera, es necesario crear
una clase especial que le indique a la colección por cuál de los cinco campos debe ser
ordenado, o también si se necesita una combinación de ellos (es posible que por necesidad
deba ordenarse según sexo y edad). Por ejemplo, las listas de alumnos se ordenan por
apellido paterno, apellido materno y nombre. Se usan tres campos, a esa clase se le llama
comparador.
Un ejemplo de lo dicho es el siguiente: se requiere hacer una colección que guarde los datos
de los autos en un lote a la venta. Se conoce la placa, marca, modelo, color, año y un precio
estimado de venta. Se necesita listarlos por placa, modelo o precio; ésta última
característica en dos opciones: de menor a mayor, o de mayor a menor. Para lo anterior se
necesitará el uso de un SortList.
Se necesitan definir cuatro comparadores para tener las cuatro diferentes formas de
ordenamiento solicitadas: 1) por placa; 2) por modelo o precio, pero éste en dos opciones:
3) de menor a mayor, y 4) de mayor a menor: tal como se muestra a continuación.
El programa principal mostrará el lote ordenado por placa, modelo, precio ascendente y
descendente. Esto se observa en el siguiente código, en el que se utiliza un List para generar
los resultados.
YCS3932 Nissan
Centra Lujo Perla 2000 95000
YTR1010 Ford
Focus Básico Rojo 2001 80000
YFG2100 Volkswagen
YCS3932 Nissan
Centra Lujo Perla 2000 95000
YAT1101 Honda
Civic Sedan Gris Plata 2010 98000
YUH2010 Toyota
Corola Típico Blanco 2005 90000
YTR1010 Ford
Focus Básico Rojo 2001 80000
YFG2100 Volkswagen
Golf Estándar Azul Acero 2000 65000
YFG2100 Volkswagen
Golf Estándar Azul Acero 2000 65000
YTR1010 Ford
Focus Básico Rojo 2001 80000
YUH2010 Toyota
Corola Típico Blanco 2005 90000
YCS3932 Nissan
Centra Lujo Perla 2000 95000
YAT1101 Honda
Civic Sedan Gris Plata 2010 98000
YAT1101 Honda
Civic Sedan Gris Plata 2010 98000
YCS3932 Nissan
Centra Lujo Perla 2000 95000
YUH2010 Toyota
Corola Típico Blanco 2005 90000
YTR1010 Ford
Focus Básico Rojo 2001 80000
YFG2100 Volkswagen
Golf Estándar Azul Acero 2000 65000
Con base en el modelo de dos autos, se nombrará auto1 y auto2, se comparará el modelo
del auto1 con el del auto2 (comparación alfanumérica donde A es menor que B, y así
sucesivamente, ANGEL es menor que MANUEL por las iniciales). Si son iguales, se regresa
un 0; si el modelo del auto1 es mayor que el del auto2, regresará un número positivo que
indica que no se deben intercambiar de posición; si es lo contrario, el auto1 resulta menor
que el auto2, se regresa un número negativo que indica que se deben intercambiar. Es
importante notar que se debe devolver un valor positivo o negativo, no importa el número
en sí. Esto se codifica de la siguiente manera:
Es muy fácil obtener el valor positivo con base en una resta, cuando se trata de comparar
valores numéricos. En las cadenas se utiliza el método compareTo, de las que devuelve un
-1, +1 o cero. De esta manera se comparan cadenas.
Se concluye este tema con una recapitulación acerca de la utilidad de las colecciones, que
permiten contener una gran cantidad de datos sin necesidad de definir su número desde
el inicio. La información se guarda sin preocuparse por los límites de almacenamiento y los
métodos de manejo de información, porque ya se encuentran implementados; es posible
tener acceso a ellos de forma directa con sólo invocarlos.
Cierre de la unidad
Con esta unidad concluye tu asignatura Programación .NET II. Los temas que se abordaron
redondean tus conocimientos de programación orientados a objetos y te muestran la
importancia de los conocimientos previos, tales como la estructura de datos.
El tema de control de errores nos permite crear aplicaciones estables, donde se controlen
situaciones especiales que pueden provocar que alguna aplicación interrumpa su ejecución
en forma inesperada.
El tema de conjunto de objetos te permite visualizar la forma en que una aplicación puede
manejar mayores volúmenes de información.
Con estos dos temas has redondeado tus conocimientos de C Sharp, es momento de una
reflexión de todos lo visto. Es recomendable que investigues más sobre objetos,
constructores, polimorfismo, sobrecarga, herencia y sobreescritura. Revisa su interacción
con el control de errores.
• Se recomienda el siguiente artículo que recopila todas las colecciones de objetos del
lenguaje C#: Microsoft. (2022). Colecciones y estructuras de datos. Recuperado de
https://docs.microsoft.com/es-es/dotnet/standard/collections/
Referencia muy completa de los usos de try-catch que nos proporciona C Sharp:
• MSDN. (2022). Try-catch-finally (Referencia de C#). Recuperado de
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-
catch-finally
• En este sitio web, también puedes encontrar tutoriales muy completos de C SHARP,
consulta la siguiente dirección: https://www.w3schools.com/cs/
Fuentes de consulta
• Stroustrup, B. (1997). The C++ Programming Language, 3a. ed. Estados Unidos:
Addison-Wesley.
• Troelsen A. (2010). Pro C# 2010 and the .NET 4 Platform. Estados Unidos de
América: Apress.