Está en la página 1de 68

013a024.qxp 09/07/2008 06:24 p.m.

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 Basic .Net


El lenguaje que le dio un gran salto a Microsoft en el mundo de
la programación, se ha renovado, adquiriendo el poder y fuerza
de .Net.

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

- Generar código nativo: La ejecución de - Windows Forms


los componentes se realiza con un com- - ASP.NET y Servicios Web XML
pilador Just In Time (JIT), que traduce los - ADO.NET
componentes al código nativo según la
CPU en que se encuentre, y los ejecuta • Lenguajes de programación y compila-
en su entorno. dores: Los lenguajes de programación per-
• Base Class Library (BCL) o biblioteca de miten el desarrollo de aplicaciones sobre la
clase base: Proporciona todos los compo- plataforma .NET. Hacen uso de las especi-
nentes y clases necesarios para el desarrollo ficaciones del CLR y de las BCL para el
de aplicaciones en la plataforma. Éstos in- desarrollo de las aplicaciones, y siguen un
cluyen la mayoría de las funcionalidades estándar denominado Common Language
que los programadores aplican de manera Specification (CLS), lo que hace que sean
cotidiana y, además, un conjunto de clases completamente compatibles entre sí.
específicas de acuerdo con la tecnología Existen muchos lenguajes para programar
que se va a utilizar en la creación de las en .NET, como Visual Basic .NET, C#
aplicaciones. Todos estos componentes es- (C-Sharp), NET.COBOL, y otros. Dado
tán divididos en tres grupos principales: que el CLS es una especificación abierta,
cualquier lenguaje que cumpla con ella pue-
de ser utilizado para desarrollar en .NET.
Sistemas operativos • Herramientas y documentación: .NET
proporciona un conjunto de utilitarios y
herramientas de desarrollo que simplifican el
El framework .Net puede instalarse en cualquier
proceso de creación de aplicaciones, así como
sistema operativo de la familia Windows superior a la
también, documentación y guías de arquitectu-
versión 98.Windows 2003 y 2008 Server, XP Service
ra, que describen las mejores prácticas de dise-
pack 2 y Windows Vista ya lo tienen instalado.
ño, prueba e instalación de aplicaciones .NET.

Tecnología .NET

• CLR (Common Language Runtime)


• BCL (Base Class Library)
• Lenguaje de programación
• Herramientas y documentación

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?

.NET Framework con textos solamente), el framework debe es-


El primer elemento que debemos conocer es tar instalado en la PC del cliente (usuario), y
el .NET Framework o “marco de trabajo”. en el servidor sólo si la aplicación será distri-
Como ya mencionamos, es el componente buida y tendrá parte de su funcionalidad cen-
fundamental de la plataforma Microsoft tralizada en una única computadora. En el ca-
.NET, y es necesario tanto para desarrollar so de las aplicaciones Web, el único requisito
aplicaciones como para ejecutarlas luego. del lado del cliente o usuario es tener un nave-
Tiene tres versiones, que pueden conseguirse gador (browser) y una conexión de red al ser-
en forma gratuita: vidor, que debe tener instalado el .NET Fra-
mework. Finalmente, para las aplicaciones mó-
.NET FRAMEWORK viles, que se ejecutan sobre Windows Mobile
REDISTRIBUTABLE PACKAGE en algún dispositivo tipo Pocket PC o Smart
Es el componente de la plataforma .NET nece- Phone, es preciso tener instalado el .NET
sario para ejecutar aplicaciones. Este elemento Compact Framework en el dispositivo.
se instala en los entornos de producción o esta-
ciones de trabajo de los clientes y en las compu-
tadoras de los usuarios que vayan a utilizar apli-
Versiones
caciones .NET. Tiene dos elementos: el entorno
Existen varias versiones de los frameworks
de ejecución de la plataforma .NET (CLR, más
mencionados:
adelante lo veremos en detalle) y las bibliotecas
de funcionalidad reutilizable (BCL).
• Versión 1.0: Liberada a principios del año 2002, uti-
lizada en la primer version de Visual Studio .Net,
.NET FRAMEWORK SDK
incluia soporte para para los nuevos lenguajes
Esta versión contiene herramientas de desarro-
VB.Net y C# .Net.
llo de línea de comandos (compiladores, depura-
• Versión 1.1: Liberada en 2003, incluía el compact
dores, etc.), documentación de referencia, ejem-
framework, framework 1.1 y soporte para el len-
plos y manuales para programadores.
guaje J# .Net.
En general, se instala en los entornos de de-
• Versión 2.0: Liberada a fines del año 2005, fue el
sarrollo de aplicaciones, por lo que resulta más
primer gran cambio en la plataforma, y resultó una
útil para programadores que para usuarios. Para
“Evolución” en lugar de una revolución. Un gran
instalar la versión SDK (Software Development Kit)
salto en lo que respecta a la productividad.
es necesario instalar previamente el Redistributable
• Versión 3.0: Liberada en noviembre de 2006, combi-
Package (mencionado con anterioridad).
na las caracteristicas de la versión 2.0 con las nuevas
tecnologías como Windows Presentation Founda-
.NET COMPACT FRAMEWORK
tion,Windows Communication Foundation,Win-
Se trata de una versión reducida del .NET
dows Workflow Foundation y Windows CardSpace.
Framework Redistributable, especialmente
• Versión 3.5: Liberada en noviembre de 2007, inclu-
pensada para instalar en dispositivos móviles,
ye nuevas caracteristicas de las versiones 2.0 y 3.0
como Pocket PCs y Smart Phones.
incorporadas en forma incremental más el service
En este caso, cuando se trata de las aplicacio-
pack 1 correspondientes a los respectivos frame-
nes de escritorio (WinForms o de Formula-
works.
rios) y las de consola (aplicaciones cuya inter-
faz de usuario es una consola de comandos

15
013a024.qxp 09/07/2008 06:24 p.m. PÆgina 16

1. EL LENGUAJE .NET

Entorno de ejecución pecificación de lenguaje común), que define y


