Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Net PDF
Net PDF
PÆgina 11
El lenguaje .Net
1
Este capítulo nos dará una introducción a las características
del lenguaje .Net, qué es el Framework, cómo se estructura
su lógica y qué herramientas y complementos disponemos en
el paquete de herramientas de Visual Studio. Una vez
comprendido los conceptos básicos del marco de trabajo
que nos brinda .Net, haremos una introducción a los
lenguajes estrella del producto.Visual Basic .Net y C#,
cuáles son las similitudes y diferencias entre ellos y
realizaremos algunos ejercicios prácticos.
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 12
El lenguaje .Net
El lenguaje .Net fue ganando lentamente su lugar en el mundo
de la programación, y la versión 2005 fue un gran para los
programadores.
Que es .Net
Comenzaremos por entender que es .Net, todos los
componentes que arman esta plataforma y la arquitectura que
éste maneja para desarrollo de software.
Los lenguajes
Veremos los lenguajes estrella que se incluyen en Visual Studio
.Net, como ser Visual Basic .Net y C#, sus diferencias y
similitudes.
Visual C#
C# ha ganando un terreno importante en los lenguajes de
programación por su potencia y practicidad. Conozcamos qué
características nos brinda.
Ejercicios prácticos
Para entender mejor los conceptos explicados hasta aquí de cada
lenguaje que componen a Visual Studio, realizaremos ejercicios
prácticos de consola, utilizando la sintaxis vista hasta el momento.
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 13
¿Qué es .NET?
¿Qué es .NET?
A continuación, haremos una introducción a .NET, y veremos
cuáles son las principales características que debemos conocer.
Para llegar a convertirnos en profesionales del Los principales elementos que constituyen la
desarrollo, no podemos omitir ningún concep- plataforma .NET son los siguientes:
to; por ese motivo comenzaremos conociendo
cuáles son los componentes que ofrece la tec- • .NET Framework: Es el componente
nología con la cual vamos a trabajar. fundamental, que contiene los elementos
Microsoft .NET es una plataforma de desarro- necesarios para la creación y ejecución
llo y ejecución de aplicaciones; es decir, pro- de las aplicaciones. Está formado,
porciona los elementos necesarios para el básicamente, por dos elementos: el entor-
desarrollo de aplicaciones de software, y todos no de ejecución de aplicaciones y las bi-
los mecanismos de seguridad y eficiencia para bliotecas base.
asegurar su óptima ejecución. • El entorno de ejecución de aplicaciones o
Veamos a continuación cuáles son algunas de runtime es el denominado Common Language
sus principales características: Runtime (CLR). Entre sus principales fun-
ciones, se ocupa de:
• Las aplicaciones de .NET se ejecutan en un - Administrar la memoria de forma inteli-
entorno aislado del sistema operativo deno- gente: Esto significa liberar y controlar
minado “runtime”, lo que lo hace flexible, la memoria de manera automática.
seguro y portable. - Realizar el aislamiento de aplicaciones:
• Es 100% orientado a objetos. Si una aplicación deja de funcionar, no
• Permite desarrollar aplicaciones en más de afecta a otra en ejecución ni al sistema.
un lenguaje de programación. - Brindar seguridad en la ejecución de los
• Está diseñado para posibilitar el desarrollo componentes: Basa su ejecución en la
de aplicaciones corporativas complejas, ro- información proporcionada por ellos
bustas y flexibles. (metadata), que indica cómo debe ejecu-
• Proporciona un único modelo de programa- tarse, qué versión utilizar y bajo qué
ción consistente para el desarrollo de dife- contexto de seguridad, entre otras cosas.
rentes modelos de aplicaciones (Windows,
Web, de consola, móviles, etc.) y para dife-
rentes dispositivos de hardware (PC, Tablet
Component Object Model
PC y Pocket PC, entre otros).
Es la plataforma para desarrollo de componentes
• Puede integrarse fácilmente con las aplica-
de software introducida por Microsoft antes de
ciones desarrolladas en modelos anteriores,
.NET. El término COM es usado comúnmente en
como COM. Es posible utilizar elementos
el desarrollo de software como un término que
COM en los desarrollos .NET, y viceversa.
abarca las tecnologías OLE, OLE Automation,
• Integra aplicaciones de otras plataformas y
ActiveX, COM+ y DCOM. Podemos decir
sistemas operativos, al implementar están-
entonces que .NET es la evolución de COM.
dares como XML, SOAP, WSDL, etc.
13
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 14
1. EL LENGUAJE .NET
Tecnología .NET
FIGURA 001 | Éstos son los principales componentes que integran la plataforma .NET.
14
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 15
¿Qué es .NET?
15
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 16
1. EL LENGUAJE .NET
16
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 17
¿Qué es .NET?
sin problemas nuevas partes escritas en C# o Como cada lenguaje proporciona su propia sin-
C++.NET. taxis en la implementación de las directivas del
Dado que la especificación CLS es un estándar CLS, es necesario que los compiladores “tra-
público, ha permitido que otros diseñadores duzcan” su código fuente en “algo” que sea
de lenguajes y compiladores desarrollen más entendible por el CLR. Ese “algo” se denomi-
de 20 lenguajes compatibles con ella y, por lo na MSIL o Microsoft Intermediate Language, que es
tanto, compatibles entre sí y con los lenguajes un código intermedio en el que se compilan
desarrollados por Microsoft. Todos los compo- todos los lenguajes de .NET. Estos componen-
nentes y las aplicaciones creados bajo estas espe- tes y aplicaciones resultantes de la compilación
cificaciones se dice que son de código adminis- se conocen como assemblies o ensamblados en
trado, o Managed Code. La única excepción es .NET. Pueden ser archivos ejecutables (.exe) o
C++.NET, que, además, tiene la capacidad de bibliotecas de clases y componentes (.dll). Los
crear código no manejado, o Unmanaged Code, assemblies no son ejecutables directamente, si-
debido a que muchas aplicaciones de muy bajo no que son compilados al código nativo de la
nivel, como drivers de dispositivos, necesitan te- CPU en la que se encuentran corriendo por el
ner acceso directo a los recursos del sistema compilador Just In Time (JIT) del CLR y, luego,
operativo para tener un mejor rendimiento. se ejecutan en su entorno. Para que el CLR
Compiladores
Compilador Compilador Compilador Compilador
VB.NET C// J// C++.NET
Código Nativo
SIstema Operativo
FIGURA 002 | Ejecución de las aplicaciones por medio del CLR. Los lenguajes de programación generan código
administrado en MSIL a través de sus compiladores. Los assemblies generados son tomados por el JIT del CLR,
traducidos a código nativo de la CPU en la que se encuentra y ejecutados en un ambiente aislado dentro del CLR.
17
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 18
1. EL LENGUAJE .NET
entienda cómo debe ejecutar estas aplicaciones • Compilación Just In Time (o “justo a
y componentes, los compiladores de los lengua- tiempo”): El CLR se encarga de compilar las
jes de .NET incluyen en la compilación la me- aplicaciones .NET a código de máquina nati-
tadata, que es la información que describe los vo para el sistema operativo y la plataforma
objetos que forman parte de la aplicación o de hardware en la que se está ejecutando. Es-
componente generado. to lo hace sin intervención alguna del de-
La metadata describe: sarrollador o el usuario y cuando se necesita.
• Gestión automática de memoria: El CLR
• Los tipos de datos y sus dependencias. abstrae a los desarrolladores de tener que pe-
• Los objetos y sus miembros. dir y liberar memoria explícitamente. Para lo-
• La referencia e información (incluyendo ver- grarlo, uno de sus componentes, llamado
sión) de los componentes y recursos exter- garbage collector (recolector de basura), se encar-
nos que son utilizados por la aplicación o ga de liberar periódicamente la memoria que
componente y que son necesarios para su ya no está siendo usada por ninguna aplica-
funcionamiento. ción. Por otra parte, el CLR también abstrae
a los desarrolladores del uso de punteros y
Esta metadata de un componente administrado del acceso a memoria de bajo nivel. Si bien
es utilizada por el CLR para proporcionar, en- estas características pueden ser consideradas
tre otras, las siguientes funcionalidades: poderosas, suelen hacer que el desarrollo y el
• Administrar la memoria. mantenimiento de aplicaciones resulten más
• Localizar y crear instancias de clases. propensos a errores y menos productivos.
• Administrar las referencias de los objetos y • Gestión de errores consistente: Como las
realizar el garbage collection. aplicaciones .NET no se ejecutan directa-
• Resolver las invocaciones de métodos. mente contra el sistema operativo, cualquier
• Generar código nativo. error no manejado que ocurra en tiempo de
• Asegurar que la aplicación tiene los recursos ejecución será atrapado por el CLR en últi-
necesarios para funcionar. ma instancia, sin afectar a ninguna otra apli-
• Reforzar la seguridad. cación que se esté ejecutando ni tener efec-
to alguno sobre su estabilidad.
• Ejecución basada en componentes: To-
Namespaces das las aplicaciones .NET son empaqueta-
das en componentes reutilizables denomina-
El conocimiento de los namespaces de .NET es
dos, genéricamente, assemblies, que el CLR
de fundamental importancia para aprovechar toda
se ocupa de cargar en memoria y de ejecu-
la funcionalidad que nos proporciona y, así, no
tar. Profundizaremos este tema en los pró-
tener que escribir código con el que ya contamos.
ximos capítulos del libro.
18
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 19
¿Qué es .NET?
• Gestión de seguridad: El CLR brinda una (clases e interfaces) orientados a objetos, extensi-
barrera más de contención a la hora de ejecu- bles mediante herencia e independientes del len-
tar aplicaciones manejadas, ya que permite es- guaje de programación que se desee utilizar (en
tablecer políticas de seguridad que deberán el libro Introducción a la programación, se describe el
ser cumplidas por las aplicaciones .NET que significado de muchos de estos conceptos, que
se ejecuten en una computadora. luego profundizaremos con mayor detalle). Este
• Multithreading: El CLR provee un entorno conjunto de elementos incluye la mayoría de las
de ejecución multi-hilos por sobre las capaci- funcionalidades que los programadores aplican
dades del sistema operativo, así como tam- de manera cotidiana.
bién, mecanismos para asegurar su sincroni- Dada la cantidad de clases (unos cuantos miles),
zación y el acceso a recursos compartidos. es necesario organizarlas de algún modo en que
sean fáciles de encontrar y que permita diferen-
ciarlas si poseen el mismo nombre. Para lograr es-
to, .NET proporciona lo que se denomina name-
Biblioteca de funcionalidad spaces o espacios de nombres. Se trata de califica-
(Base Class Library) dores de clases, que hacen posible determinar,
unívocamente, qué clases utilizar dentro de .NET
La funcionalidad principal de la Base Class Li- y, así, evitar ambigüedades. En la Tabla 2 vemos
brary es proporcionar cientos de tipos básicos una breve lista de los principales namespaces.
System.Data System.Xml
OleDb Odbc XSLT Serialization
Common SqClient XPath
System
Colections IO Security Runtime
Configuration Net ServiceProcess InteropServices
Remoting
Diagnostics Reflection Text
Serialization
Globalization Resources Threading
19
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 20
1. EL LENGUAJE .NET
20
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 21
¿Qué es .NET?
21
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 22
1. EL LENGUAJE .NET
22
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 23
¿Qué es .NET?
Barra de
herramientas
Área de
trabajo
Cuadro de
herramientas
Explorador
de soluciones
y ventana de
Propiedades
Lista de
errores
• Visual Studio 2005 Team Test Load acuerdo con la tarea que estemos realizan-
Agent: Destinada a testeadores de software. do, esta sección cambiará según las necesi-
Permite que las organizaciones simulen más dades.
usuarios y tests más precisos de desempeño • Lista de errores: Aquí están las ventanas de
en las aplicaciones desarrolladas. errores, la de tareas y la de salida.
• Cuadro de herramientas: Presenta la caja de
El IDE herramientas, que contiene todos los controles
El IDE proporciona herramientas tales como
los compiladores, un depurador o debugger
(que asiste en el seguimiento y la corrección Paciencia
de errores en los programas) y otras destina-
das a administrar los proyectos. Proporciona Aunque muchos de los conceptos vistos hasta el
un menú estándar, numerosas toolbars y un momento pueden resultarnos de difícil compren-
gran número de ventanas. El IDE está com- sión e incluso algo aburridos, debemos saber que es
puesto, básicamente, por cinco secciones: muy importante tener una base conceptual sólida
antes de comenzar a “tipear código”. Muchos de es-
• Barra de herramientas: Aquí se encuen- tos conceptos serán comprendidos con mayor clari-
tran las barras de herramientas, que dan ac- dad cuando empecemos a trabajar.
ceso a los comandos más comunes. De
23
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 24
1. EL LENGUAJE .NET
y componentes que podemos utilizar cuando Debido a la gran cantidad de elementos que
realizamos aplicaciones. Según el tipo de pro- contiene el IDE, se le han agregado otros
grama (Windows o Web), se llenará con los para aprovechar al máximo el espacio dispo-
controles y componentes apropiados para ca- nible. Uno de ellos es el AutoDock, que per-
da uno. También está el DataBase Explorer o mite mover las ventanas por todo el IDE
explorador de bases de datos, que nos da ac- utilizando el mouse para reposicionarlas. Si
ceso a los orígenes de datos a utilizar en por alguna razón cerramos alguna ventana,
nuestra aplicación. basta con ir al menú Ver para abrirla otra
• Explorador de soluciones y ventana de vez.
propiedades: Ambos son importantes, ya
que el primero presenta todos los proyec- Menús y barras de herramientas
tos y archivos con que estamos trabajando;
y el segundo, las propiedades de todos los El IDE presenta un conjunto de menús que
elementos del entorno. debemos acostumbrarnos a utilizar para sa-
• Área de trabajo: En este espacio aparecen carle el máximo provecho. Muchos de ellos si-
todos los documentos que estemos manejan- guen el estándar de cualquier aplicación Win-
do, tanto en vista de código como en vista dows, y otros cuentan con opciones y funcio-
de diseño. El IDE es un entorno de múlti- namiento similares a los de cualquier aplica-
ples documentos, y se accede a cada uno de ción. En la Guía Visual 002 se describen los
ellos a través de las solapas con su nombre. principales menús y sus funcionalidades.
Proporciona las Permite Destinado a Configura las Permite la selección Brinda acceso a la
opciones para la acceder a la compilación conexiones a y organización de ayuda integrada del
apertura y grabación las del proyecto. los orígenes de las ventanas dentro sistema.
de proyectos y ventanas datos. del IDE.
soluciones. del IDE.
Brinda los comandos Permite Posibilita el Contiene un conjunto Otorga acceso a los
para la edición de agregar seguimiento del de opciones para la recursos en línea
texto, tales como diferentes programa para la configuración del sobre Visual Basic.
Cut, Copy y Paste. elementos al determinación entorno y de los
proyecto. de errores. proyectos.
24
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 25
25
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 26
1. EL LENGUAJE .NET
Compiladores
En nuestra práctica anterior,Visual Studio realizó algunas tareas
para mostrar nuestra aplicación. Analicemos cuáles son.
Luego de escribir el código fuente de nuestro Language, o lenguaje intermedio de Microsoft),
programa, falta un paso más para poder ejecu- que se asemeja mucho a un assembler. El códi-
tarlo y ver nuestro trabajo funcionando: la com- go MSIL generado se almacena en un archivo
pilación. Éste es el proceso por el cual el código denominado ensamblado (o assembly, en inglés).
fuente (C#, Visual Basic .NET, etc.) se transfor- En Windows los ensamblados ejecutables tienen
ma en código que pueda ser entendido por la extensión exe, y los que son bibliotecas de cla-
máquina. En .NET el resultado de la compila- ses o de controles tienen extensión dll. Como
ción es un poco diferente. Supongamos que he- MSIL es independiente de la plataforma, se lo-
mos escrito el código para una primer aplica- gra una ventaja fundamental: no dejar atado el
cion. Luego de haber realizado esto y guardado programa compilado a una plataforma dada.
los archivos correspondientes al proyecto y mó- Luego, al momento de ejecutar el programa, un
dulos que lo componen, nos faltaría un paso componente denominado CLR (que veremos
más para poder ejecutarlo y verlo en funciona- luego) se ocupa de leer el código MSIL y de
miento. Este paso es la compilación. Por este convertirlo en código propio de la máquina en
proceso debe pasar el código fuente de nuestro la que se va a ejecutar. Para compilar, el CRL se
programa, haya sido desarrollado en VB.Net, vale del JIT-Compiler (JIT es el acrónimo de Just
C# u otro. El código es transformado en un In Time, que puede traducirse al español como
lenguaje intermedio que interpretará la máquina, “en el momento”). El JIT, o “jitter”, se encarga
denominado MSIL (Microsoft Intermediate de hacer la compilación final.
26
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 27
Herramientas de desarrollo
Herramientas de desarrollo
La plataforma .NET incluye, además de los compiladores, un
conjunto de herramientas para facilitar la tarea del desarrollador.
Como pudimos ver, la compilación es una de Además, Visual Studio ofrece opciones para
las etapas fundamentales. Cualquier inconve- depurar el código y dejarlo libre de errores, que
niente que detecte el compilador puede conver- permiten seguir la ejecución paso a paso, moni-
tirse en un dolor de cabeza si no contamos con torizar los valores de las variables e, incluso, al-
herramientas que nos asistan para manejar los terar el orden de ejecución para probar deter-
errores. La mejor ayuda que tendremos para es- minada parte del código fuente. Otra opción
to es, sin dudas, el IDE, del cual ya conocimos interesante que provee Visual Studio es la de-
algunas herramientas y funciones. Éste ofrece puración remota, consistente en seguir paso a
un potente editor con coloreo de sintaxis y tec- paso la ejecución de un programa que no se
nología IntelliSense (que muestra menús con encuentra en la misma computadora donde es-
opciones sensibles al contexto a medida que se tá el IDE, como un servicio en un servidor o
escribe). Esto es lo que nos permitirá minimi- una aplicación en un dispositivo móvil conecta-
zar muchos de los errores que más frecuente- do a la PC. Todas estas funciones las iremos
mente se cometen al escribir el código. desarrollando a lo largo del libro.
Además de Visual Studio, la plataforma .NET
cuenta con otras herramientas interesantes,
algunas desarrolladas por Microsoft y otras,
por terceros. Una muy útil es ILDasm.exe,
que permite tomar un ensamblado ya compi-
lado y obtener el código MSIL que contiene.
Con ella, podemos estudiar código ya compi-
lado, para revisar cómo queda. Ahora bien,
como se puede ver el código MSIL tan fácil-
mente, surge de inmediato una cuestión im-
portante: la de la propiedad del código. Es
decir, alguien que tome un ensamblado crea-
do originalmente por nosotros puede usar
ILDasm para ver su contenido. Si bien el có-
digo MSIL no es comprensible para cualquier
FIGURA 005 | Visual Studio proporciona herramientas para ayudar
persona, es fácil ver de qué manera está im-
al programador en la tarea de desarrollar y depurar los programas.
plementado un algoritmo. Y no es necesario
aclarar que esto puede ser muy perjudicial
Las herramientas de edición del cuando en el ensamblado interviene informa-
IDE permiten evitar los errores ción sensible involucrada, por ejemplo, con el
negocio de una empresa. Más adelante, anali-
más frecuentes que se zaremos algunas alternativas que permitirán
cometen al escribir código. brindar seguridad al código programado.
27
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 28
1. EL LENGUAJE .NET
28
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 29
Arquitectura de software
Arquitectura de software
La arquitectura nos permite desarrollar aplicaciones más
complejas, sin tener que empezar desde cero.
Éste es un concepto fundamental que debere- MONOLÍTICA
mos conocer antes de adentrarnos en el mundo En esta arquitectura, el software se estructura co-
de la programación. ¿A qué nos referimos preci- mo un único bloque. El resultado es un software
samente cuando hablamos de arquitectura de difícil de mantener y con baja escalabilidad.
software? La arquitectura define cómo se organi-
zarán los distintos componentes del software, de CLIENTE-SERVIDOR
manera que, juntos, puedan resolver el problema. Hace referencia a la arquitectura física más que
Los objetivos de las distintas arquitecturas son a la lógica. El software se divide en dos com-
favorecer la mayor cantidad de características del ponentes, sin embargo, no queda claro qué par-
software, desde el alto rendimiento hasta la facili- tes se colocan en cada uno.
dad de mantenimiento, la extensibilidad (con
cuánta facilidad pueden agregarse nuevos ele- EN CAPAS O NIVELES
mentos) y la escalabilidad (cuánto puede crecer el En este caso, el software se divide en tres o
software en cantidad de usuarios y datos).Vea- más niveles, cada uno de los cuales se comu-
mos algunos ejemplos de arquitectura. nica sólo con el que tiene debajo.
Arquitectura Cliente-Servidor
Interfaz de
usuario } Capa de Interfaz de Usuario
Procesos de
Negocios } Capa de Reglas de Negocios
29
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 30
1. EL LENGUAJE .NET
ADO.NET y XML
Distribuible
30
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 31
GARBAGE COLLECTOR
Common Language En .NET, el programador no necesita preocu-
Runtime parse por pedir memoria para los datos ni por li-
berarla cuando ya no la necesita. El CLR provee
La parte distribuible del framework está forma-
servicios de administración automática de me-
da por varios componentes. El más importante
moria. El garbage collector (recolector de basu-
es el CLR. Como vimos antes, el modelo de
ra) es el responsable de liberar la memoria cuan-
ejecución de .NET está dentro de los denomi-
do ya no queda espacio, al desechar aquellos ob-
nados “de máquina virtual”, es decir que el có-
jetos que no se utilizan. Cada vez que la aplica-
digo no se compila a instrucciones nativas de la
ción necesita más memoria y ya se llenó el espa-
máquina física, sino que se genera en un len-
cio que le fue asignado, el CLR invoca al garbage
guaje intermedio. Veamos en detalle los com-
collector para liberar espacio y, así, poder seguir
ponentes más importantes del CLR, para en-
satisfaciendo los requerimientos de la aplicación.
tender mejor sus incumbencias.
Tengamos en cuenta que para desarrollar apli-
SECURITY ENGINE
caciones, no es necesario saber al pie de la letra
Una de las premisas de diseño más importantes
todos estos conceptos teóricos. Aunque al igual
de .NET como tecnología es la seguridad. Cuan-
que sucede en un automóvil, más allá de saber
do ejecutamos aplicaciones .NET, podemos es-
manejarlo, hay que saber por dónde cargarle
pecificar niveles de confianza, que dependen del
combustible y cuáles son los componentes ne-
origen de la aplicación o del lugar donde se en-
cesarios para su correcto funcionamiento (acei-
cuentren los archivos al momento de la ejecu-
te, refrigerante, frenos, etc.).
ción. También, al escribir la aplicación, podemos
exigir que se cumplan ciertos requisitos en lo
CLASS LOADER
que respecta a la seguridad para ejecutar una
El class loader es el responsable de cargar en
porción de código. El security engine, entonces,
memoria el código necesario para ser ejecutado
es el responsable de asegurar que se cumplan las
y de analizar la metadata de cada ensamblado
condiciones de seguridad necesarias.
con el objetivo de proveer la información re-
querida para la ejecución.
DEBUG ENGINE
Este componente permite depurar las aplica-
IL TO NATIVE COMPILERS
ciones y hacer el seguimiento del código duran-
Como ya vimos, al momento de ejecutar la
te la ejecución. Si bien una aplicación puesta en
aplicación, el código MSIL se traduce en códi-
producción puede no contener información de
go nativo de la máquina. Esta tarea es llevada a
debug, este componente es uno de los más úti-
cabo por el CLR a través de los compiladores
les durante su desarrollo.
de código intermedio a código nativo.
TYPE CHECKER
El lenguaje MSIL fue diseñado para asegurar la
El debug engine permite depurar seguridad de tipos. Esto significa que el MSIL,
las aplicaciones y hacer el por diseño, ya nos asegura que no podremos
asignar por error un valor de otro tipo a una va-
seguimiento durante la ejecución. riable (por ejemplo, asignar un texto a una varia-
ble de tipo numérico). Si bien muchos errores
31
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 32
1. EL LENGUAJE .NET
32
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 33
La biblioteca de clases
del framework
El framework .NET incluye un gran número
de clases y de componentes que ayudan al pro-
gramador en su tarea diaria. Estas clases inte-
gran la denominada biblioteca de clases del
framework, o FCL por sus siglas en inglés
(.NET Framework Class Library). La FCL contie-
ne los bloques básicos para construir aplicacio-
nes, y provee clases para realizar la mayoría de
las tareas comunes en cualquier programa, co-
FIGURA 009 | La GAC contiene una lista de los assemblies públicos
mo acceso a archivos, manejo de textos, lectura
que están en la computadora. Los ensamblados se colocan en la
y navegación de archivos XML, conexión a ba-
GAC para no tener que copiarlos a las carpetas de cada aplicación.
ses de datos, etc. Dada la cantidad de clases
que componen la FCL, los creadores del fra-
mework decidieron organizarlas en una estruc-
tal como sucedía con los componentes COM.
tura jerárquica que permita encontrar fácilmen-
Esto, junto con la característica de autodes-
te la que se está buscando. Esta estructura de
cripción, facilita rotundamente la instalación y
nombres se denomina namespace (espacio de
la actualización de aplicaciones, ya que para
nombres). Los namespaces, además, permiten
instalar una aplicación basta con copiar en
evitar conflictos de nombres, ya que podemos
una carpeta todos los ensamblados que la
tener dos clases que se llamen de la misma ma-
conforman.
nera, pero en namespaces diferentes.
33
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 34
1. EL LENGUAJE .NET
34
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 35
35
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 36
1. EL LENGUAJE .NET
MSIL
MSIL
Código de Máquina
36
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 37
37
038a047.qxp 06/07/2008 10:52 p.m. PÆgina 38
1. EL LENGUAJE .NET
System System.Globalization
Contiene clases útiles para escribir aplicaciones
El espacio de nombres System es la raíz de to- con soporte para más de una cultura e idioma,
do el árbol de nombres. Toda clase provista lo que se conoce como internacionalización o
por el framework está en el namespace System globalización. Las clases que incluye permiten
o en alguna de las ramas que parten de él. Ade- manipular formatos de fecha, de número y de
más, en él se encuentran los tipos por valor bá- monedas, como así también manejar los crite-
sicos (como Int32, Char, String, Boolean, etc.). rios para ordenar cadenas de textos con el fin
de adecuar la lógica de la aplicación a la cultura
System.Collections del país donde se la está usando.
Contiene clases que definen diversas colecciones
de objetos, como listas, tablas Hash, pilas, colas y System.IO
listas ordenadas. También provee interfaces que Proporciona clases para trabajar con archivos
establecen las bases para la creación de nuevas y secuencias de datos. Mediante las clases de
clases de tipo colección y listas de objetos sobre este namespace, no sólo podemos leer y es-
las que se puede iterar elemento a elemento. cribir archivos, sino que también podemos
Desde la versión 2.0 del framework, hay una ra- manipular directorios (por ejemplo, obtener
ma muy interesante de este namespace llamada la lista de archivos). Contiene, además, un
System.Collections.Generic, que contiene clases conjunto de clases que permite abstraer el
que representan colecciones fuertemente tipadas. medio físico con el que se trabaja, para lograr
mayor flexibilidad (por ejemplo, podemos
System.Configuration manipular una secuencia de datos sin impor-
Proporciona clases e interfaces para acceder y tar si se trata de un archivo o de los datos re-
manipular por código los archivos de configu- cibidos por la red).
ración de las aplicaciones (archivos .config).
System.Net
System.Diagnostics Proporciona clases para acceder a recursos de re-
Proporciona clases que posibilitan interactuar des, sobre todo, de Internet. Las clases están di-
con procesos del sistema, registros de eventos señadas de tal manera que logran independizar al
38
038a047.qxp 06/07/2008 10:52 p.m. PÆgina 39
System.Resources
Contiene clases e interfaces que permiten mani-
El espacio de nombres pular recursos asociados a la referencia cultural
System es la raíz de todo de la aplicación, tales como cadenas de texto o
imágenes almacenadas dentro de un ensamblado.
el árbol de nombres.
System.Security
programador de los protocolos subyacentes (por Contiene clases relacionadas al subsistema de
ejemplo, se pueden hacer invocaciones HTTP seguridad del CLR, que permiten conocer in-
sin conocer los detalles del protocolo). formación del contexto de seguridad, como
así también especificar requerimientos de se-
System.Relection guridad para la ejecución del código.
Este interesante espacio de nombres contiene
clases que permiten recuperar información so- System.ServiceProcess
bre los ensamblados, módulos, parámetros y Proporciona clases que permiten a los desarrolla-
cualquier otro tipo de dato de código adminis- dores crear e instalar servicios. Los servicios son
trado, leyendo los metadatos de los ensambla- aplicaciones de larga duración que corren en se-
dos. También provee clases para manipular y gundo plano y sin interfaz de usuario.
cargar tipos de datos en tiempo de ejecución y
hacer invocaciones a métodos. La rama System.Text
System.Reflection.Emit permite generar código Incluye clases para la manipulación de cade-
en tiempo de ejecución. nas de texto en distintas codificaciones
39
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 40
1. EL LENGUAJE .NET
40
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 41
System.Data.Common System.Data.OleDb
Este espacio de nombres contiene clases, en su Brinda las clases necesarias para acceder a datos
mayoría, abstractas, compartidas y heredadas mediante el proveedor OLE DB, con el cual es
por todos los proveedores de acceso a datos. La posible conectarse a cualquier fuente de datos.
clase que más se destaca es DataAdapter, que in-
cluye un conjunto de comandos SQL para acce- System.Data.Odbc
der a la base de datos, tanto para recuperar co- Este espacio de nombres otorga un proveedor
mo para actualizar datos. Cada proveedor debe de acceso a datos que permite trabajar práctica-
luego heredar de esta clase para implementar las mente con fuentes de datos que implementen un
particularidades del motor de base de datos. driver ODBC (Open DataBase Connection).
System.Data.SqlClient System.Data.SqlTypes
Este espacio de nombres contiene las clases Proporciona clases para los tipos de datos na-
que componen el proveedor de acceso a da- tivos de SQL Server. Estas clases ofrecen una
tos utilizado por ADO.NET (el cual veremos alternativa más rápida y segura a otros tipos de
más adelante con mayor detalle) para SQL datos. Las clases de este espacio de nombres
Server de Microsoft. sirven para evitar los errores de conversión
FIGURA 014 | El modelo de acceso a datos de ADO.NET proporciona una forma desconectada
de trabajar, lo cual permite manipular la información sin estar conectado a la base de datos.
41
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 42
1. EL LENGUAJE .NET
de tipos que pueden ocasionar una pérdida ventanas y de controles; en resumen, incluye
de precisión al recuperar información de la todo lo necesario para la creación de interfa-
base de datos. ces de usuario basadas en ventanas.
System.Xml System.Windows.Forms
El framework .NET tiene un extenso soporte Como decíamos, este espacio de nombres
para trabajar con documentos XML como contiene las clases básicas para la creación de
fuente de información. Mediante las clases del aplicaciones basadas en ventanas. Sin dudas,
espacio de nombres System.Xml y sus deriva- la clase más importante de este grupo es
dos, es posible leer documentos XML, guar- Form, que representa una ventana. Otra cla-
darlos, hacer transformaciones complejas, na- se muy importante es Control, de la que he-
vegarlos de manera orientada a objetos e, in- redan todos los controles visuales que pode-
cluso, acceder a partes específicas del docu- mos colocar en un Form (botones, listas de
mento a través de consultas XPath. selección, casillas de verificación, etc.). Ésta,
además, sienta las bases para crear controles
propios. También hay clases que permiten
imprimir textos y documentos, y manipular
Windows Forms las propiedades de impresión (márgenes u
Las aplicaciones .NET que corren en orientación, por ejemplo).
ventanas tradicionales de Windows se deno- Además, este namespace contiene clases úti-
minan aplicaciones WinForms, y el frame- les para la comunicación con el usuario a tra-
work .NET brinda un gran soporte para su vés de cuadros de diálogo. Por ejemplo, la
creación. El namespace más importante en clase OpenFileDialog permite mostrar una
este aspecto es System.Windows.Forms, que ventana para que el usuario seleccione el ar-
contiene clases para facilitar la creación de chivo que desea abrir.
FIGURA 015 |
El namespace
System.Windows.Forms
contiene las clases
necesarias para escribir
aplicaciones basadas
en ventanas.
42
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 43
43
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 44
1. EL LENGUAJE .NET
44
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 45
Veamos ambos casos en un ejemplo: la condición por evaluar y, luego, la palabra clave
Then. Después debe ir la instrucción o grupo de
' Declaro dos variables del mismo tipo en instrucciones que se van a ejecutar si la condi-
la misma línea ción es verdadera. Opcionalmente, podemos uti-
Dim variable1, Variable2 As String lizar la palabra clave Else luego del bloque de
código, para especificar una instrucción que se
' Declaro dos variables de distinto tipo en ejecutará si la condición es falsa.
la misma línea
Dim variable1 As String, Variable2 as Integer If a > 0 Then
c = b / a
End If
Variable1 = 5
En este caso, si el valor de la variable a es mayor
En este caso, la variable con nombre Variable1 que 0, a la variable c se le asignará el resultado de
queda asignada con el valor 5. dividir el valor de la variable b por el de la varia-
ble a; en caso contrario, se le asignará el valor 0.
Sentencia If Si necesitamos ejecutar más de una instrucción
La sentencia If representa la estructura de selec- en cualquiera de las dos partes del If, deberemos
ción más simple en Visual Basic .NET, y permite comenzar una nueva línea luego de la palabra
ejecutar una porción de código sólo si se cumple Then y, también, luego de Else en caso de que
una determinada condición. Se escribe comen- exista. Además, en este caso, debemos cerrar la
zando la línea con la palabra clave If, seguida de estructura con las palabras End If .
45
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 46
1. EL LENGUAJE .NET
Observemos que en la parte de Else, si bien te- queño ejemplo para entender mejor el funcio-
nemos una sola instrucción, no podemos escri- namiento de Select Case. Supongamos que te-
birla en la misma línea que la palabra Else, ya nemos una variable que contiene un número de
que con Then iniciamos un bloque If comple- mes, y queremos mostrar en pantalla la canti-
jo. Si no tenemos un bloque Else, igualmente dad de días de ese mes (para simplificar, no va-
debemos cerrar con End If. mos a considerar años bisiestos). El código ne-
cesario es el siguiente:
Sentencia Select Case
La sentencia Select Case puede verse como un Select Case Numerotes
caso generalizado de If, aunque en vez de eje- Case 1,3,5,7,8,10,12
cutar una porción de código dependiendo de Console.WriteLine(31)
una condición lógica, divide la ejecución en un Case 2
grupo de casos disjuntos (es decir que sólo se Console.WriteLine(28)
ejecutará uno de ellos). Case Else
Su sintaxis puede resumirse de esta manera: Console.WriteLine(30)
End Select
' .....
46
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 47
para terminar:”)
Sentencia While Numero = Integer.Parse(Console.ReadLine())
Muchas veces necesitamos repetir un bloque de Console.WriteLine(Numero ^ 2)
código, pero no sabemos de antemano la canti- Loop
dad de iteraciones que debemos hacer, porque Console.WriteLine(“Hemos terminado. Presione
esto dependerá de alguna condición relaciona- una tecla para salir”)
da con el bloque mismo que se ejecuta como Console.ReadKey()
parte de la iteración. En estos casos, el cons-
tructor For no nos sirve, ya que dentro del blo- No nos preocupemos por ahora por las instruc-
que por iterar no se puede alterar el valor de la ciones que no conocemos (en el futuro trabajare-
variable contadora. Para esta situación, conta- mos con aplicaciones Windows y no de consola).
mos con un constructor llamado comúnmente Presionando <F5>, podremos ejecutar la aplica-
While, que permite la ejecución de un bloque ción. Veremos que mientras ingresemos valores
de código repetidas veces mientras se cumpla distintos de 0, el programa imprimirá el cuadra-
una condición lógica. La sintaxis básica de la do del número escrito y nos pedirá otro; así su-
sentencia While es la siguiente: cesivamente hasta que ingresemos un 0.
47
048a063.qxp 09/07/2008 06:32 p.m. PÆgina 48
1. EL LENGUAJE .NET
Procedimientos
y funciones
Aprenderemos a utilizar herramientas que nos permitirán
agilizar práctica de programador.
Cuando escribimos programas, normalmente (esto se mantiene así por compatibilidad con
nos encontramos con porciones de código versiones anteriores del lenguaje). Veamos
que se repiten. En estos casos, resulta una un ejemplo de procedimiento. Supongamos
buena práctica escribirlas una sola vez y, lue- que estamos trabajando en una aplicación de
go, referenciarlas en cada ocasión en que sean consola con varias salidas por pantalla y que
necesarias. En el mundo de la programación queremos dividir las distintas salidas con
estructurada, estas porciones de código se de- una secuencia de 80 guiones.
nominan procedimientos o funciones. Si Para lograrlo, escribimos un procedimiento
bien la motivación de ambos es la misma, tie- que imprima los guiones y, luego, lo invoca-
nen entre sí semánticas diferentes. Los proce- mos cada vez que sea necesario:
dimientos están destinados a realizar tareas
que no necesiten devolver nada a quien las Sub ImprimirGuiones()
indicó (por ejemplo, el resultado es imprimir For i as Integer=1 To 80
algo en pantalla), en tanto que las funciones Console.Write(“-“)
devuelven un valor a quien las llama (por Next
ejemplo, realizar un cálculo sobre la base de End Sub
datos proporcionados y brindar el resultado).
Luego, en el código de la aplicación, podemos
usar este procedimiento cuantas veces preci-
semos, escribiendo las siguientes líneas:
Procedimientos
ImprimirGuiones()
En Visual Basic .NET, los procedimientos se
Console.WriteLine(debe)
implementan usando la palabra clave Sub.
Console.WriteLine(haber)
Cada uno posee un nombre y un bloque de
ImprimirGuiones()
código que será el código por ejecutar cuan-
Console.WriteLine(saldo)
do éste sea invocado. El bloque de código se
ImprimirGuiones()
delimita por las palabras Sub y End Sub.
Dentro del procedimiento podemos escribir
cualquier sentencia que necesitemos, incluso,
llamar a otros procedimientos. Un procedi-
Cada procedimiento posee un
miento se llama, simplemente, escribiendo su nombre y un bloque de código
nombre. De manera opcional, se puede utili- que será el que se deba ejecutar
zar la palabra clave Call más el Nombre-
DelMetodo, pero no es obligatorio hacerlo
cuando éste sea invocado.
48
048a063.qxp 09/07/2008 06:32 p.m. PÆgina 49
Procedimientos y funciones
49
048a063.qxp 09/07/2008 06:32 p.m. PÆgina 50
1. EL LENGUAJE .NET
Tipos de parámetros
Procedimiento
Sub A (ByVal A1, ByRef A2)
End Sub 002 004
Hola 003
Llamador
Mundo 002
Dim C, D as String
C = “Hola” Hola 001
Pila
D = “Mundo”
A (C, D)
FIGURA 017 | Cuando se pasa un parámetro por valor, en la pila se coloca una copia,
en tanto que si es por referencia, se coloca la dirección de memoria del valor original.
50
048a063.qxp 09/07/2008 06:32 p.m. PÆgina 51
Procedimientos y funciones
Parámetros opcionales
es que tiene), se debe indicar el tipo de dato
A veces ocurre que ya tenemos un procedi-
del valor devuelto, mediante la palabra As
miento escrito y se nos presenta una situa-
seguida de un nombre de tipo. Otra diferen-
ción en la que puede servirnos, pero necesi-
cia importante con los procedimientos es
taríamos pasarle un parámetro más para re-
que las funciones deben incluir la instruc-
solver ese caso en particular. El problema es
ción Return al menos una vez. Ésta se en-
que deberemos buscar todos los lugares
carga, básicamente, de devolver el valor de
donde utilizamos el procedimiento para
la función al llamador. Veamos un ejemplo
agregar el parámetro en la llamada. Además,
para ilustrar el uso y la escritura de las fun-
como el nuevo parámetro se usa para resol-
ciones. Supongamos que queremos escribir
ver un problema que antes no teníamos, no
una función que reciba dos valores y devuel-
sabremos qué valor pasarle. Para resolver es-
va la diferencia entre el mayor y el menor de
to, Visual Basic .NET nos da la posibilidad
ellos. El código será el siguiente:
de crear parámetros opcionales, que no es
necesario pasar.
Function SumaEjemplo(ByVal a As Integer,
Para declarar un parámetro como opcional,
ByVal b as Integer) As Integer
recurrimos a la palabra clave Optional, pero
If a > b Then
hay que tener en cuenta que los parámetros
Return a – b
opcionales deben estar siempre al final de la
Else
lista de parámetros. Esto es importante, por-
Return b – a
que si queremos agregar un parámetro más,
End Function
éste deberá ser también opcional o insertar-
se antes del primero de este tipo. Para termi-
Como podemos ver, en este ejemplo la fun-
nar de comprender bien cómo hay que utili-
ción recibe dos parámetros de tipo Integer
zarlo, veamos un breve ejemplo referido al
uso de parámetros opcionales:
Esta instrucción corta la ejecución y sale de la ‘ Hacer algo con los parámetros
función. Es importante recordar esto, porque en End Sub
caso de que haya que hacer alguna otra tarea ‘ . . . . .
dentro de la función, deberemos hacerla antes ‘Ejemplo de uso:
del Return; de lo contrario, nunca se ejecutará. Procedimiento(3,5)
Procedimiento(3)
51
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 52
1. EL LENGUAJE .NET
Sintaxis de clases
Los siguientes constructores nos permitirán escribir
aplicaciones orientadas a objetos desde Visual Basic.
Una de las grandes diferencias sintácticas y se-
mánticas entre Visual Basic .NET y su predecesor Visual Basic .NET tiene soporte
es que VB.NET brinda soporte completo para
programación orientada a objetos. Si bien en su
completo para programación
versión 6 intentó incluir soporte de orientación a orientada a objetos.
objetos, recién con la llegada de .NET ésta se hi-
zo más sólida y formal. A continuación, veremos
te de la clase y estará disponible para ser usa-
los constructores que ofrece Visual Basic .NET
do por sus instancias. Las clases son conside-
para escribir aplicaciones orientadas a objetos.
radas como tipos de datos, en el sentido de
que desde el punto de vista sintáctico, las ins-
tancias son variables cuyo tipo de dato es la
Creación de clases clase a la que pertenecen.
Para crear una instancia de una clase, debe-
Los dos conceptos más importantes y usados mos definir el objeto como si fuese una varia-
en la programación orientada a objetos son las ble, utilizando la palabra clave Dim. Sin embar-
clases y los objetos: go, a diferencia de los tipos básicos, para usar
un objeto, además de declararlo, es preciso
• Las clases son abstracciones de objetos de la
realidad que se quieren modelar.
• Los objetos son instancias particulares de las
clases; cada uno pertenece a una clase (agru-
Modificadores de alcance
pados por propiedades comunes) pero tiene
Los modificadores de alcance definen el alcance o
identidad propia.
visibilidad de cada elemento de una clase. En Visual
Basic .NET hay varios modificadores de este tipo,
La definición de una clase está comprendida por
de los cuales los más conocidos son:
la asignación de un nombre de clase utilizado pa-
ra agrupar sus métodos y propiedades. En Visual
• Public: Todo lo definido como Public será acce-
Basic .NET, la forma de definir una clase es a tra-
sible para cualquiera que use la clase, y dentro
vés de las palabras clave Class y End Class:
de la clase misma también.
• Private: Los definidos como Private sólo serán
Class NombreDeLaClase
visibles dentro de la clase; nadie más tendrá ac-
‘Aquí van los métodos y propiedades
ceso a ellos.
‘ . . .
• Protected: Un elemento definido de este modo
End Class
será visible dentro de la clase y dentro de las
clases que hereden de ella.
Todo el código (métodos o propiedades con
diferentes modificadores de alcance) será par-
52
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 53
Sintaxis de clases
End Class
Dim objeto As Clase ‘Definimos el objeto
53
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 54
1. EL LENGUAJE .NET
54
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 55
Sintaxis de clases
55
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 56
1. EL LENGUAJE .NET
End Class
Jerarquía de objetos
Object
Figura
56
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 57
Sintaxis de clases
También podemos decir que la clase Trián- llamado EmitirSonido. Como el sonido que
gulo es una “subclase” de Figura. Como se emita dependerá de cada tipo de mamífero
Triángulo hereda de Figura, contiene tam- en particular, podemos hacer que cada clase
bién el atributo Lados, con lo cual ya hemos derivada tenga su propia implementación del
logrado reutilizar parte del código. método, imprimiendo en pantalla la onomato-
Si creamos una instancia de la clase Triángu- peya del sonido. Vamos a verlo en código:
lo, podremos escribir lo siguiente:
Public Class Mamifero
Dim miTriangulo As New Triangulo()
Public Overridable Sub EmitirSonido()
miTriangulo.Lados = 3
End Sub
End Class
Redefinición de métodos
La herencia no sería muy valiosa si cada cla- Public Class Perro
se derivada quedara atada al comportamien- Inherits Mamifero
to de la clase padre. En cualquier lenguaje Public Overrides Sub EmitirSonido()
orientado a objetos, una clase hija debe po- Console.WriteLine(“Guau…”)
der redefinir el comportamiento de su pa- End Sub
dre, para adaptarlo a sus propias necesidades End Class
y características. En Visual Basic .NET la
forma de redefinir y rescribir métodos es Public Class Gato
mediante la palabra clave Overrides, pero Inherits Mamifero
para que un método pueda ser redefinido, Public Overrides Sub EmitirSonido()
en la clase base debe contener la palabra Console.WriteLine(“Miau…”)
Overridable (que se puede rescribir). End Sub
La técnica consiste en identificar aquellos End Class
métodos que será necesario rescribir en las
clases hijas y colocarles la palabra clave
Overridable. Luego, cada clase hija puede
redefinir estos métodos (no es obligatorio
Ejercicios
hacerlo), proveyendo el código necesario pa- Antes de pasar a algunos ejercicios resueltos
ra actuar de acuerdo con sus necesidades. para afirmar los conceptos estudiados, veamos
Para ilustrar este concepto, imaginemos que una serie de instrucciones y herramientas que
tenemos una clase Mamifero con un método vamos a necesitar.
57
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 58
1. EL LENGUAJE .NET
58
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 59
Ejercicios prácticos
A continuación, desarrollaremos algunos ejemplos prácticos
en los que aplicaremos los conceptos ya aprendidos.
Veamos nuestro primer ejemplo utilizando el segundo (con división entera, por supuesto).
entorno de Visual Basic. En este caso, vamos a Al ejecutar la aplicación (presionando <F5>),
escribir una aplicación que muestre por panta- veremos que se ejecuta pero se cierra inme-
lla los números impares entre el 1 y el 20, diatamente, sin que alcancemos a ver los re-
usando un ciclo For pero sin usar Step. Para sultados. Esto es así porque el IDE crea la
realizar este ejercicio, vamos a escribir un ciclo consola para ejecutar la aplicación, y cuando
For que cuente desde 1 hasta 20, y como no ésta termina, la consola se cierra en forma
podemos usar el Step para ir de dos en dos so- automática. Para evitarlo, y poder ver la salida
bre los números impares, vamos a usar un If de nuestro programa, agregamos una llamada
para determinar si el valor de la variable conta- a Console.ReadKey() luego de la palabra
dora del For es par o impar. Como todos los Next. Esto hará que el programa se quede
números pares son divisibles por 2, para saber esperando la presión de una tecla.
si un número es impar, podemos preguntar si Si presionamos cualquiera, la aplicación ter-
no es divisible por 2; es decir, si el resto de di- minará, pero si ejecutamos la aplicación, vere-
vidirlo por 2 es 1. mos la consola con los números impares en-
Vayamos entonces al código. Dentro del méto- tre el 1 y el 19.
do Main creado cuando generamos el proyecto
con Visual Studio, escribimos el código:
Dim i As Integer
For i = 1 To 20
If i Mod 2 = 1 Then
Console.WriteLine(i)
End If
59
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 60
Case 7
nombreMes = “Julio” No debemos olvidarnos de colocar la instrucción
Case 8 Return al final de la función, porque, de no ha-
nombreMes = “Agosto” cerlo, la función devolverá una cadena vacía.
Case 9
nombreMes = “Septiembre”
Case 10 Podemos asignar un valor
nombreMes = “Octubre”
Case 11
o una variable a otra, sin hacer
nombreMes = “Noviembre” la conversión explícita de tipos.
Case 12
60
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 61
End Class
Números fraccionarios
FIGURA 023 | Visual Studio nos brinda
En este caso, veremos cómo crear una clase
una plantilla para agregar una nueva clase.
para representar números fraccionarios. Ésta
deberá tener dos variables de instancia (priva- Si repasamos los conceptos aprendidos sobre
das) para mantener el valor del numerador y creación de clases, recordaremos que la pala-
del denominador de la fracción, además de bra clave fundamental aquí es Class.
sendas propiedades para hacer públicas las va- A continuación, debemos agregar las variables
riables de instancia. de instancia para el numerador y el denominador,
61
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 62
62
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 63
Console.Write(“Ingrese el numerador: “)
63
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 64
1. EL LENGUAJE .NET
64
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 65
// operador de división
65
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 66
1. EL LENGUAJE .NET
Console.WriteLine(14 / 2);
// operador de multiplicación
Console.WriteLine(5 * 6);
En C# todas las instrucciones
y declaraciones deben terminar
Éstos son los resultados obtenidos a partir del con “;” (punto y coma).
uso de los operadores:
15
27
a partir de clases. C# cuenta con un sistema
29
de tipos unificado, el CTS (Common Type
False
System), que proporciona todos los tipos de da-
7
tos como clases derivadas de la clase de base
30
System.Object. El framework .NET divide los
tipos en dos grandes grupos: los tipos valor y
los tipos referencia. Cuando se declara una va-
Variables riable que es de un tipo valor, se está reservan-
do un espacio de memoria en la pila para que
Muchos de los lenguajes orientados a objetos almacene los datos reales que contiene esa va-
proporcionan los tipos agrupándolos de dos riable. Por ejemplo, en la declaración:
formas: los tipos primitivos del lenguaje, como
números o cadenas, y el resto de tipos creados int num =10;
66
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 67
arrayDeNumeros[2] = 37;
double num=10.75;
// El mismo array, se puede llenar durante
double num=10.7508; su declaracion
i++) {
Console.WriteLine(i);
FIGURA 024 | Ejemplo con variables. // Es posible utilizar foreach para iterar
67
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 68
1. EL LENGUAJE .NET
Construcción else if
if ( <Expresión Booleana> ) <sentencia>
Flujo 1
Flujo 2
if ( <Expresión ) <sentencia>
Booleana>
else <sentencia>
FIGURA 025 | Podemos notar que else if es una construcción que se utiliza para realizar múltiples evaluaciones.
68
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 69
{ break;
} // código si a == 2
} break;
else if (a == b) }
69
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 70
1. EL LENGUAJE .NET
hasta que ocurra una condición determinada. condición del texto que hayamos ingresado dé
C# cuenta con varias sentencias para que esto como resultado Falso, el sistema finalizará.
se cumpla.
La sentencia do
La sentencia while Con la sentencia while vimos que el bloque
Esta sentencia, que significa mientras, indi- de código que se debe repetir no será ejecu-
ca que una sentencia o grupo de sentencias tado nunca si la expresión es falsa la primera
se repetirá en tanto una condición asociada vez. En algunas ocasiones, seguramente ne-
a ella sea verdadera. cesitaremos que se ejecute ese código al me-
A continuación, veamos un ejemplo de códi- nos una vez, para luego hacer una evalua-
go en el cual, mientras no se ingrese un texto ción de la expresión.
determinado, el programa no terminará: Para estos casos existe la sentencia do.
70
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 71
{
for (int i = 0; i < 5; i++)
Console.WriteLine(i);
Console.ReadKey();
}
FIGURA 026 | El resultado de la sentencia for.
“Marcelo”, “Pablo” };
La expresión booleana del bucle “mientras”
(while) debería ser verdadera en ciertas foreach (string s in nombres) {
circunstancias y luego, en algún momento, Console.WriteLine ( “{0}”, s );
tornarse falsa. Si la expresión NUNCA fuese }
verdadera, jamás se ingresaría en el cuerpo del
bucle. Si la expresión SIEMPRE fuese verdadera,
Es posible construir colecciones que puedan
nuestro programa jamás se terminaría, ya que
ser recorridas con la sentencia foreach. És-
nunca saldríamos del bucle.
tas podrían entregar la lista ordenada alfabé-
ticamente, por ejemplo.
71
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 72
1. EL LENGUAJE .NET
Funciones
Hasta el momento, estuvimos viendo los opera- Las funciones son porciones
dores, las variables y las sentencias más impor-
tantes que tiene el lenguaje C#. A continua-
de código que realizan acciones.
ción, abordaremos las funciones, más conoci- Toman ciertos argumentos
das como métodos, que nos permitirán estruc- y devuelven un valor.
turar mejor el código de las aplicaciones. De es-
ta manera, podremos programar de una forma
mucho más clara, evitando repetir código al in- Métodos estáticos
vocar esta función en el lugar de la aplicación Existen métodos estáticos que son conside-
donde la necesitemos, con lo cual optimizare- rados como métodos de clase. Éstos deben
mos su funcionamiento. tener un tipo de dato como prefijo de retor-
no, y llevar la palabra reservada Static. El
Uso de métodos o funciones en C# método estático se llama por medio de un
Los métodos o funciones son porciones de códi- identificador de la clase, en vez del identifi-
go que realizan determinadas acciones. Toman cador del objeto, como sucede con las varia-
ciertos argumentos y devuelven un valor. bles estáticas. Muchas clases de la librería
En C#, las funciones se deben declarar dentro de BCL definen métodos estáticos, como el
un objeto. Por lo general, llevan un nombre que que vinimos utilizando hasta ahora en los
las identifica para definir la tarea que cumplen. ejemplos de código, el método WriteLine,
Un ejemplo claro de función es WriteLine(), perteneciente a la clase Console.
perteneciente a la clase Console, que permite es-
cribir una línea con un valor, pregunta o resulta- Retorno de valores
do de operación, en la consola de aplicación. Como ya dijimos, los métodos pueden retor-
nar valores o no. Si no devuelven ninguno,
{ se especifica que el tipo de dato de retorno
Console.WriteLine(“Función que muestra este sea void.
texto en la consola:”);
} Uso de parámetros
En la Figura 013 vemos de qué forma se de-
Las funciones o métodos poseen un tipo de da- claran los parámetros en las funciones. Los
to, un identificador y parámetros: parámetros son, básicamente, declaraciones
• Tipo de dato: Es un valor que la función de variables, separadas por una coma (en caso
devuelve al terminar. de que tengamos que utilizar más de uno).
• Identificador: Es el nombre por el cual lla-
maremos a la función en nuestra aplicación.
Será utilizado para invocarla. Función Main
• Parámetros: Son las variables que recibirá el
método para realizar las operaciones necesa-
Cada programa en C# debe tener una función
rias para las cuales fue creado. El listado de
Main(), en donde escribiremos el código princi-
variables puede estar vacío o tener todos los
pal para que nuestro programa se inicie.
elementos que queramos o precisemos; esto
se entiende como opcional.
72
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 73
}
Parámetros de salida
Es probable que en el desarrollo de un siste-
{
ma, necesitemos que una función retorne
//Declaro las variables que recibirán los
más de un valor. En ese caso, podemos re-
valores de retorno de la función
currir a los parámetros de salida. Existe un
double A30, A60;
modificador llamado out, que nos permitirá
CalculoInteres(5500, out A30, out A60);
realizar esta operación dentro de la función.
Console.WriteLine(“$ 5500 a 30 días me dará: $
Veamos un ejemplo para comprenderlo un
“ A30);
poco mejor:
Console.WriteLine(“$ 5500 a 60 días me dará: $
“ A60);
{
}
public Static void CalculoInteres(double
}
deposito, out double 30dias, out double
60dias)
{ Y el resultado obtenido en la consola de la
//A 30 días 5% de interés aplicación será el siguiente:
30dias = (deposito * 1.05);
1 3
El tipo de dato que devolverá Los parámetros que acepta la
como resultado la función función, en este caso, son 2.
es Integer (Entero). Son del tipo Integer (Entero) y
están separados por una coma.
FIGURA 028 | Aquí podemos ver el código de un programa que contiene una función, y su composición.
73
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 74
1. EL LENGUAJE .NET
Clases en C#
A continuación, veremos lo que se conoce como la estructura
de datos más importante de este lenguaje: las clases.
Archivo nombredelaclase.CS
clase
clase <identificador>
{
// Cuerpo de la clase donde
identificador // definimos los miembros
// que la compondrán
tipo miembro1
tipo miembro2
tipo miembro3
declaración y
tipo miembro4
definición de los }
{ miembros que la }
componen
FIGURA 029 | Una misma clase, graficada según cómo sería su código.
74
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 75
Clases en C#
75
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 76
1. EL LENGUAJE .NET
Console.WriteLine(“Descripción de persona :
Console.Read();
de la misma manera que las
} variables convencionales en C#.
Para poder usar un tipo de dato referenciado, static void Main(string[] args)
debemos crearlo, mediante un proceso llama- {
do instanciación. Ésta invoca el método que Persona pers1 = new Persona();
tiene el mismo nombre que la clase, denomi- Persona pers2 = new Persona();
nado constructor de la clase.
Para definir una clase derivada de Persona, pers1.nombre = “Nicolás”;
utilizaremos el operador new. Luego, las va- pers2.nombre = “Julián”;
riables internas de la clase, llamadas Nombre,
Apellido, DNI y edad, son modificadas desde Console.WriteLine(“El valor de la variable
fuera de la clase. Esto es posible ya que todas nombre del objeto pers1 es:
ellas están definidas como públicas en la clase {0}”, pers1.nombre);
original Persona. Console.WriteLine(“El valor de la variable
Veamos la forma de hacerlo: nombre del objeto pers2 es:
{0}”, pers2.nombre);
p.nombre = “Julián”;
p.apellido = “Luna”; En el ejemplo anterior, hemos utilizado la clase
p.DNI = “46.850.185”; Persona, de la cual instanciamos las clases
p.edad = 2; pers1 y pers2. Ambos objetos son indepen-
dientes entre sí. A pers1 le asignamos el valor
Por último, las variables internas de la clase “Nicolás”, y a pers2, “Julián”.
son leídas y mostradas en la consola en dos
renglones diferentes: en el primero, el nom-
bre y el apellido; en el segundo, su documen-
to y edad actual:
Constantes de una clase
Cuando declaramos variables temporales del tipo
Console.WriteLine(“Descripción de persona :
constante, éstas tienen un valor asignado que no
{0},{1}”, p.nombre, p.apellido);
se puede modificar. Podemos declarar de la mis-
Console.WriteLine(“Otros datos : {0},{1}”,
ma forma una variable del tipo constante dentro
p.DNI, p.edad + “ años”);
del cuerpo de una clase, que actuará de la misma
Console.Read();
manera que si fuese una variable temporal.
76
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 77
Clases en C#
Las constantes declaradas dentro de clases pue- tanciarlas, de modo que no necesitaremos crear
den poseer los mismos modificadores de acceso un objeto de la clase Persona.
que las variables (public, private, protected, etc.).
static void Main(string[] args)
pers2.nombre = “ Julián”;
Asignación de valores
operador de selección
operador de asignación
fin de sentencia
77
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 78
1. EL LENGUAJE .NET
//… }
} }
class Program
{
Persona.anioActual = 2007;
pers1.nombre = “Nicolás”;
78