estandariza un conjunto de las características
El CLR o Common Language Runtime es el en- soportadas por el CLR que son necesarias en la
torno que administra la ejecución de código y mayoría de las aplicaciones. Todos los compo-
proporciona los servicios para el desarrollo de nentes desarrollados y compilados de acuerdo
las aplicaciones, así como también todos los con esta especificación pueden interactuar en-
elementos requeridos por los lenguajes, Visual tre sí, independientemente del lenguaje en el
Basic .NET, C# y otros de .NET. que fueron escritos.
Los tipos de datos son comunes a todos los Microsoft proporciona, junto con el .NET Fra-
lenguajes y son provistos por el Common Type mework, las implementaciones de cuatro lengua-
System (CTS o sistema de tipos comunes) del jes compatibles con CLS, y sus compiladores:
CLR. Cada tipo de dato tiene su propia sintaxis
en su lenguaje de programación, pero, al ser to- • Microsoft Visual Basic .NET
mados por el CLR, esos tipos son iguales. • Microsoft Visual C# .NET
Esto se debe a que uno de los principales ob- • Microsoft Visual J# .NET
jetivos de la plataforma .NET fue ser indepen- • Microsoft Visual C++ .NET
diente del lenguaje de programación elegido
para el desarrollo de aplicaciones. Por eso se Esto significa que una aplicación escrita en Vi-
creó la Common Language Specification (CLS o es- sual Basic .NET, por ejemplo, puede incorporar

Tabla 1 | Principales servicios proporcionados por el CLR


SERVICIOS DESCRIPCIÓN
Compilación Just In Time El CLR se encarga de compilar las aplicaciones .NET a código de máquina nativo para el
(o “justo a tiempo”) sistema operativo y la plataforma de hardware en la que se está ejecutando.
Gestión automática de El CLR abstrae a los desarrolladores de tener que pedir y liberar memoria explícitamente.
memoria Para hacerlo, uno de sus componentes, llamado garbage collector (recolector de basura),
se ocupa de liberar periódicamente la memoria que ya no está siendo usada por ninguna
aplicación. Además, el CLR también abstrae a los desarrolladores del uso de punteros y
del acceso a memoria de bajo nivel. Si bien estas características pueden ser consideradas
poderosas, suelen hacer que el desarrollo y el mantenimiento de aplicaciones resulten
más propensos a errores y menos productivos.
Gestión de errores Como las aplicaciones .NET no se ejecutan directamente contra el sistema operativo,
consistente cualquier error no manejado que ocurra en tiempo de ejecución será atrapado por el
CLR en última instancia, sin afectar a ninguna otra aplicación que se esté ejecutando ni te-
ner efecto alguno sobre su estabilidad.
Ejecución basada en Todas las aplicaciones .NET son empaquetadas en componentes reutilizables denominados,
componentes genéricamente, assemblies, que el CLR se ocupa de cargar en memoria y ejecutar.
Gestión de seguridad El CLR proporciona una barrera más de contención a la hora de ejecutar aplicaciones ma-
nejadas, ya que permite establecer políticas de seguridad muy detalladas, que deberán ser
cumplidas por las aplicaciones .NET que se ejecuten en una determinada computadora.
Multithreading El CLR brinda un entorno de ejecución multi-hilos por sobre las capacidades del sistema
operativo, así como también, mecanismos para asegurar su sincronización y acceso con-
currente a recursos compartidos.

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

Esquema de ejecución del CLR


Lenguajes de
programación VB.NET C// J// C++.NET

Compiladores
Compilador Compilador Compilador Compilador
VB.NET C// J// C++.NET

Managed Code Assembly Assembly Assembly Assembly Unmanaged


(MSIL) (MSIL) (MSIL) (MSIL) code

CLR (Common Language Runtime)

JIT (Just In Time Compiler)

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

La inclusión de esta metadata en el compo-


nente compilado hace que éste se autodescri-
El CLR administra la ejecución ba. Esto le indica al CLR todo lo necesario
de código y permite el para preparar y ejecutar una aplicación .NET
correctamente y permitir que pueda interac-
desarrollo de las aplicaciones.
tuar con otros componentes.

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.

Namespaces de la librería de clases base


System.Web System.Windows.Forms
Services UI Design ComponentModel
Description HtmlControls
Discovery WebControls
Protocols System.Drawing
Caching Security Drawing2D Printing
Configuration SessionState Imaging Text

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

FIGURA 003 | Principales namespaces de la Base Class Library.


Conocerlos nos permitirá aprovechar todo el potencial de .NET.

19
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 20

1. EL LENGUAJE .NET

Lenguajes de programación Microsoft. Todos utilizan el mismo runtime,


todos emplean el mismo conjunto de biblio-
Los lenguajes de programación de .NET es- tecas de la misma manera, no existen dife-
tán basados en la Common Language Specifica- rencias de performance, todos tienen la mis-
tion (CLS), por lo cual, ahora, la elección del ma potencia, y la misma capacidad de acceso
lenguaje en el que debe escribirse una aplica- a los recursos y servicios que expone el
ción .NET prácticamente fue reducida a una .NET Framework. De hecho, al cargar y eje-
cuestión de gustos personales y comodidad cutar un assembly, el CLR no sabe en qué
con la sintaxis. No hay motivos tecnológicos lenguaje de programación de alto nivel fue
que nos lleven a elegir un lenguaje en parti- escrito éste, ya que lo que recibe finalmente
cular, al menos, entre los ofrecidos por es código MSIL.

Tabla 2 | Principales namespaces y su funcionalidad


NAMESPACES FUNCIONALIDAD
System Es el principal namespace y forma la raíz de todos los otros dentro del BCL. Entre los
principales elementos que encontramos en él están:
- Definición de todos los tipos de datos establecidos por el Common Type System del CLR.
- Acceso a funciones matemáticas bajo el namespace MATH.
- Clases dedicadas al acceso al entorno de ejecución de la aplicación a través del
namespace Environment.
- Acceso directo al Garbage Collector a través del namespace GC.
System.Collections Contiene una serie de clases que permiten administrar un conjunto de objetos de manera
ordenada. La principal es Collection, pero existen otras, como SortedList, ArrayList,
Queue, Stack, etc.
System.Data Contiene todas las clases necesarias para el procesamiento de datos desde bases de datos
(ADO.NET). Entre los principales namespaces, podemos encontrar System.Data.SqlClient
(exclusivo para bases de datos SQLServer), System.Data.OleDb (orígenes de datos
OLEDB) y System.Data.Odbc (para otros tipos de bases de datos), entre otros.
System.Drawing Contiene las clases para proporcionar toda la funcionalidad gráfica en el framework.
System.IO Contiene las clases y los métodos necesarios para leer y escribir todo tipo de archivos,
tanto en texto plano como a nivel de bytes.
System.Security Proporciona toda la funcionalidad para realizar los procesos de autenticación y autoriza-
ción, manejo de credenciales y criptografía, entre otras tareas.
System.Text Contiene las clases para codificar y decodificar texto de diferentes formatos.También in-
cluye las clases necesarias para la búsqueda y el manejo de texto a través de expresiones
regulares.
System.Windows.Form Es el namespace base para la creación de aplicaciones Windows con formularios. En él es-
tán definidas todas las funcionalidades y los controles necesarios para la creación de inter-
faces de usuario en este tipo de aplicaciones: cajas de texto, botones, etiquetas, diálogos, y
mucho más.
System.Web Es el namespace base para la creación de aplicaciones Web (ASP.NET). En él están defini-
das todas las funcionalidades y los controles necesarios para la creación de interfaces de
usuario en este tipo de aplicaciones.También incluye las definiciones para el tratamiento
de servicios web y muchos aspectos más de este entorno.
System.Xml Encapsula todas las clases necesarias para el procesamiento de documentos XML.

20
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 21

¿Qué es .NET?

Principales lenguajes datos, y muchas opciones más, con cualquier


de la plataforma lenguaje de la plataforma provisto por Micro-
Existe una gran variedad de lenguajes de pro- soft (VB.NET, C#, C++, etc.). La idea de es-
gramación en la plataforma .NET, aunque se te IDE es que el programador no tenga que
destacan, principalmente, dos: VB.NET y C# cambiar de aplicación para realizar todas las
(C Sharp). tareas involucradas en el desarrollo de un sis-
tema. La familia de Visual Studio 2005 tiene
• VB.NET es Visual Basic .NET y es la evolu- un producto a la medida de las necesidades y
ción de Visual Basic 6.0. Fue rescrito por posibilidades de cada tipo de desarrollador:
completo para la plataforma a fin de hacerlo parte desde una línea gratuita de versiones de-
totalmente orientado a objetos, y puede hacer nominadas Express, hasta llegar a una suite
uso de todos los elementos del framework, completa de productos destinada a grandes
como cualquier otro lenguaje. Para quienes equipos de desarrollo: Visual Studio Team
hayan programado en Visual Basic 6.0, éste es System. A continuación, una breve descrip-
el lenguaje natural para utilizar en .NET, ya ción de las diferentes “familias” de productos:
que presenta la misma sintaxis que su prede-
cesor, aunque con algunos cambios que per- VISUAL STUDIO 2005
miten adaptarse a la plataforma. EXPRESS EDITION
• C# (pronunciado C Sharp) es un nuevo len- Incluye herramientas livianas, fáciles de usar y
guaje que fue diseñado, específicamente, para de aprender, destinadas a novatos, estudiantes
la plataforma .NET. Tiene una sintaxis similar y quienes programan como hobby. Son las
a las de C y Java, por lo que resulta la elección versiones ideales para los que recién se ini-
natural para quienes hayan trabajado con ellos. cian en .NET. Son gratuitas y hay una herra-
mienta por cada lenguaje.
Ambos lenguajes son de primer nivel en la Para desarrollar aplicaciones Windows, exis-
plataforma y no presentan diferencias de ren- ten las siguientes alternativas:
dimiento en ella.
• Visual Basic 2005 Express Edition
• Visual C# 2005 Express Edition
• Visual J# 2005 Express Edition
Herramientas de desarrollo • Visual C++ 2005 Express Edition
• SQL Server 2005 Express Edition
Para que la creación de aplicaciones en .NET
• Visual Web Developer 2005 Express
sea lo más productiva posible, Microsoft ofre-
ce su propio entorno de desarrollo: Visual
Studio. Se trata de un IDE (entorno integrado
de desarrollo) preparado para aprovechar to- ¿Qué es un IDE?
das la características del framework .NET y
Un IDE (Integrated Development Environment o
darle al programador un entorno único desde
entorno integrado de desarrollo) es un espacio de
donde realizar todas sus tareas. Dentro de
trabajo que proporciona un conjunto de menús,
Visual Studio, podemos realizar aplicaciones
toolbars y ventanas para realizar las diferentes
Windows y Web, servicios Web y bibliotecas
tareas de programación.
de componentes, además de acceder a bases de

21
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 22

1. EL LENGUAJE .NET

VISUAL STUDIO 2005 VISUAL STUDIO 2005 TEAM SYSTEM


STANDARD EDITION Se compone de herramientas para administrar
Es un entorno de desarrollo unificado, pensa- todo el ciclo de vida del desarrollo de software,
do para desarrolladores que construyen aplica- de manera que sean productivas, integradas y
ciones cliente/servidor de Windows y sitios extensibles. Amplía la línea de productos de
Web. En esta edición, todo el IDE se encuen- Visual Studio para que los equipos de trabajo
tra mejorado e integrado, de modo que se pue- mejoren sus capacidades de comunicación y co-
den realizar, de manera conjunta, aplicaciones laboración. La familia Team System se divide en:
Windows, Web y para dispositivos móviles, en
diferentes lenguajes de programación y sin • Visual Studio Team Suite: Es la suite más
cambiar de entorno. completa, útil tanto para arquitectos como
para desarrolladores y testers.
VISUAL STUDIO 2005 • Visual Studio 2005 Team Suite Edición
PROFESSIONAL EDITION profesionales de bases de datos: Es una
Es un entorno de desarrollo pensado para edición especial que proporciona herra-
programadores individuales que construyen mientas para permitir el cambio de la admi-
aplicaciones de alto rendimiento. Es posible nistración, el testeo y la implementación pa-
aprovechar su entorno para construir una am- ra las bases de datos del servidor SQL.
plia gama de aplicaciones móviles, Web, • Visual Studio 2005 Team Suite Edición
Windows y basadas en Office. Presenta mejo- para arquitectos: Brinda herramientas para
ras en el IDE, además de que proporciona so- el diseño visual de servicios, soluciones orien-
porte de depuración remoto, posibilidad de tadas a servicios y validación con ambientes
generar aplicaciones de 64 bits, y acceso com- operacionales antes de su implementación.
pleto a los servicios del sistema y a las bases • Visual Studio 2005 Team Suite Edición
de datos. Incluye Crystal Reports para la gene- para testeadores de software: Introduce
ración de reportes y proyectos de instalación un conjunto de herramientas de testeo que
basados en Windows Installer. se encuentran integradas dentro del ambien-
te del Visual Studio y ayudan a construir
VISUAL STUDIO 2005 aplicaciones de alta calidad.
TOOLS FOR OFFICE • Visual Studio 2005 Team Foundation
Esta versión permite que profesionales IT, Server: Es un servidor integrado que com-
ISVs e Integradores de Sistemas construyan bina control de versiones, seguimiento de
soluciones Smart Client para Microsoft Office. ítem de trabajo y reportes.

Tabla 3 | Requisitos de las versiones


Versión de Visual Studio Procesador RAM Disco Rígido
Express Pentium III 600 MHz o similar 256 MB 700 MB
Standard Pentium III 600 MHz o similar 256 MB Entre 2 GB y 3,8 GB
Professional Pentium III 600 MHz o similar 256 MB Entre 2 GB y 3,8 GB
Team System Procesador de 2 GB o más 512 MB 8 GB

22
013a024.qxp 09/07/2008 06:25 p.m. PÆgina 23

¿Qué es .NET?

Guía Visual 001 | Secciones del entorno de desarrollo

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.

Guía Visual 002 | Los menús del entorno

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

Visual Studio Express

Visual Studio Express


Veamos y analicemos cuáles son las ventajas, requisitos y
posibilidades que nos brinda esta versión de Visual Studio.
Como mencionamos anteriormente, existen Cómo obtener las
diversas versiones de Visual Studio según la
necesidad de cada corporación o equipo de versiones Express
trabajo. El problema es que cada una es muy
costosa, y es difícil que dispongamos de al- Las versiones de los programas de visual studio con las
gunos miles de dólares para adquirir una y que trabajaremos a lo largo del libro, están disponibles en
comenzar a estudiar. Por eso, la empresa Mi- Internet, por lo cual si no disponen de banda ancha, es re-
crosoft puso a disposición una versión de su comendable descargarlas desde un cibercafé, o desde la ca-
entorno Visual Studio totalmente gratuita, sa de algun conocido que disponga de banda ancha. El
llamada Express. La pregunta es por qué contenido descargado conviene grabarlo en un CD-ROM
ofrece sin costo un entorno que cuesta miles para tenerlo disponible en el momento que lo necesite-
de dólares. La respuesta es sencilla: esta ver- mos. Recomendamos, también, una lectura exhaustiva del
sión Express no contiene todo el potencial sitio Web de Microsoft para conocer los respectivos servi-
de sus hermanas mayores, pero nos permite ce packs que han salido con posterioridad al lanzamiento
aprender usando sus mismas posibilidades. de cada una de estas herramientas, y descargarlos e insta-
Antes de continuar, es importante que co- larlos luego de tener el conjunto de aplicaciones instaladas.
nozcamos cuál es la diferencia que existe en- Esto nos permitirá trabajar con mayor seguridad en nues-
tre esta versión y la versión comercial. tros desarrollos sin preocuparnos por bugs o errores que
La versión Express está dividida por lengua- las herramientas contenían en sus primeras versiones.
jes, es decir que si queremos utilizar Visual Todas las versiones Express que utilizaremos tienen un
Basic .NET, deberemos instalar esa versión gran potencial, que nos permitirán efectuar desarrollos
de Visual Studio Express; en el caso de C#, de nivel profesional, y el día de mañana cuando estemos
deberemos hacer lo mismo, y así podremos delante de una versión profesional, veremos que su con-
completar todos los lenguajes disponibles. Y formacion es exactamente igual a la de las versiones
es acá donde tenemos la principal diferencia. express, por lo cual no perderemos tiempo en tener que
Las versiones superiores a las Express utili- aprender su manejo.
zan el mismo entorno para todos los lengua-
jes, y permiten instalar una sola vez el pro-
ducto, para disponer de todos ellos. Incluso, Requisitos mínimos
es posible realizar aplicaciones empleando
más de un lenguaje de programación al mis-
para las versiones Express
mo tiempo (siempre que hayamos instalado
Procesador: Pentium III, 600 MHz
antes todos los entornos). Como nosotros
RAM: 256 MB
estamos comenzando a programar y no va-
Disco duro: 700 MB aproximadamente para ca-
mos a realizar aplicaciones multilenguaje,
da lenguaje
esta última característica realmente no nos
Sistema operativo:Windows XP, 2000 o superior
beneficia.

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.

Compilación estándar y .NET


10212111020210
int a - b + c; 01202011120110

Código fuente Compilador Código máquina


.entr ypoint
maxstack 8
int a - b + c; L_0000; idstr “Hola Mundo”
L_0005; net

Código fuente Compilador Código MSIL

FIGURA 004 | En los lenguajes tradicionales, el compilador toma el código


fuente y produce un archivo con código en lenguaje de máquina.

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

Versiones del framework


Para que el compilador funcione como corresponde,
necesitamos un framework.Veamos de qué se trata.
A continuación, dedicaremos algunas páginas a
comprender más en detalle el funcionamiento
del framework .NET, y así saber cuál es, Sin dudas, la principal novedad de
específicamente, la función que cumple. Visual Studio es utilizar el mismo
Primero, conozcamos un poco más acerca de IDE para todos los lenguajes.
su evolución en el tiempo.
La primera versión del framework .NET vio la
luz a principios del año 2002, junto con la nueva
funcionales. Además, incluyó un conjunto nu-
versión de Visual Studio, que en ese momento
meroso de controles y componentes para usar
se llamaba Visual Studio .NET. Como entorno
en aplicaciones tanto Web como Windows. El
de desarrollo, este Visual Studio fue el sucesor
framework .NET va por la versión 3.0, libera-
del popular Visual Studio 6, aunque con una
da en 2007. Es una extensión de la versión
novedad muy atractiva: era el mismo IDE para
todos los lenguajes del paquete, a diferencia de
su predecesor, que tenía un IDE distinto (muy
distinto) para cada uno. Esta primera versión ya
tenía implementados los lenguajes C# y Visual
Basic .NET, además de una versión para .NET
de C++ (conocida como Manager C++). Esta
primera versión ya contemplaba la creación de
aplicaciones de escritorio, aplicaciones Web y
servicios Web. Aproximadamente un año más
tarde, en 2003, se liberó la siguiente versión, la
1.1. Su novedad más interesante fue el Compact
Framework, una versión reducida para usar en
dispositivos móviles que tuvieran Windows CE
o Pocket PC. Con respecto a los lenguajes, se
incorporó uno nuevo llamado J#, un derivado
de Java para .NET. FIGURA 006 | El framework 3.0 se presenta como un conjunto de
“componentes agregados” sobre el framework 2.

El presente 2.0, que incluye cuatro nuevas tecnologías:


Windows Presentation Foundation (para la
A fines de 2005 apareció la versión 2.0 del interfaz de usuario), Windows Communication
framework .NET. Acompañando a varias no- Foundation (para la comunicación entre apli-
vedades en los lenguajes, llegó la versión 2005 caciones), Windows Workflow Foundation
de Visual Studio, que trajo muchos cambios, (para diseñar e implementar workflows) y
tanto en los aspectos estéticos como en los CardSpace (para identidades electrónicas).

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

Acceso a Datos } Capa de Acceso a Datos

FIGURA 007 | En este diagrama podemos ver los niveles


o etapas de una arquitectura Cliente-Servidor.

29
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 30

1. EL LENGUAJE .NET

Componentes del framework


El framework .NET está compuesto por un gran número de
elementos.Veremos cuáles son y qué función cumplen.
El framework .NET es una plataforma de
desarrollo y ejecución de aplicaciones, que
precisa apoyarse sobre un sistema operativo
Las últimas versiones de
que le dé el soporte necesario para llevar ade- Windows ya tienen el
lante las tareas propias, como el manejo de framework .NET preinstalado.
archivos y de dispositivos.
Concentrándonos en el framework propiamen-
te dicho, podemos hacer una primera separa- versiones del framework debían instalarse en
ción en dos grandes partes. Por un lado, tene- Windows para poder correr aplicaciones
mos la parte distribuible, es decir, el conjunto .NET, no obstante, desde Windows Server
de elementos que deben ser distribuidos junto 2003, los componentes necesarios ya vienen
con nuestra aplicación para que ésta pueda ser preinstalados junto con el sistema operativo, lo
ejecutada en cualquier equipo. Las primeras cual es una ayuda muy importante.

Componentes del framework .NET


VB C++ C# J# ...

Common Language Specification


Framework .NET SDK

ASP.NET Windows Forms


Framework .NET

ADO.NET y XML
Distribuible

Base Class Library

Common Language Runtime

Windows COM + Services

FIGURA 008 | El framework .NET está formado por varios componentes,


cada uno de los cuales es responsable de un conjunto bien definido de tareas.

30
026a037.qxp 06/07/2008 10:45 p.m. PÆgina 31

Componentes del framework

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

por incompatibilidad de tipos pueden detectarse ASSEMBLIES


durante la compilación, otros deben dejarse para Los assemblies o ensamblados son la unidad
el momento de la ejecución, proveyendo servi- básica de ejecución y despliegue en las aplica-
cios que hagan la conversión automática siempre ciones .NET. Se diferencian de otras unidades
que sea posible. El type checker es el componen- de código (como los archivos dll ActiveX) en
te del CLR que se asegura de que cada conver- que son autodescriptivos; esto es que tienen
sión automática que deba realizarse durante la en sí mismos toda la información que el CLR
ejecución sea válida y esté permitida. necesita para ejecutar su código.
El ensamblado se almacena en un archivo
EXCEPTION MANAGER con extensión exe o dll, eso depende del tipo.
Una excepción es una situación anormal que En su interior, un ensamblado contiene códi-
ocurre durante la ejecución de una aplicación. go MSIL junto con una sección denominada
Por ejemplo, si queremos escribir un archivo en manifiesto. Éste puede verse como un enca-
disco pero éste se encuentra lleno, obtendremos bezado que incluye información sobre el en-
una excepción. El exception manager (o admi- samblado, además de recursos adicionales al
nistrador de excepciones) es el encargado de ges- código (como mensajes de error o imágenes).
tionar y provocar las excepciones. Al momento La información referida al ensamblado se lla-
de provocar una excepción, este componente re- ma metadata (o metadatos) y, como dijimos,
colecta bastante información del contexto de la es utilizada por el CLR para dar soporte a los
excepción (como el nombre de la máquina o la servicios en tiempo de ejecución. Entre la in-
pila de ejecución) para facilitar su manejo o, in- formación que contiene la metadata, pode-
cluso, la depuración de la aplicación. mos mencionar la versión del assembly, el
idioma por defecto, información de firma di-
THREAD SUPPORT gital para proteger la identidad del código
En .NET, es relativamente sencillo ejecutar códi- (para asegurar que no fue modificado por al-
go en hilos independientes; es decir, que se eje- guien no autorizado), los ensamblados que
cutan al mismo tiempo entre ellos y al mismo necesita para funcionar, etc.
tiempo que la aplicación principal. Este compo- En este punto, debemos tener en cuenta que
nente del CLR provee los servicios necesarios es muy importante la información de la ver-
para iniciar los hilos independientes, como así sión, ya que en una misma computadora po-
también para coordinarlos, detenerlos, etc. demos tener más de una versión de un en-
samblado, y el CLR es capaz de utilizar la que
COM MARSHALER sea apropiada para cada aplicación que lo ne-
Brinda soporte para interactuar con componen- cesite. Una característica muy interesante de
tes COM (Component Object Model). Con él, es po- los ensamblados es que no requieren ser regis-
sible intercambiar datos y comunicarse con apli- trados en ningún lugar para estar disponibles,
caciones que tengan soporte para COM.

SOPORTE PARA LAS LIBRERÍAS Es importante tener en cuenta


DE CLASES BASE que los espacios de nombres
Este componente permite integrar la aplicación
con cualquier otra que soporte la librería de cla-
son una división lógica, no física.
ses base (BCL, del inglés Base Class Library).

32
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 33

Componentes del framework

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.

Assemblies públicos Common Language


y privados Specification
Una aplicación .NET depende de varios
Una de las premisas de diseño de .NET fue ser
ensamblados. Para encontrar aquellos que son
independiente del lenguaje utilizado para de-
necesarios, el CLR busca en la carpeta donde está
sarrollar, y el hecho de que, desde un lenguaje, se
el assembly principal y, si no lo encuentra, lo busca
pueda acceder fácilmente a librerías y clases es-
en un repositorio global denominado Global
critas en otros. Para eso se creó la especifica-
Assembly Cache (GAC), que es una especie de
ción de lenguaje común, o CLS por sus siglas
directorio de ensamblados compartidos. Un
en inglés (Common Language Specification). La CLS
ensamblado que se encuentra en la GAC puede
define ciertas características que debe tener un
ser utilizado por más de una aplicación, sin
lenguaje para ser compatible con el CLR. Si bien
necesidad de copiarlo a su carpeta. Los assemblies
Microsoft provee algunos lenguajes para .NET,
que están en la GAC se denominan assemblies
la CLS hace posible que otras compañías creen
públicos, en tanto que los que están en la misma
nuevos lenguajes que permitan escribir aplicacio-
carpeta se llaman privados.
nes que corran sobre el framework .NET.

33
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 34

1. EL LENGUAJE .NET

Funcionamiento del CLR


En esta etapa veremos cómo .NET realiza la conversión del código
fuente a un lenguaje intermedio para que funcione en el sistema.
Como vimos antes, las aplicaciones .NET superconjunto del CLI, ya que está implemen-
son compiladas a un lenguaje intermedio, con tado de manera de cumplir con todas las espe-
el objetivo de independizarlas de la plataforma cificaciones del estándar.
final donde serán ejecutadas. Esto se denomina
CLI (Common Language Infrastructure, o infraes-
tructura de lenguaje común). No debemos con-
El modelo de ejecución
fundir el CLI con el CLR: el CLI es una espe- El modelo de desarrollo y ejecución de .NET es
cificación, no una implementación; y el de los denominados “en dos etapas” o de “com-
CLR, si bien cumple con esta especificación, pilación diferida”. El desarrollo comienza con la
tiene aspectos que van más allá de ella. Hay escritura del código fuente de la aplicación en al-
que tener presente que el CLI es independiente guno de los lenguajes con soporte para el frame-
de .NET; es una especificación que puede usar- work .NET. Una vez escrito el código fuente, de-
se para desarrollar otras plataformas y tecnolo- be ser compilado utilizando el compilador apro-
gías. El .NET de Microsoft, de hecho, es un piado para el lenguaje en cuestión.

Especificaciones y librerías en .NET


.NET Framework

Common Language Infrastructure

Lenguajes de Alto Nivel WPF, WF, WCF

Common Language Specification WinForms

Common Type System ASP.NET

Base Class Library ADO.NET

Common Language Runtime Herramientas de Depuración

FIGURA 010 | Microsoft .NET es un superconjunto del CLI que implementa


las especificaciones del estándar, y agrega un conjunto de librerías y herramientas muy útiles.

34
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 35

Funcionamiento del CLR

El resultado de la compilación es uno o más en-


samblados, de los cuales uno debe tener exten-
Características del CLI sión “exe” (a menos que sea una aplicación Web)
Hubo muchas premisas que se tuvieron en y será el punto de entrada para la ejecución de la
cuenta a la hora de crear la especificación de aplicación. Como ya hemos explicado, cada
CLI. Según ésta, la arquitectura de CLI, entre assembly contiene código intermedio (MSIL)
otras cosas, debe tener las siguientes además de los recursos y metadatos. Al mo-
características: mento de ejecutar la aplicación, el sistema ope-
• Permitir la escritura de componentes rativo detecta que se trata de un ensamblado
reutilizables e interoperables independientes .NET y deriva la ejecución al CLR. Entonces,
de la plataforma y del lenguaje de éste toma el código MSIL y lo traduce a código
programación utilizado. nativo de la máquina para poder ejecutarlo, ya
• Para facilitar la operación entre lenguajes, se que las computadoras actuales no son capaces
debe proveer un sistema de tipos único y de reconocer instrucciones MSIL.
completo, común a todos ellos. La compilación a código máquina no se efectúa
• Cada unidad de código o componente debe completa al momento de ejecutar, sino que se
ser totalmente autodescriptiva, para facilitar realiza a medida que se la necesita. Si una por-
su independencia y su portabilidad. ción de código nunca se ejecuta, nunca será
• Proveer un entorno de ejecución que compilada a código nativo. Para lograr la com-
permita supervisar el código para controlar pilación por demanda, el CLR lee cada clase y,
y hacer cumplir políticas de seguridad. antes de comenzar la ejecución, agrega porcio-
• Diseñar toda la infraestructura basándose nes de código a cada método, de manera tal
en metadatos, de manera tal que toda la que cuando un método sea ejecutado, se pueda
arquitectura pueda acomodarse fácilmente a hacer la invocación al compilador JIT (Just In
los cambios e incorporaciones y, así, se Time). Éste traduce las instrucciones del méto-
facilite la extensibilidad del modelo. do a código nativo, y reemplaza el código que
• Realizar tareas de bajo nivel, como carga agregó el CLR por la dirección en memoria del
de tipos en memoria o compilación a código nativo que acaba de generar. De este
código nativo sólo cuando sea necesario modo, en las subsecuentes llamadas al método,
(Just In Time). se ejecutará directamente código nativo, y el
• Proveer un conjunto de funcionalidades JIT no intervendrá.
comunes que los programadores puedan El modelo de ejecución de .NET prevé contro-
utilizar para desarrollar las aplicaciones. Para les de seguridad del código ejecutado, para evi-
estar acorde con el CLI, estas tar código malintencionado. Para lograrlo, antes
funcionalidades deben estar construidas de de ordenar la compilación a código nativo, el
tal manera que su uso no deje una CLR analiza la metadata del assembly y le apli-
aplicación atada a una determinada ca las políticas de seguridad que fueron confi-
plataforma (por ejemplo, .NET brinda guradas en la computadora. Si el assembly viola
métodos para conocer el carácter de fin de alguna de ellas (por ejemplo, está firmado por
línea o el carácter usado para separar una empresa en la que no se confía), se aborta
directorios en el disco, que varían según el la ejecución de la aplicación.
sistema operativo). Además de los controles antes de la compila-
ción a código nativo, el CLR verifica el código

35
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 36

1. EL LENGUAJE .NET

también durante la ejecución e interviene en


distintos aspectos, entre los que podemos
mencionar:
Hay recursos que el CLR
no administra porque son
• Administración automática del sistema operativo.
de memoria
Durante la ejecución, el CLR administra cada
pedido de espacio de memoria y se encarga de
liberar la memoria que ya no se está utilizando. • Manejo y coordinación de hilos
Ciertas aplicaciones necesitan hacer procesa-
• Verificación de tipos de datos mientos en segundo plano para poder conti-
Si bien gran parte de la consistencia de tipos nuar atendiendo al usuario o a otros siste-
de datos puede realizarse durante la compila- mas de manera eficiente. El CLR proporcio-
ción, hay características de .NET que hacen na mecanismos para facilitar la ejecución en
necesario relegar otras verificaciones. Cada vez hilos independientes, y se encarga tanto de la
que se hace una conversión de tipos en tiem- coordinación entre ellos como de la finaliza-
po de ejecución, el CLR controla si es válida. ción y del control de cada hilo en particular.

Generación de código MSIL


C# VB.NET J#

Compilador Compilador Compilador

Common Language Infrastructure

MSIL

MSIL

Código de Máquina

FIGURA 011 | En .NET, las aplicaciones se compilan a un lenguaje intermedio


para, luego, compilarlas al código nativo de la plataforma donde se ejecutan.

36
026a037.qxp 06/07/2008 10:46 p.m. PÆgina 37

Funcionamiento del CLR

Application domains Por un lado, al estar aisladas, si una aplicación


falla, no afecta a las demás. Por el otro, una
Tanto los sistemas operativos como los entor- aplicación puede ser detenida sin necesidad de
nos de ejecución suelen proveer algún mecanis- frenar todo el proceso y las demás aplicaciones.
mo para el aislamiento de las aplicaciones, ne-
cesario para asegurar que el código que corre
en una aplicación no afecte al de otras. Los
El Common Type System
application domains, o fronteras de aplicación, El sistema de tipos común (CTS) define todos
brindan una unidad de procesamiento segura los tipos básicos del framework .NET. Su obje-
que el CLR puede usar para generar aislamien- tivo es especificar las reglas que rigen a cada ti-
to entre aplicaciones. po de datos en cualquier aplicación .NET.
Los application domains son creados por un Si bien cada lenguaje puede tener su propia sin-
proceso denominado CLR Host, que se ejecuta taxis para definir los tipos de datos, el código
antes que el CLR y cuya función es cargar el MSIL resultante debe cumplir las reglas del
CLR en un proceso del sistema operativo, crear CTS. Esto es fundamental para permitir la in-
los application domains necesarios dentro de teroperabilidad de lenguajes exigida por la CLI.
ese proceso y ejecutar las aplicaciones dentro El CTS define dos grandes familias de tipos de
de los application domains. Esta forma de tra- datos: los tipos por valor y los tipos por refe-
bajo permite ejecutar varios application rencia. Los tipos por valor heredan de un tipo
domains en un mismo proceso, pero con el ni- básico llamado ValueType y conforman los lla-
vel de aislamiento que existe entre procesos se- mados tipos básicos o tipos primitivos. Las va-
parados, sin incurrir en el costo que significa riables definidas con tipos por valor se almace-
cambiar la ejecución de uno a otro o de hacer nan directamente en la pila y, por lo tanto, son
llamadas entre ellos. Además, la capacidad de liberadas cuando se cierra el bloque de código
correr varias aplicaciones dentro de un mismo que las definió. Por otro lado, los tipos por re-
proceso incrementa considerablemente la esca- ferencia heredan de una clase base llamada
labilidad en los servidores.El aislamiento de Object y se almacenan en el heap. La memoria
aplicaciones provisto por los application ocupada por variables de tipos por referencia
domains tiene algunos beneficios interesantes. es liberada por el garbage collector.

Interpretación del CTS


C# int Compilador
C#
MSIL System.Int32

VB.NET Integer Compilador


VB.NET
FIGURA 012 | Cada lenguaje le da distintos nombres a cada tipo de dato, pero al momento
de compilar, se traducen en los mismos tipos de datos, según lo especifica el CTS.

37
038a047.qxp 06/07/2008 10:52 p.m. PÆgina 38

1. EL LENGUAJE .NET

Librerías de clases base


Como vimos anteriormente, el framework .NET brinda un
conjunto de clases que podemos utilizar.Veamos cuáles son.
Las clases están ordenadas de manera jerárquica y contadores de rendimiento. Este espacio de
en espacios de nombres o namespaces, para que nombres también provee clases que permiten
estén mejor organizadas y que resulte sencillo depurar la aplicación y realizar un seguimiento
encontrar la que se busca. A continuación, vere- de la ejecución del código. Por ejemplo, con
mos algunos de los namespaces más importan- clases de este namespace, podemos conocer la
tes, junto con una descripción de su contenido. carga de trabajo de la CPU, o agregar código
de depuración con las clases Debug y Trace.

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

Librerías de clases base

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

FIGURA 013 | En el sitio


de MSDN hay una
descripción detallada
de cada uno de los
espacios de nombres
del framework .NET.

39
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 40

1. EL LENGUAJE .NET

(ASCII, Unicode, UTF-7 y UTF-8). Provee


también clases para convertir bloques de De memoria
bytes en cadenas de texto, y viceversa.
Obviamente, no será necesario conocer cada una
System.Threading de estas librerías, sus características y funciones.
Este espacio de nombres contiene las clases Podemos tener este material como una guía de
necesarias para crear aplicaciones con soporte consulta permanente, hasta que nos vayamos fami-
multihilo, como así también para su manipula- liarizando con cada uno de los componentes.
ción y coordinación. Incluye también una clase
que permite ejecutar código en intervalos de
tiempo determinados (la clase Timer). época de Visual Basic 6. Las clases de
ADO.NET brindan todo lo necesario para ac-
System.Runtime. ceder a datos desde las aplicaciones .NET. El
InteropServices modelo de acceso a datos de ADO.NET per-
Proporciona clases para desarrollar aplicaciones mite manipular datos independientemente de la
que interactúen con componentes COM y có- fuente original y de manera desconectada. Esto
digo no administrado. significa que podemos trabajar con los datos
sin necesidad de estar conectados a la base de
System.Runtime.Remoting datos, lo cual es muy útil en ambientes distri-
Contiene clases e interfaces que permiten la buidos y desconectados (como el caso de servi-
construcción de aplicaciones distribuidas. Con cios Web). Además, ADO.NET fue diseñado
ellas se pueden crear objetos que se comuni- de manera tal de independizar las formas de
quen con otros objetos que no están en el mis- acceso del tipo de fuente de datos. Por ejem-
mo application domain; incluso, que no estén plo, una vez que aprendemos a trabajar con
en la misma computadora. ADO.NET contra un SQL Server, podremos
empezar otra base de datos, como Oracle, sin
System.Runtime.Serialization ningún problema. Cada conjunto de clases para
Contiene clases para serializar y deserializar obje- acceder a un motor de base de datos en parti-
tos. La serialización es el proceso mediante el cular se denomina proveedor, y por eso se dice
cual un objeto o un conjunto de objetos relacio- que ADO.NET es un modelo de acceso a da-
nados se convierten en una secuencia lineal de tos basado en proveedores. El espacio de nom-
bytes para su almacenamiento o transmisión a bres System.Data conforma la raíz de todos los
otra ubicación. Por su parte, la deserialización espacios de nombres de las clases de
implica recoger la información almacenada y vol- ADO.NET. Veamos qué contiene cada uno:
ver a crear objetos a partir de ella. La serializa-
ción es muy utilizada en ambientes distribuidos, System.Data
ya que para transmitir un objeto hacia otro En este espacio de nombres se encuentran las
application domain, es necesario serializarlo. clases fundamentales de la arquitectura
ADO.NET. Sin duda, la clase más importante es
DataSet, que puede contener información de di-
ADO.NET ferentes orígenes, mediante una colección de ob-
ADO.NET es la evolución de la tecnología jetos DataTable. Cada DataTable contiene datos
ADO (ActiveX Data Objects), tan popular en la de un único origen, y está formado por una

40
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 41

Librerías de clases base

colección de objetos DataColumn y una colec- System.Data.OracleClient


ción de objetos Constrain (UniqueConstrain y Contiene las clases que implementan el provee-
ForeignKeyConstrain), que permiten definir un dor de acceso a datos de ADO.NET para tra-
esquema en memoria tal como si fuera una base bajar con bases de datos Oracle. Así como el
de datos. El DataSet también puede tener una proveedor para SQL Server implementa un
colección de objetos DataRelation para crear re- SqlDataAdapter, éste implementa el Oracle-
laciones entre columnas de distintas tablas. Adapter, también lo hereda de DataAdapter.

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

Modelo de acceso a datos ADO.NET


1. La aplicación se conecta a la
1 base y pide un conjunto de
Aplicación datos.
2. La base de datos devuelve
Sin conexión 2 los datos y la aplicación se
desconecta.
Datos
3. Después de manipular los
Aplicación datos, la aplicación se vuelve
3 a conectar a la base para vol-
car las actualizaciones.

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

Librerías de clases base

te utilizar controles de usuario que, en cierta me-


Los servicios Web no son una dida, abstraen al programador del código
HTML, que se genera automáticamente cuando
tecnología propietaria de la página se ejecuta en el servidor.
Microsoft, sino un estándar
aprobado internacionalmente. System.Web.UI
Este espacio de nombres proporciona clases e
interfaces que permiten crear los controles y las
System.Drawing páginas que aparecerán en las aplicaciones Web
Este namespace contiene clases que permiten como elementos de interfaz de usuario. Incluye
acceder desde código manejado a las APIs del la clase Control, que proporciona todos los
sistema gráfico de Windows (GDI+). Mediante controles de servidor –ya sean de servidor
las clases de System.Drawing podemos dibujar HTML, de servidor Web y de usuario–, con un
figuras y textos sobre las ventanas, pintar con conjunto común de funciones. Además, se uti-
distintas tramas y colores degradados, como así liza como clase base para la creación de nuevos
también manipular imágenes. controles de ASP.NET. Incluye también la cla-
se Page, que representa la unidad básica de
construcción de páginas Web dinámicas.
ASP.NET System.Web.Services
Además de las aplicaciones basadas en ventanas, ASP.NET no sólo permite crear aplicaciones
.NET permite construir otras basadas en explo- interactivas basadas en un navegador, sino que
radores de Internet, denominadas aplicaciones también da la posibilidad de crear servicios
Web. El subconjunto de componentes del frame- Web. Básicamente, un servicio Web es un con-
work destinado a hacerlo se denomina ASP.NET junto de funcionalidades (sin interfaz de usua-
y representa una evolución con respecto a su an- rio) a las que se puede acceder mediante los
tecesor ASP (Active Server Pages). Mediante protocolos normalmente utilizados para ingre-
ADO.NET, es posible crear aplicaciones y sitios sar en la Web (HTTP y XML). Los servicios
Web dinámicos (en el sentido de que el conteni- Web permiten conectar aplicaciones distribui-
do puede cambiar en respuesta a las necesidades das de manera segura y sencilla, ya que al usar
y acciones del usuario). protocolos estándar, pueden colocarse detrás
Un detalle interesante es que ASP.NET provee de un firewall que sólo permita acceso por el
un modelo de desarrollo similar al modelo de puerto 80 (el usado por los servidores Web).
creación de aplicaciones Windows, ya que brinda Los servicios Web no son una tecnología propie-
un conjunto de clases y controles tendientes a es- taria de .NET ni de Microsoft, sino que son un
cribir las aplicaciones Web de una manera senci- estándar aprobado y regulado por organismos in-
lla y muy parecida a como se escriben las aplica- ternacionales. Esto es fundamental, porque gra-
ciones para ventanas, aunque su funcionamiento cias a esta característica, representan una forma
en tiempo de ejecución sea radicalmente diferen- de integración de aplicaciones construidas con
te. Cuando desarrollamos una aplicación Web, el las más diversas herramientas. El espacio de
objetivo es siempre producir código HTML para nombres System.Web.Services contiene las clases
que sea interpretado por el navegador del usua- base que se pueden utilizar para crear servicios
rio. Sin embargo, el modelo de ASP.NET permi- Web. La más importante es WebService.

43
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 44

1. EL LENGUAJE .NET

Visual Basic .NET


Este lenguaje continúa con la tradición de su predecesor en
cuanto a su facilidad de uso. Veamos cómo utilizarlo.
A lo largo de esta sección, estudiaremos la sin- presiones. Una expresión está compuesta por
taxis de Visual Basic .NET, desde los cons- operadores y operandos. Por ejemplo, en
tructores fundamentales para cualquier progra- “2+3”, 2 y 3 son los operandos, y “+” es el
ma, hasta la creación de clases para programas operador. Visual Basic .NET provee un gran
orientados a objetos. número de operadores para construir expre-
siones de distintos tipos. En la Tabla 4 vere-
mos los más importantes, y a lo largo del cur-
Sintaxis básica so, iremos aprendiendo otros.
Siempre que escribimos código, nos encontra-
mos ante la necesidad de dejar algún comenta-
Variables
En Visual Basic .NET, las variables se declaran
rio explicando alguna porción o cualquier otra
usando la palabra reservada Dim.
cosa que debamos documentar. El compilador
Veamos un ejemplo:
no debe tener en cuenta estos textos, que se
denominan comentarios. En Visual Basic
Dim variable1 As String
.NET, los comentarios se escriben comenzan-
do con una comilla simple (‘), y se los puede
En este caso, estamos declarando una varia-
colocar tanto en una línea independiente como
ble llamada variable1 de tipo String.
al final de una línea de código.
Tanto la palabra clave Dim como la palabra
Veamos algunos ejemplos:
clave As son obligatorias. Ésta es la mínima
expresión para declarar una variable. Sin em-
' Este es un comentario de una línea
bargo, si queremos declarar más de una va-
Console.WriteLine(“Hola Mundo”) 'Este es un
riable del mismo tipo en una sola línea, po-
comentario al final
demos hacerlo separando los nombres con
coma, antes de la palabra clave As. Del mis-
En la primera línea del ejemplo, tenemos un
mo modo, también podemos declarar varia-
comentario que ocupa toda la línea, mientras
bles de otros tipos de datos usando la misma
que en la segunda, se ve una sentencia normal
línea de sentencia Dim, colocando el nombre
(que se ejecutará) seguida de un comentario.
y el tipo separados por coma, luego de cada
Hay que tener en cuenta que, luego de un co-
tipo de dato.
mentario, en la misma línea no se puede escri-
bir una sentencia ejecutable.

Operadores VB.NET no diferencia entre


Los operadores son elementos que nos permi-
ten combinar variables, constantes o instruc-
mayúsculas y minúsculas; es
ciones para obtener un valor como resultado; decir, no es case sensitive.
es decir, nos permiten construir y evaluar ex-

44
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 45

Visual Basic .NET

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

Para asignar valor a una variable, se utiliza el a = 1


operador de asignación, representado por el Else
signo “=”. La sintaxis es la siguiente: c = 0

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 .

Tabla 4 | Operadores utilizados por Visual Basic .NET


OPERADOR NOMBRE DESCRIPCIÓN
+ Suma Suma dos números.
- Resta / Negación Como operador binario, resta dos números. Como operador unario, representa
la negación aritmética.
* Multiplicación Multiplica dos números.
/ División real Divide dos números reales y devuelve un número real (por ejemplo, 10/4 es 2,5).
\ División entera Divide dos números enteros y devuelve un entero (por ejemplo, 10\4 es 2).
Mod Resto Devuelve el resto de una división entera (por ejemplo, 10 Mod 4 es 2).
^ Potenciación Devuelve un número elevado a otro como potencia (por ejemplo, 2^3 es 8).
& Concatenación Concatena dos cadenas de texto (“Hola” & “Mundo” devuelve “Hola Mundo”).
> Mayor Devuelve verdadero si el valor de la izquierda es mayor que el de la derecha.
< Menor Devuelve verdadero si el valor de la izquierda es menor que el de la derecha.
<> Distinto Devuelve verdadero si los dos operandos son distintos.
= Igualdad Devuelve verdadero si los dos operandos son iguales.

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

Select Case Expresión


Case Caso1 Sentencia For
' código si se cumple el Caso1 La sentencia For permite ejecutar un bloque de
' ..... código una cantidad determinada y fija de ve-
Case Caso2, Caso3, Caso4 ces. La sintaxis básica del constructor For es la
' código si se cumple el Caso2 el Caso3 o siguiente:
el Caso4

' ..... For i=0 To 10


Case Else 'Sentencias a ejecutar

' código si no se cumple ningún caso Next

' .....

End Select Analicemos cada elemento de esta estructura.


El constructor siempre comienza con la pala-
Cuando se alcanza una sentencia Select Case, bra clave For seguida de la variable contadora y
se evalúa la expresión y se obtiene un valor. su valor inicial (i=0). Sigue la palabra clave To
Luego, se compara el valor obtenido con el ca- y, por último, el valor final de la variable conta-
so1; si son iguales, se ejecuta el código com- dora (en el ejemplo es el valor 10). Después, en
prendido entre la línea siguiente a la que con- una nueva línea escribimos el bloque de código
tiene el caso1, y la próxima línea que contenga que queremos repetir (una o más líneas de có-
una palabra case o end select. Si los valores digo) y cerramos la estructura con la palabra
no coinciden, se evalúa el caso2 y se procede clave Next, que también es obligatoria y marca
de la misma manera que para el caso1. Si nin- el fin del bloque de repetición. Si queremos co-
guno de los casos coincide con el valor de la nocer la cantidad de veces que se ejecutará el
expresión, y existe una línea con Case Else, se bloque de código, debemos restar el valor final
ejecuta el bloque de código correspondiente. Si de la variable al valor inicial y sumarle 1, ya que
no hay un Case Else, se continúa con la línea la iteración comienza con el valor inicial. Si rea-
siguiente a la línea End Select. Veamos un pe- lizamos este ejercicio con el código del ejemplo

46
038a047.qxp 06/07/2008 10:53 p.m. PÆgina 47

Visual Basic .NET

anterior, debemos hacer 10 (el valor final) me- While Condición


nos 0 (el valor inicial) más 1, que nos da el va- 'Hacer algo
lor 11; es decir, el código que esté dentro del Loop
For se ejecutará 11 veces.
En condiciones normales como las del ejemplo Como se aprecia en el ejemplo, el bloque se de-
anterior, la variable contadora se incrementa en 1 be cerrar con la palabra clave Loop. En ejecu-
en cada iteración. Hay situaciones en las que ne- ción, cuando el código alcanza una sentencia
cesitamos que los pasos sean mayores; es decir, While, se evalúa la condición, y si es verdadera,
que en cada iteración la variable contadora se in- se ejecuta el código que sigue hasta alcanzar la
cremente en una cantidad distinta de 1. Para lo- palabra clave Loop. Ahí se vuelve a evaluar la
grarlo, podemos usar la palabra clave Step, que expresión de While, y si es verdadera, se vuelve a
permite indicar el paso o valor en que se incre- ejecutar el bloque de código; en caso contrario, la
menta el contador en cada iteración. Por ejem- ejecución continúa en la línea siguiente a la pala-
plo, si queremos mostrar los números pares del 2 bra clave Loop.Veamos un breve ejemplo en el
al 10, podemos escribir lo siguiente: que se le pide al usuario que ingrese un número
y se imprima en pantalla el cuadrado de éste. La
For i=2 To 10 Step 2 acción se repite hasta que el usuario ingresa el
Console.WriteLine(i) número 0. Para hacer esto, debemos abrir Visual
Next Studio e ir a Archivo/Nuevo Proyecto. En la
parte central seleccionamos Aplicación de Con-
Aquí, la porción de código Step 2 indica que sola. Luego de aceptar, dentro del Sub Main que
en cada iteración se sume 2 al valor actual de se creó, escribimos el siguiente código:
la variable contadora. Al poder modificar el
valor que se le suma a la variable contadora Dim Numero As Integer
en cada iteración, podemos hacer que el ciclo Numero = -1
For cuente hacia atrás, usando un valor nega- While Numero <> 0
tivo como paso. Console.Write (“Ingrese un número. Cero

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

tro es un valor que podemos pasarle al proce-


dimiento, y que éste recibe como si fuese una
Los parámetros permiten que un variable. Al ver el parámetro como una varia-
procedimiento se comporte cada ble, el procedimiento puede utilizarlo para alte-
vez de manera diferente. rar su comportamiento.
Modifiquemos el procedimiento ImprimirGuio-
nes para que acepte un parámetro que le indique
la cantidad de guiones que se deben imprimir:
Parámetros
Los procedimientos como el visto anterior- Sub ImprimirGuiones(ByVal cantidad As Integer)
mente son útiles, sin embargo muchas veces For i As Integer=1 To cantidad
necesitamos que uno de ellos haga distintas Console.Write(“-“)
cosas de acuerdo al contexto donde se lo esté Next
utilizando. Por ejemplo, siguiendo con el pro- End Sub
cedimiento ImprimirGuiones, quizás haya si-
tuaciones en las que tengamos que imprimir En este ejemplo, el procedimiento recibe un pa-
los guiones, pero no exactamente 80. Enton- rámetro que representa la cantidad de caracteres
ces surge un planteo interesante: ¿escribimos por imprimir, y lo utiliza como límite superior
un nuevo procedimiento que imprima la canti- del ciclo For. Modifiquemos el ejemplo de uso
dad de guiones necesaria?, ¿o modificamos el para imprimir separadores de distinta longitud:
que ya tenemos para indicar cuántos guiones
queremos imprimir? Obviamente, la primera ImprimirGuiones(80)
alternativa no es la mejor, ya que estaríamos Console.WriteLine(debe)
duplicando código y, además, solucionando un Console.WriteLine(haber)
caso particular, que luego quizá no nos sirva ImprimirGuiones(40)
otra vez y tengamos que escribir otro método Console.WriteLine(saldo)
más. La segunda alternativa, en cambio, es ImprimirGuiones(80)
practicable y nos permitirá ahorrar código.
La herramienta con la que contamos para indi- Parámetros por valor
carle al procedimiento cuántos guiones quere- y por referencia
mos imprimir son los parámetros. Un paráme- Visual Basic .NET brinda dos formas de pasaje
de parámetros a un procedimiento o función:
por valor o por referencia. Cuando se pasa un
parámetro por valor, lo que se le pasa al proce-
dimiento es una copia del valor original. Si el
procedimiento modifica el valor del parámetro,
sólo afectará a la copia. Cuando se pasa un va-
lor por referencia, lo que en realidad se está pa-
sando es la dirección de memoria donde se al-
macena el valor. Si se pasa un parámetro por
referencia, cualquier modificación que el proce-
FIGURA 016 | Mediante el uso de parámetros, podemos variar el dimiento o función haga, se hará sobre el valor
comportamiento de los procedimientos. original, ya que se tiene la dirección de memoria

49
048a063.qxp 09/07/2008 06:32 p.m. PÆgina 50

1. EL LENGUAJE .NET

donde está. Los parámetros por referencia son


una herramienta para hacer que un procedi-
miento se comunique con quien lo invocó, da-
Los parámetros permiten
do que puede devolver valores mediante los pa- devolver valores a quien llama
rámetros por referencia (también conocidos co- a un procedimiento o función,
mo parámetros de salida).
En Visual Basic .NET los parámetros por va-
aunque no se recomienda su uso.
lor se especifican mediante el modificador
ByVal, mientras que aquellos por referencia
son especificados a través del modificador En este caso, como el parámetro “saludo” es
ByRef. Podemos ilustrar este concepto con por referencia, al ser modificado dentro del pro-
un ejemplo simple. Supongamos que quere- cedimiento, también cambiará su valor original.
mos escribir un procedimiento al que le pase-
mos un nombre de persona, y nos devuelva,
en un parámetro, un saludo para ella. Esto se
hace de la siguiente manera:
Funciones
Las funciones son bloques de código que
Sub Saludar(ByVal nombre As String, ByRef siempre devuelven un valor a quien las lla-
saludo As String) ma. En Visual Basic .NET las funciones se
Saludo = “Hola “ & nombre definen mediante la palabra clave Function.
End Sub Además, luego de la lista de parámetros (si

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

y devuelve un valor del mismo tipo. Tam-


Hay que tener en cuenta que bién podemos ver que hay dos instrucciones
los parámetros opcionales Return. Es importante saber que podemos
usar todas las instrucciones Return que que-
deben estar siempre al final ramos o necesitemos, aunque debemos tener
de la lista de parámetros. siempre, por lo menos, una.

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:

La instrucción Return Sub Procedimiento(ByVal a As Integer, Optional


ByVal b as Integer)

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

podemos reemplazar la palabra clave Dim


por un modificador de alcance. Si utilizamos
En Visual Basic .NET podemos Dim, la variable tendrá un alcance privado.
crear variables de instancia tal Supongamos que estamos modelando cuentas
bancarias. Una cuenta bancaria tiene un saldo,
como si fuesen variables comunes.
que podemos mantener como variable de ins-
tancia, de la siguiente forma:
crear la instancia, utilizando la palabra
Class CuentaBancaria
reservada New, de esta manera:
Private saldo As Double

End Class
Dim objeto As Clase ‘Definimos el objeto

En el ejemplo, saldo es una variable de instan-


objeto = New Clase() ‘Creamos la instancia
cia y, en este caso, es privada a la clase.
Semánticamente, el operador New reserva un
espacio en memoria para guardar el nuevo obje- Propiedades
to y llamar a un método especial de la clase, de- Los objetos tienen propiedades. Por ejemplo, si
nominado Constructor. estamos modelando figuras geométricas, pode-
Toda clase hereda automáticamente de una clase mos identificar propiedades tales como la canti-
del framework .NET llamada Object, que tiene un dad de lados y la longitud de cada uno de ellos.
constructor utilizado en la mayoría de los casos. En una clase, debemos modelar las propieda-
Sin embargo, cuando definimos una clase, tal vez des. Al hacerlo, estamos diciendo que las ins-
tancias de la clase contarán con esas propieda-
necesitemos realizar alguna acción interna a ella al
momento de crear una instancia. Para hacerlo, de- des, no obstante, aún no les damos valor. Lue-
finimos un constructor propio, usando la palabra go, cuando creamos instancias, cada una tendrá
clave New como nombre de método, y cuando sus propios valores para las propiedades.
creemos una nueva instancia de un objeto de cla- En Visual Basic .NET, las propiedades de
se Ejemplo, se invocará el método New creado: las clases se definen utilizando la palabra
clave Property. A esta altura, el lector pue-
Class Ejemplo de pensar que las propiedades y las variables
Sub New() de instancia son lo mismo, pero no es así.
‘ Aquí podemos hacer alguna acción La diferencia está en que, al escribir una
End Sub propiedad, podemos escribir código para
End Class cuando ésta recibe el valor y para cuando al-
guien consulta el valor, con lo cual podre-
mos hacer validaciones o cálculos. Además,
uno de los fines de la programación orienta-
Variables de instancia da a objetos es lograr un alto grado de en-
Un objeto puede contener variables que deter- capsulamiento para facilitar el mantenimien-
minen su estado. En Visual Basic .NET pode- to del código. Se entiende por encapsula-
mos crear variables de instancia tal como si fue- miento el hecho de ocultar la implementa-
sen variables comunes, con la diferencia de que ción real de partes de la clase a quien la usa.

53
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 54

1. EL LENGUAJE .NET

Para ilustrar el uso de propiedades, suponga-


mos que queremos que quien usa la clase En Visual Basic .NET, las
CuentaBancaria pueda conocer y modificar el
saldo, que actualmente está como una variable
propiedades de las clases se
privada de instancia. Para esto, debemos escri- definen utilizando la palabra
bir una propiedad con alcance público que de- clave Property.
vuelve y asigne valor a la variable de instancia.
El código, entonces, quedará así:
End Property

Class CuentaBancaria End Class

Private _saldo As Double Analicemos un poco este código de ejemplo.


Public Property Saldo As Double Las palabras Public Property Saldo As
Get Double indican que se está definiendo una
Return _saldo propiedad pública llamada en este caso “Sal-
End Get do”, de tipo Double. A continuación, viene
Set(ByVal value As Double) lo que se denomina getter, que es la porción
_saldo = value de código que se ejecutará cuando alguien lea
End Set el valor de la propiedad.

Invocar el setter y el getter


Class CuentaBancaria
Dim cuenta As CuentaBancaria 1 Public Sub New()
End Sub
cuenta = New CuentaBancaria()
Private_saldo As Double
cuenta.Saldo = 1000 Public Property Saldo As Double
2
Double s = cuenta.Saldo Set (ByVal value As Double)
_saldo = value
3 End Set
Get
Return _saldo
End Get
End Property
End Class

1 Cuando creamos una instancia de clase, se ejecuta el método New, lla-


mado Constructor.
2 Cuando asignamos valor a la propiedad se invoca el setter de la clase.
El parámetro del setter recibe automáticamente el valor que se
encuentra a la derecha del operador de asignación.
3 Cuando consultamos el valor de la propiedad, se invoca el getter, que
actúa como una función devolviendo el valor de la propiedad.

FIGURA 018 | Cuando alguien lee el valor de la propiedad, se invoca el getter;


y cuando se asigna un valor, se invoca el setter.

54
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 55

Sintaxis de clases

Esta porción de código se comporta como Nuestra clase quedará así:


una función, que debe tener, al menos, una
instrucción Return para devolver el valor de la Class CuentaBancaria
propiedad. Private _debe, _haber As Double
De manera similar, sigue una porción de códi-
go llamada setter, que indica el código por Public Readonly Property Saldo As Double
ejecutar cuando alguien asigne valor a la pro- Get
piedad. El setter debe tener un parámetro del Return _haber - _debe
mismo tipo de la propiedad. End Get
Desde el lado del cliente de la clase, el acceso End Property
a la propiedad es totalmente transparente y se End Class
puede ver como si fuese una variable de ins-
tancia normal: En el ejemplo, el getter se ocupa de hacer el
cálculo del saldo y de devolverlo como valor
Dim cuenta As CuentaBancaria de la propiedad. Como una propiedad puede
cuenta = New CuentaBancaria() ser de sólo lectura, también puede ser de
cuenta.Saldo = 1000 sólo escritura, mediante el modificador Wri-
Console.WriteLine(cuenta.Saldo) teonly y omitiendo el getter. Así, el cliente
de la clase podrá asignarle valores a la pro-
Las propiedades no siempre deben tener un piedad, pero no podrá consultarla.
getter y un setter. Si queremos que los clien-
tes de la clase sólo conozcan el valor de la
propiedad pero no puedan modificarlo, po- Métodos
demos hacerla de sólo lectura. Para lograrlo, Los objetos se caracterizan por su estado y
agregamos el modificador Readonly antes por su comportamiento. El estado está da-
de la palabra Property y, además, omitimos do por las propiedades y variables de ins-
el setter. Para ilustrar este caso, modificamos tancia, mientras que el comportamiento es-
la clase CuentaBancaria para no guardar el tá dado por los métodos. Los métodos son
saldo en una variable de instancia, sino que los procedimientos y funciones que un ob-
queremos calcularlo como la diferencia entre jeto puede realizar y que pueden modificar
el haber y el debe de la cuenta, que son va- su estado. En Visual Basic .NET los méto-
riables de instancia. Además, no queremos dos se escriben como cualquier procedi-
que el saldo sea modificado. miento o función, y su visibilidad depende
de los modificadores de alcance empleados.
Continuando con la clase CuentaBancaria
que hemos definido, ya que el saldo nos ha
Los métodos se escriben como quedado como una propiedad de sólo lectu-
ra, la única forma de modificarlo es me-
cualquier procedimiento diante depósitos y extracciones, que serán
o función, y su visibilidad depende sendos métodos de la clase y que cambiarán
el valor de las variables de instancia (_debe
de los modificadores de alcance. y _haber). El código es el siguiente:

55
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 56

1. EL LENGUAJE .NET

Class CuentaBancaria La herencia permite especificar una relación


Private _debe, _haber As Double entre dos clases, mediante la cual la clase he-
redera recibe los atributos y el comportamien-
Public Readonly Property Saldo As Double to de su clase padre. La herencia puede ser
Get vista como una relación “es un”. Por ejemplo,
Return _haber - _debe un triángulo es una figura, un cuadrado es una
End Get figura; por lo tanto, podemos decir que el
End Property triángulo y el cuadrado heredan de figura. En
Visual Basic .NET la herencia se especifica
Public Sub Depositar(monto As Double) utilizando la palabra clave Inherits, seguida
_haber = _haber + monto del nombre de la clase de la que se hereda.
End Sub Para continuar con el ejemplo de la figura geo-
métrica, podemos escribir el siguiente código.
Public Sub Extraer(monto As Double) En este ejemplo, estamos especificando que la
_debe = _debe + monto clase Triángulo hereda de la clase Figura.
End Sub

Public Class Figura


End Class Public Lados As Integer

End Class

Public Class Triangulo


Herencia Inherits Figura

Una de las características más útiles e interesan-


tes de la programación orientada a objetos es la ‘Código de la clase triángulo
reutilización de código mediante la herencia. End Class

Jerarquía de objetos
Object

Figura

Triángulo Cuadrilátero Círculo

Cuadrado Trapecio Rombo

FIGURA 019 | Mediante la herencia se establecen jerarquías de objetos,


que pueden verse gráficamente mediante un árbol similar a los árboles genealógicos.

56
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 57

Sintaxis de clases

LA HERENCIA PUEDE SER VISTA COMO UNA RELACIÓN “ES UN”.


POR EJEMPLO, UN TRIÁNGULO ES UNA FIGURA, UN CUADRADO
ES UNA FIGURA; POR LO TANTO, PODEMOS DECIR QUE EL
TRIÁNGULO Y EL CUADRADO HEREDAN DE FIGURAS.

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

FIGURA 020 | Para crear


un nuevo proyecto
de consola, elegimos
la plantilla correspondiente
cuando Visual Studio
lo solicite.

Aplicaciones de consola Integer.Parse. Este método recibe una cadena


Para los ejercicios, vamos a hacer unas senci- de texto y devuelve el valor numérico adecuado,
llas aplicaciones de consola. Éstas son peque- o dispara una excepción si el texto no corres-
ños programas con una interfaz muy simple ponde a un entero válido.
(sin ventanas), muy similar a un programa de
DOS, pero basadas en la consola del sistema El método Main
operativo Windows 2000 o superior. Toda aplicación de consola debe tener un
Para crear una aplicación de consola con método llamado Main, que es el punto de
Visual Studio 2005, debemos ir al menú Ar- entrada de la aplicación. Al momento de eje-
chivo/Nuevo/Proyecto. Al hacerlo, se desple- cutar una aplicación de consola, el primer
gará una ventana donde tenemos que elegir el ti- método que se ejecuta es Main; es decir que
po de proyecto que queremos hacer, que será ahí debemos colocar todo el código y las lla-
“Aplicación de Consola”. Por último, en la parte madas que necesitemos hacer al comienzo de
inferior de esta ventana, ingresamos el nombre la aplicación. Al crear una nueva aplicación
que le queremos dar a nuestro proyecto. de consola con Visual Studio 2005, automáti-
camente se crea un método Main vacío, para
que podamos empezar a trabajar.
La clase Console
El framework .NET nos provee de una clase
llamada Console, con métodos para acceder a Una buena práctica
la consola en este tipo de aplicaciones. Los
dos métodos que más vamos a usar son
A medida que avanzamos en la lectura de todos
WriteLine y ReadLine. El primero nos per-
estos nuevos conceptos, es conveniente ir realizan-
mite escribir mensajes en la consola, mientras
do los diferentes ejemplos en la consola, y probar
que el segundo sirve para leer una cadena de
las distintas variantes para comprender, realmente,
texto que el usuario ingresó en ella.
cuál es el efecto que se obtiene en cada caso. Ésta
En algunos ejercicios, necesitaremos interpretar
es una práctica imprescindible para internalizar ca-
el texto leído con el método ReadLine como un
da uno de los temas tratados.
número entero, para lo cual utilizaremos el mé-
todo Parse del tipo de dato Integer, haciendo

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

Next FIGURA 021 | Vemos cómo la aplicación de consola se


queda en espera, mostrando los resultados obtenidos.
Recordemos que el operador Mod devuelve
el resto de dividir el primer operando por el
El mes correspondiente
Console.ReadKey() hará que el Veamos otro ejemplo. En este caso, vamos a es-
cribir una aplicación que pida un número de mes
programa se quede esperando
y muestre el nombre correspondiente. Repetimos
la presión de una tecla. la operación hasta que el usuario ingrese un cero
como número de mes.

59
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 60

Para concretar este ejercicio, debemos utilizar nombreMes = “Diciembre”


dos de las estructuras de control que hemos End Select
aprendido: While para repetir hasta que el
usuario ingrese un cero, y Select Case para Console.WriteLine(“El mes ingresado
seleccionar el nombre del mes según el núme- es {0}”, nombreMes)
ro ingresado. En este ejercicio necesitamos End If
usar el método ReadLine de la clase Console,
para leer el valor ingresado por el usuario y End While
asignarlo a una variable de tipo entero. En una
nueva aplicación de consola, agregamos el si- Al final, se usa el método WriteLine, que no
guiente código dentro del método Main: habíamos empleado aún, con un parámetro
adicional al texto que queremos imprimir. Es-
Dim mes As Integer = 1 ta sintaxis implica que el texto {0} se reem-
Dim nombreMes As String = “” plazará por el valor del segundo parámetro
While mes <> 0 dentro de la cadena por imprimir. Si tenemos
Console.Write(“Ingrese el número de mes: “) otro valor que queremos imprimir, podemos
mes = Console.ReadLine() agregar el parámetro y referenciarlo como
If mes <> 0 Then {1} dentro de la cadena.
Select Case mes Ahora veamos una variante del ejercicio ante-
Case 1 rior, escribiendo una función que devuelva el
nombreMes = “Enero” nombre del mes que se le pasa como paráme-
Case 2 tro. Simplemente, debemos crear una función
nombreMes = “Febrero” de tipo String, con un parámetro por valor y
Case 3 de tipo Integer, colocar dentro de ella el Se-
nombreMes = “Marzo” lect Case que escribimos en el ejercicio ante-
Case 4 rior y reemplazar el Select Case por el llama-
nombreMes = “Abril” do a la función. El encabezado de la función
Case 5 puede ser éste:
nombreMes = “Mayo”
Case 6 Function ObtenerNombreMes(ByVal mes As

nombreMes = “Junio” Integer) As String

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

Reemplazando el Select por la llamada a la fun-


ción, el código del procedimiento Main queda:
La forma más sencilla
de agregar una nueva clase
Sub Main() es utilizando la plantilla que
Dim mes As Integer = 1
Dim nombreMes As String = “”
nos brinda Visual Studio.
While mes <> 0
Console.Write(“Ingrese el número de mes: “) La forma más sencilla de agregar una nueva
mes = Console.ReadLine() clase es utilizando la plantilla que nos brinda
If mes <> 0 Then Visual Studio. Para esto, basta con hacer clic
nombreMes = ObtenerNombreMes(mes) con el botón derecho sobre el ícono de pro-
Console.WriteLine(“El mes ingresado yecto en el Explorador de Soluciones, seleccio-
es {0}”, nombreMes) nar la opción Agregar y, luego, Clase. Visual
End If Studio nos pedirá que escribamos el nombre
End While de la clase, y después de aceptar, agregará un
Console.ReadKey() nuevo archivo al proyecto, con la definición
End Sub (aunque vacía por ahora) de la nueva clase:

Public Class Fraccion

End Class

FIGURA 022 | Reemplazando el Select Case por


una función, nuestro programa se sigue comportando
como debe y el código es más claro.

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

además de las propiedades para exponerlas pú-


blicamente. En este caso, sólo mostraremos Para asociar variables
cómo escribir el código para el numerador, y con propiedades podemos
el lector deberá completar el ejercicio agregan-
do el denominador. Hasta ahora, el código de nombrarlas igual, colocando un
la clase queda de este modo: guión al nombre de la variable.
Public Class Fraccion
se FraccionConConsola tiene una propiedad lla-
Private _numerador As Integer
mada Numerador y otra llamada Denominador.
Lo que nos queda por hacer, entonces, es
Public Property Numerador() As Integer
crear el constructor como pide el enunciado
Get
del ejercicio. Recordemos que el constructor
Return _numerador
es un método especial llamado New.
End Get

Set(ByVal value As Integer)


_numerador = value Ejercicios para seguir
End Set
End Property
practicando
End Class

Ejercicio 1: Modificar la clase Fraccion del último


Ahora bien, tratemos de crear una nueva clase ejercicio para agregar una propiedad de sólo lectu-
para representar números fraccionarios, como ra que devuelva el valor real de la fracción (la divi-
la del ejercicio anterior, y que tenga un cons- sión real entre el numerador y el denominador).
tructor que pida al usuario que ingrese en la Ejercicio 2: Modificar la clase Fraccion para validar
consola los valores para el numerador y el de- que el denominador no sea 0 y, así, evitar errores
nominador. Para cumplir con este objetivo, va- de división por 0 al usar la propiedad definida en el
mos a escribir realmente muy poco código, ya Ejercicio 1. Si el valor que se le asigna es 0, deberá
que usaremos la herencia para aprovechar la mostrar un mensaje de error en la consola, asig-
clase escrita en el Ejercicio 4. Con Visual Stu- narle 1 al denominador y 0 al numerador. Como
dio creamos una nueva clase llamada Fraccion- ayuda, el setter de la propiedad puede contener
ConConsola y la hacemos heredar de la clase todo el código que se desee.
Fraccion, mediante la palabra clave Inherits: Ejercicio 3: Modificar la clase Fraccion otra vez,
agregando un método (Función) llamado Multipli-
Public Class FraccionConConsola car, que reciba como parámetro una instancia de la
Inherits Fraccion clase Fraccion y devuelva como resultado un nue-
vo número fraccionario que sea el resultado de
End Class multiplicar la instancia actual por la que se recibe
como parámetro. Para multiplicar dos fracciones,
hay que multiplicar los numeradores y los denomi-
Con esto, como vimos antes, estamos heredan-
nadores (por ejemplo, ½ * ¾ es 3/8).
do las características (propiedades y comporta-
miento) de la clase Fraccion, es decir que la cla-

62
048a063.qxp 09/07/2008 06:33 p.m. PÆgina 63

Escribamos el código del constructor pa-


Ejercicios para seguir ra pedir los valores:

practicando Sub New()

Console.Write(“Ingrese el numerador: “)

Ejercicio 4: Escribir una clase Empleado con una Numerador = Console.ReadLine()


propiedad llamada Nombre y un método “rede- Console.Write(“Ingrese el denominador: “)
finible” llamado HacerTarea. Escribir dos clases Denominador = Console.ReadLine()
derivadas de Empleado, llamadas Obrero y Ge- End Sub
rente. Redefinir el método HacerTarea de la cla-
se Obrero para que muestre en la consola el
texto “Trabajar”. Redefinir el método HacerTa-
rea de la clase Gerente para que muestre por
Asignamos valor a las
pantalla el texto “Mandar”. variables de instancia
Ejercicio 5: Siguiendo con el Ejercicio 4, en el mediante las
módulo donde está el método Main, escribir un
método llamado MostrarTrabajo, que reciba co- propiedades porque las
mo parámetro una instancia de la clase Emplea- variables de instancia
do e invoque el método HacerTarea del objeto están como privadas,
que recibe. Por último, en el método Main, crear
una instancia de la clase Obrero y otra de la y con ese alcance sólo
clase Gerente, e invocar el método MostrarTra- la clase que las contiene
bajo con ambas. Se puede consultar el libro In-
troducción a la programación para repasar con-
puede acceder a ellas.
ceptos de herencia y polimorfismo.
Ejercicio 6: Redefinir el método ToString de la
Lo que estamos haciendo en el construc-
clase Empleado para que muestre el nombre
tor es mostrar un par de carteles al usuario
por pantalla. Cabe recordar que este método
para que ingrese los valores y asignarlos a
pertenece a la clase Object, de la que todas
las variables privadas, pero haciendo uso
las demás clases heredan por defecto (aun-
de las propiedades de la clase Fraccion.
que no se haga explícitamente mediante la
Esto es todo lo que necesitamos hacer para
palabra Inherits). Dentro del método Main,
este ejercicio. Mediante este ejemplo, pode-
crear una nueva instancia de la clase Obrero
mos ver algo de la potencia que nos ofrece
llamada obrero1, asignar valor a la propiedad
la herencia. Si no hubiésemos heredado de
Nombre y escribir la siguiente línea:
la clase Fraccion, deberíamos haber escrito
otra vez el código de las propiedades y de
Console.WriteLine(obrero1)
las variables de instancia.
Es conveniente a esta altura del curso re-
Ejecutar la aplicación y analizar los resulta-
pasar los conceptos desarrollados en el li-
dos. ¿Qué se mostró en la consola?
bro Introducción a la programación, para refor-
zar los temas más complejos.

63
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 64

1. EL LENGUAJE .NET

Microsoft Visual C# 2005


C# se está perfilando como “el lenguaje” de desarrollo
de Microsoft .NET. Conozcamos el poder que nos ofrece.
Hasta ahora conocimos el entorno de Visual Sintaxis básica del lenguaje
Studio .NET 2005, sus principales caracterís-
ticas, componentes y modo de funcionamien-
La sintaxis de C# es muy parecida a la de C,
to. Ahora llega el turno de C# 2005.
C++ y Java. Para el diseño de este lenguaje,
Microsoft decidió modificar o añadir única-
mente aquellas cosas que en C no tienen una
El lenguaje C# relativa equivalencia. Por ejemplo, un dato
para tener en cuenta es que en C# todas las
C# fue creado por Microsoft con el propó- instrucciones y declaraciones deben terminar
sito de ser el mejor lenguaje de programa- con “;” (punto y coma), salvo cuando se
ción que exista para escribir aplicaciones abra un bloque de código. A diferencia de lo
destinadas a la plataforma .NET. Combina que sucede en Visual Basic, una instrucción
la facilidad de desarrollo propia de Visual que sea muy larga puede ponerse en varias lí-
Basic con el poderío del lenguaje C++, un neas, sin ingresar ningún tipo de signo espe-
lenguaje con el cual se ha escrito la mayor cial al final de cada una.
parte de la historia del software y de los sis- El compilador comprende que todo forma
temas operativos de todos los tiempos. En parte de la misma instrucción, hasta que en-
líneas generales, podemos decir que es un cuentra el punto y coma:
lenguaje de programación orientado a obje-
tos simple y poderoso. Una muestra de esto
A = Metodo(argumento1, argumento2, argumento3
es que las aplicaciones desarrolladas en él
, argumento4, argumento5, argumento6
podrán funcionar tanto en Windows como
, argumento7, argumento8);
en dispositivos móviles, ya sea un teléfono
celular o una PDA.
Diferencias de sintaxis
Características fundamentales con Visual Basic
Lo primero que debemos saber es que po- En el siguiente fragmento de código, veremos
dremos crear una gran diversidad de progra- las diferencias de una misma función escrita
mas utilizando este lenguaje: desde aplica- en Visual Basic y en C#:
ciones de consola, aplicaciones para Win-
dows o aplicaciones Web, hasta software pa-
ra dispositivos móviles, drivers y librerías
para Windows. C# ha evolucionado notable-
C# es un lenguaje
mente desde sus primeras versiones, al in- de programación orientado
corporar funcionalidades que mejoran y fa- a objetos simple y poderoso.
cilitan la escritura de código, la seguridad de
tipos y el manejo automático de memoria.

64
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 65

Microsoft Visual C# 2005

FUNCIÓN ESCRITA EN VISUAL BASIC yorQueCinco), la línea donde termina esa


Public Function NumeroMayorQueCinco(numer función (End Function). El otro bloque co-
as integer) as boolean rresponde al contexto If, compuesto por la
‘Comparo si el parámetro numer contiene única línea que hay entre el principio de ese
un valor mayor a 5 contexto (If numer > 5 then) y la que indi-
if numer > 5 then ca su final (End If). Este tipo de bloque en
Visual Basic que marca el principio y el fin
NumeroMayorQueCinco = true de la función y el código contenido hace que
la legibilidad sea clara y sencilla.
end if La misma función escrita en C# marca que los
bloques están claramente delimitados por llaves,
End Function { y }, ambos del mismo modo. Detrás de la lí-
nea en la que se declara el método, no está el
FUNCIÓN ESCRITA EN C# punto y coma, igual que en la línea del If, lo cual
public bool NumeroMayorQueCinco(int numer) indica que la llave de apertura del bloque corres-
pondiente se podría haber escrito a continua-
{ ción, y no en la línea siguiente.
//Comparo si el parámetro numer contiene Para comentar el código utilizamos //, a di-
un valor mayor a 5 ferencia de Visual Basic .NET, donde se usa
if (numer > 5) una comilla simple.

return true; Operadores


}
return false; C# proporciona un conjunto de operadores,
} símbolos que especifican las operaciones que
deben realizarse en una expresión. Por lo ge-
En la función escrita en Visual Basic .NET. neral, en las enumeraciones se permiten las
encontramos dos bloques de código. El pri- operaciones de tipos integrales, como ==, !=,
mero es el contexto que crea la función, es <, >, <=, >=, binary +, binary -, ^, &, |,
decir, la línea donde se declara la función del ~, ++, — y sizeof().
tipo public (Public Function NumeroMa-
Veamos algunos ejemplos de los operadores
más comunes:
¿Qué es una DLL? Console.WriteLine(6 + 9); // operador de suma
// concatenación de cadenas

Una DLL (Dynamic Link Library) es un conjunto Console.WriteLine(“2” + “7”);


de funciones o clases que pueden ser accedidas // concatenación de cadenas
y utilizadas por otros programas en tiempo de Console.WriteLine(2.0 + “9”);
ejecución. Estas librerías pueden crearse desde // operador de comparación
C# o desde otros lenguajes. Console.WriteLine(8 > 12);

// 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;

Tabla 5 | Resumen del sistema de tipos


Alias C# Descripción Valores aceptados
object Clase base de todos los tipos del CTS Cualquier objeto
string Cadenas de caracteres Cualquier cadena
sbyte Byte con signo Desde -128 hasta 127
byte Byte sin signo Desde 0 hasta 255
short Enteros de 2 bytes con signo Desde -32.768 hasta 32.767
ushort Enteros de 2 bytes sin signo Desde 0 hasta 65.535
int Enteros de 4 bytes con signo Desde -2.147.483.648 hasta 2.147.483.647
uint Enteros de 4 bytes sin signo Desde 0 hasta 4.294.967.295
long Enteros de 8 bytes con signo Desde -9.223.372.036.854.775.808
hasta 9.223.372.036.854.775.807
ulong Enteros de 8 bytes sin signo Desde 0 hasta 18.446.744.073.709.551.615
char Caracteres Unicode de 2 bytes Desde 0 hasta 65.535
float Valor de coma flotante de 4 bytes Desde 1,5E-45 hasta 3,4E+38
double Valor de coma flotante de 8 bytes Desde 5E-324 hasta 1,7E+308
bool Verdadero/falso true o false
decimal Valor de coma flotante de 16 bytes
(tiene 28-29 dígitos de precisión) Desde 1E-28 hasta 7,9E+28

66
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 67

Microsoft Visual C# 2005

string palabra1 = “05/08/2007: Buenos”;

Cuando se declara una variable string palabra2 = “ Días:”;

string palabra3 = “ 09:38”;


que es de tipo valor, se está
string saludo = (palabra1 + palabra2
reservando un espacio de + palabra3);

memoria en la pila para que


Console.WriteLine(saludo);
almacene los datos que contiene. Console.ReadKey();

Cuando queremos declarar una variable de Arrays


uno de estos tipos en C#, tenemos que colo- Un array es una estructura de datos que con-
car el alias que le corresponde; luego, el nom- tiene variables del mismo tipo. Se declara de la
bre de la variable y, por último, opcionalmen- siguiente manera:
te, le asignamos su valor.
C# distingue entre mayúsculas y minúsculas, TipoDeDato [] NombreDelArray;
lo que se conoce como case sensitive. Esto sig-
nifica que PERSONA, Persona y persona El siguiente ejemplo muestra cómo declarar
constituyen tres tipos de datos distintos. Un diferentes tipos de arrays:
tipo que admite valores de coma flotante ad-
mite valores con un número de decimales que static void Main(string[] args)
no está fijado previamente; es decir, números {
enteros o con un decimal, o con dos, o con // Declara un array de una dimension
diez. Decimos que la coma es flotante porque con lugar para 3 elementos
no está siempre en la misma posición con res- int [] arrayDeNumeros = new int[3];
pecto al número de decimales (el separador arrayDeNumeros[0] = 6;
decimal en el código siempre es el punto). arrayDeNumeros[1] = 35;

arrayDeNumeros[2] = 37;

double num=10.75;
// El mismo array, se puede llenar durante
double num=10.7508; su declaracion

int[] array2DeNumeros = { 6, 35, 37 };

Las cadenas son una consecución de caracteres


–ya sean numéricos, alfabéticos o alfanuméricos– // o de esta manera
y son definidas de la siguiente manera: int[] array3DeNumeros = new int[] { 6,
35, 37 };

// mostrar los elementos del array


for (int i = 0; i < arrayDeNumeros.Length;

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

// sobre los elementos de un array

foreach (int a in array2DeNumeros) {


C# distingue entre mayúsculas
Console.WriteLine ( a );

} y minúsculas, lo que se conoce


como case sensitive.
Console.Read ();
}

// bloque de código que se ejecuta cuando a es


Sentencias de control MAYOR que b

En C# disponemos de dos tipos de sentencias }


de control: de bifurcación condicional y de itera- else
ción. La primera consiste en evaluar una expre- {
sión ejecutando un bloque de código si la expre- // bloque para a MENOR que b
sión es verdadera; de lo contrario, un segundo }
bloque de código puede ser ejecutado. Tenemos,
entonces, dos elementos para manejar la bifur- Es posible utilizar los siguientes operadores:
cación condicional en C#: if y switch. >, <, >=, <=, != y ==.
El fragmento de código que se muestra a con-
tinuación ejemplifica cómo hacerlo:
Sentencia if if (a > b)

// utilizacion de if // si a es mayor que b


if (a > b) }

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

Microsoft Visual C# 2005

else if (a < b) // código si a == 1

{ break;

// si a es menor que b case 2:

} // código si a == 2

else if (a<=b) break;

{ case 3: case 4: case 5:


// si a es menor o igual a b // código si a == 3 o 4 o 5
} break;
else if (a >= b) default:

{ // código si a tiene un valor distinto a

// si a es mayor o igual a b 1,2,3,4 o 5.

} break;
else if (a == b) }

// si a es igual a b Con esto podemos decir que switch es compa-


} rable con la sentencia Select Case, vista ante-
else if (a != b) riormente en Visual Basic .NET.
{ La bifurcación ocurre en el switch sin evaluar
// a es distinto que b todas las opciones, mientras que en un blo-
} que if-else if todas las opciones son evalua-
else das. Por este motivo, si sabemos que la varia-
{ ble que vamos a evaluar tomará sólo uno de
// alguna opción no contemplada :) los valores posibles (en forma excluyente), y
} que la cantidad de valores por evaluar es más
grande que tres (regla de dedo), utilizar
Sentencia switch switch en vez de bloques if-else if es más efi-
En ocasiones, necesitaremos comparar una va- ciente en términos de procesamiento.
riable con una cantidad de valores posibles, a
fin de determinar el rumbo por seguir. Para
hacerlo, utilizamos el switch:
Sentencia de bucle
switch (a)
En algunas oportunidades, necesitaremos que
{
determinada porción de código de un progra-
case 1:
ma se repita una cierta cantidad de veces o

SI LA VARIABLE QUE VAMOS A EVALUAR TOMARÁ SÓLO UNO DE LOS


VALORES POSIBLES (EN FORMA EXCLUYENTE),Y LA CANTIDAD DE
VALORES POR EVALUAR ES MÁS GRANDE QUE TRES, ES ACONSEJABLE
UTILIZAR SWITCH EN VEZ DE BLOQUES IF ELSE.

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.

string Palabra = “”; String Palabra;

while (Palabra != “terminar”) do


{ {

Console.WriteLine(“Ingrese una palabra:”); Console.Write(“Ingrese la palabra\n”);


Palabra = Console.In.ReadLine(); Palabra = Console.In.ReadLine();

} } while (Palabra != “terminar”);

Console.WriteLine(“Palabra correcta para Console.Write (“Es la palabra correcta”);


finalizar”);

Analizando el código, vemos en la primera lí- La sentencia while, que significa


nea que declaramos una variable del tipo ca- mientras, indica que una sentencia
dena, y la inicializamos. En esta variable se al-
macenará el texto que ingresemos por teclado o grupo de sentencias se repetirá
cuando probemos el sistema. mientras una condición asociada
Luego, iniciamos la sentencia while, y eva-
luamos la expresión encerrada entre parén-
a ella sea verdadera.
tesis en esa sentencia, que en este caso sería:
“mientras la variable Palabra sea distinta de A diferencia de la instrucción while, un bucle
“terminar”... Si al evaluar la expresión ob- do-while se ejecuta una vez antes de que se
tenemos como resultado Verdadero, enton- evalúe la expresión condicional.
ces entra en el cuerpo del bucle while; de En cualquier punto dentro del bloque do-
otra manera, saltaremos a la línea siguiente while, se puede salir del bucle utilizando la
después del cuerpo. instrucción break. Se puede pasar directa-
Dentro del while enviamos a la salida de la mente a la instrucción de evaluación de la
consola el texto “Ingrese una palabra:”, y el expresión while utilizando la instrucción
programa vuelve a capturar en la variable Pa- continue; si la expresión se evalúa como
labra el texto que se ingresa en el teclado. true, la ejecución continúa en la primera ins-
Así, cada vez que ingresemos un texto en la sa- trucción del bucle. Si se evalúa como false,
lida de la consola, éste será analizado, evaluan- la ejecución continúa en la primera instruc-
do la expresión Palabra != salir. Cuando la ción detrás del bucle do-while.

70
064a071.qxp 06/07/2008 10:56 p.m. PÆgina 71

Microsoft Visual C# 2005

en iteración y para procesar de manera se-


cuencial. En el ejemplo siguiente el valor de i
se imprimirá en pantalla mientras se incre-
menta de a uno:

{
for (int i = 0; i < 5; i++)
Console.WriteLine(i);
Console.ReadKey();

}
FIGURA 026 | El resultado de la sentencia for.

Analizando el código, vemos que se evalúa el


valor inicial de la variable i. A continuación,
mientras el valor de i es menor o igual que 5,
la condición se evalúa como true, se ejecuta la
instrucción Console.WriteLine y se vuelve a
evaluar i. Cuando i es mayor que 5, la condi-
ción se convierte en false, y el control se
transfiere fuera del bucle.

FIGURA 027 | El resultado de la sentencia foreach. La sentencia foreach


Ciertas colecciones de objetos utilizan una for-
La sentencia for ma de estructurar la colección que permite la
El bucle for ejecuta una instrucción o un blo- extracción de cada uno de los elementos de
que de instrucciones repetidamente hasta que manera controlada desde la clase contenedora.
una determinada expresión se evalúa como fal- Esto permite mantener el encapsulamiento
se. El bucle for es útil para recorrer matrices dentro de la clase para evitar que el cliente co-
nozca los detalles internos a la implementación.
Por ejemplo, el siguiente fragmento de código
La condición consulta un array utilizando foreach:

de terminación del bucle string[] nombres = { “Gabriel”, “Rafael”,

“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

Microsoft Visual C# 2005

}
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);

//A 60 días 12% de interés $ 5500 a 30 días me dará: $ 5775

60dias = (deposito * 1.12); $ 5500 a 30 días me dará: $ 6160

Componentes de una función


1 static void main ()
2 {
3 Console.WriteLine("Viendo en acción nuestra función"}
4 int Resultado = SumarNumeros(32 + 35) ;
5 Console.WriteLine(Resultado):
6 }
7 static int SumarNumeros(int Valor1, int Valor2)
8 {
9 return Valor1+Valor2;
10 }

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.

int SumarNumeros (int Valor1, int Valor2)

El nombre asignado a la función 1 - Tipo de dato


por el cual la invocaremos en el 2 - Identificador
momento de necesitarla.
2 3 - Parámetros

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.

Qué es una clase


Una clase es una estructura de
Se conoce como clase a una estructura de datos
utilizada para crear y definir nuestros propios ti-
datos utilizada para crear y definir
pos de datos, que nos ayudará a ampliar los pro- nuestros propios tipos de datos.
pios del lenguaje.
En general, las clases se utilizan por medio de lo
que llamamos instancias, que denominan obje- Declarar una clase
tos. Los objetos del mismo tipo pueden compar-
tir una estructura común entre ellos, pero posee- Para declarar clases en C# utilizaremos archivos
rán valores distintos en las variables que los com- con extensión .CS, que compondrán nuestro
ponen (llamadas miembros). proyecto o solución. Dentro de ellos podremos
Dentro de un programa, podemos crear objetos definir todas las clases que nos parezcan conve-
partiendo de una clase, y la única limitación que nientes, pero siempre es recomendable utilizar
tenemos es la memoria que posea la computado- un archivo por cada una que definamos para
ra en la que se ejecute el software. nuestro programa. Esto nos facilitará la lectura y

Estructura de una clase


Estructura gráfica de una clase Estructura en código de una clase

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#

modificación o corrección de cualquiera de ellas, claramos la variable no especificamos lo


en caso de que lo necesitemos. contrario, será del tipo private.
Para crear una clase, en primer lugar debemos • protected: La variable es declarada como pro-
escribir la palabra reservada class y, luego, el tegida. No podemos acceder a su contenido
identificador, que será el nombre con el cual la desde objetos externos, pero sí, desde métodos
clase será identificada en el momento de usarla. de la clase y clases derivadas de ella.
Es preciso respetar que ese nombre no coincida • protected internal: La variable es declarada co-
con ninguna palabra reservada propia del len- mo protegida interna. Podemos acceder a su
guaje C#. El nombre otorgado tiene que ser contenido desde métodos de clases que se en-
bien claro y fácil de recordar. Generalmente, los cuentren dentro del mismo assembly o ejecuta-
nombres de las clases se eligen sobre la base del ble, desde métodos que estén ubicados dentro de
uso que vayamos a darles dentro del programa. la misma clase y desde clases derivadas de ella.
A continuación, veremos una clase graficada para • public: La variable es declarada como pública,
mejorar su comprensión y, luego, la misma clase de modo que podemos acceder a su contenido
en código fuente. Dentro del “cuerpo” de la cla- desde cualquier objeto de cualquier tipo.
se declaramos y definimos los miembros que la
compondrán: Datos y Métodos. Veamos cómo declarar una clase sencilla con sus
miembros en el siguiente ejemplo:
class Persona
Modificadores de acceso {

public string nombre;


Las variables o miembros de una clase se declaran public string apellido;
de la misma manera que las variables convencio- public string DNI;
nales en C#, aunque pueden poseer algunos mo- public int edad;
dificadores particulares o especiales. Es posible
utilizar lo que se conoce como modificador de public Persona() {}
acceso, que regulará la manera de interactuar con }
una variable o el método desde otros objetos.
Siempre podremos acceder a las variables de una De acuerdo con el fragmento de código anterior,
clase desde los métodos declarados en ella. Para hemos definido la clase Persona. Ésta constituye
otros métodos de otras clases, éstos nos impon- un tipo de dato nuevo, que estará disponible para
drán limitaciones. Éstas son: ser utilizado en nuestra aplicación.
Ahora, vamos a agregar los valores correspon-
• internal: La variable es declarada como in- dientes a los miembros de la clase:
terna. Podemos acceder a su contenido desde
métodos de clases que se encuentran dentro static void Main(string[] args)
del mismo assembly o ejecutable de nuestro {
proyecto. Persona p = new Persona();
• private: La variable es declarada como pri- p.nombre = “Julián”;
vada. Sólo podemos acceder a su contenido p.apellido = “Luna”;
desde métodos de la clase, pero no desde p.DNI = “46.850.185”;
métodos de clases derivadas. Si cuando de- p.edad = 2;

75
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 76

1. EL LENGUAJE .NET

Console.WriteLine(“Descripción de persona :

{0},{1}”, p.nombre, p.apellido); Las variables o miembros


Console.WriteLine(“Otros datos : {0},{1}”,
de una clase se declaran
p.DNI, p.edad + “ años”);

Console.Read();
de la misma manera que las
} variables convencionales en C#.

Veamos cómo instanciar objetos, que posean la


Instanciación misma variable con valores distintos:

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);

Persona p = new Persona(); Console.Read();

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)

public class Persona {

{ Persona pers1 = new Persona();


public const string ciudadano = “Argentino”; Persona pers2 = new Persona();
//…
} pers1.nombre = “ Nicolás”;

pers2.nombre = “ Julián”;

A nuestra clase Persona le agregamos una cons- string origen = Persona.ciudadano;


tante llamada ciudadano, cuyo valor es “Argen-
tino”. Esta constante tendrá este valor previa- Console.WriteLine(“El valor de la variable
mente asignado, que no puede ser modificado, nombre del objeto pers1 es:
por lo cual será el mismo para todas las instan- {0}”, pers1.nombre);
cias que creemos sobre la base de la clase Perso- Console.WriteLine(“El valor de la variable
na. Notemos también que cuando declaramos la nombre del objeto pers2 es:
constante, también la inicializamos, es decir, le {0}”, pers2.nombre);
asignamos su valor. Esto es obligatorio cuando Console.WriteLine(“El país de origen para los
utilizamos este tipo de dato en las clases. objetos pers1 y pers2 es:
En las constantes dentro de una clase encontra- {0}”, origen);
mos también una característica adicional: pueden Console.Read();
ser accedidas o consultadas sin necesidad de ins- }

Asignación de valores
operador de selección
operador de asignación
fin de sentencia

Persona . nombre = "Nico" ;

clase variable valor

FIGURA 030 | La asignación de valores a variables de una clase se realiza prácticamente


de la misma forma en que se le asigna valor a cualquier variable declarada fuera de ella.

77
072a078.qxp 06/07/2008 10:59 p.m. PÆgina 78

1. EL LENGUAJE .NET

En el ejemplo, luego de haber agregado a la Cla-


se Persona la constante ciudadano, modificamos
el código del programa, creando una variable
Las constantes declaradas
origen, la cual obtendrá el valor de la constante dentro de clases pueden poseer
ciudadano, directamente de la clase Persona. los mismos modificadores de
acceso que las variables (public,
Variables estáticas private, protected, etc.).
de una clase
int muestroAnio= Persona.anioActual;
Las variables estáticas, al igual que las constantes,
pueden ser accedidas sin necesidad de instanciar Console.WriteLine(“El valor de la variable
un objeto, pero con la ventaja de que podemos nombre del objeto pers1 es:
modificar su valor como si fuese cualquier otra {0}”, pers1.nombre);
variable. Este tipo de variables, tal como sucede Console.WriteLine(“El valor de la variable
con las constantes o las variables convencionales, nombre del objeto pers2 es:
pueden tener los mismos modificadores de acce- {0}”, pers2.nombre);
so (public, private, protected, etc.). Ahora agrega- Console.WriteLine(“El valor de la variable
remos a la clase Persona una variable Static: estática añoActual es:
{0}”, muestroAnio);

public class Persona Console.WriteLine(“El país de origen


{ para los objetos pers1 y pers2 es:

public static int añoactual = 2006; {0}”, origen);


public const string ciudadano = “Argentino”; Console.Read();

//… }

} }

Luego, cambiamos su valor desde nuestro pro-


grama, antes de mostrarla en pantalla:

class Program
{

static void Main(string[] args)


{

Persona pers1 = new Persona();


Persona pers2 = new Persona();

Persona.anioActual = 2007;
pers1.nombre = “Nicolás”;

pers2.nombre = “Julián”; FIGURA 031 | Podemos observar en la aplicación


de consola la clase Persona funcionando, con todo
string origen = Persona.ciudadano; lo referente a clases que aplicamos en ella.

78

También podría gustarte