c#. la guía total del programador
DESCRIPTION
Enjoy!!TRANSCRIPT
-
PROGRAMACIN C#
Diego G. Ruz
Es ingeniero en Sistemas de Informacin, egresado de la Universidad Tecnolgica Nacional Argentina. Su inters por la programacin comenz a los 10 aos de edad, cuando tuvo en sus manos su primera computadora, la Commodore 64. A partir de aquel momento, inici una carrera que lo llevara de computadora en computadora y de un lenguaje de programacin a otro. Actualmente se desempea como programador lder en el departamento de sistemas de la empresa Bioscience, dedicado a la construccin de software para la adquisicin, visualizacin y anlisis de seales biolgicas. Dicta clases de programacin de videojuegos en el instituto Image Campus y es colaborador de la revista de programacin users.code en el rea multimedia. Es, adems, autor del libro C++ Programacin orientada a objetos.
DedicatoriaA mi compaera de vida, Ana, quien a pesar de mis defectos, permanece a mi lado.
A g radecim ientosA mi familia, a la que agradezco profundamente su contencin y afecto.
2 ^ SOBRE LA EDITORIAL
MP Ediciones S.A. es una editorial especializada en temas de tecnologa (computacin, IT, telecomunicaciones).Entre nuestros productos encontrar: revistas, libros, fascculos, sitios en Internet y eventos. Nuestras principales marcas son: USERS, Aprendiendo PC, Dr. Max y TecTimes.
Si desea ms informacin, puede contactarnos de las siguientes maneras:Sitio web: www.tectimes.com E-mail: librosiampediciones.comCorreo: Moreno 2062 (C1094ABF), Ciudad de Buenos Aires, Argentina.Tel.: 54-11-4959-5000/Fax: 54-11-4954-1791
4 u M .c o d e
-
Prlogo
PRLOGODesde que Microsoft present al mundo su nueva plataforma estratgica de desarrollo, .NET, sta no ha parado de crecer y extenderse. Hoy en da, forma parte de una de las tecnologas ms importantes que un programador debera conocer.
En este libro aprender a programar en C#, el lenguaje ms importante de la plataforma .NET, el cual le permitir explotar al mximo sus capacidades.
El lenguaje fue diseado para crear sistemas en el mundo actual, donde la necesidad de comunicarse con otras aplicaciones y servicios por una red de informacin -como Internet- es moneda corriente, donde conviven bases de datos de distintos fabricantes, donde los sistemas son construidos a partir de componentes locales o remotos, donde se requieren soluciones integrales para diversos tipos de plataformas.
Con C# podremos crear sistemas de una gran diversidad, simples o complejos, aplicacior.es de consola, de escritorio o para la Web, para computadoras personales o para dispositivos mviles, etc. Tambin ofrece una excelente puerta de entrada a quienes deseen iniciarse en la programacin orientada a objetos, ya que es fuerte en los aspectos ms importantes del paradigma y simplifica las tareas menos agradables que suelen convivir con otros lenguajes ms antiguos.
Este libro ofrece una introduccin en los aspectos ms importantes del lenguaje C# y la plataforma .NET. Pretende ser ideal para el principiante, para el no tan principiante y para los programadores que provengan de otros lenguajes, atrados por esta grande y maravillosa plataforma de desarrollo. Espero que el lector disfrute tanto su lectura como yo disfrut en escribirlo.
Ing. Diego G. [email protected].
u s r .c o d e 5
-
PROGRAMACIN C#
EL LIBRO DE UN VISTAZOEn la prim era parte de este m anual, desarro llarem os los conceptos fundam entales y las caractersticas particulares que hacen a este len guaje, para luego introducirnos de lleno en la program acin de aplicaciones de escritorio y para la Web.
EL LENGUAJE C# Y LA PLATAFORMA .NETEn este primer captulo estudiaremos qu nos ofrece este nuevo lenguaje y por qu habra de interesarnos.
FUNDAMENTOS DEL LENGUAJE C#Conoceremos los conceptos fundamentales de este lenguaje, que sern tiles tanto para quienes den sus primeros pasos en la programacin como para quienes vengan de lenguajes como Visual Basic, C++ o Java.
CLASES Y OBJETOSEn este captulo estudiaremos la anatoma de la estructura de datos ms importante del lenguaje: la clase.
multidimensionales: cmo usarlos y los beneficios que ofrecen.
DELEGADOS Y EVENTOSLos delegados y los eventos son elementos muy utilizados en la programacin Windows. C# ofrece un mecanismo simple que cumple con este objetivo y que nos servir para muchsimos otros fines.
APLICACIONES CON WINDOWS.FORMSFinalmente, en este captulo nos sumergiremos en la creacin de aplicaciones de escritorio. Presentaremos los controles bsicos de la librera, y cules son sus mtodos y propiedades, que nos permitirn crear, desde cero, una aplicacin con interfaz de usuario.
ENCAPSULAMIENTO, HERENCIA Y POLIMORFISMOProfundizaremos en los conceptos de la programcin orientada a objetos, para luego conocer las particularidades de C#, como los mtodos virtuales y las clases abstractas.
Captulo 5COLECCIONESEl array es uno de los recursos ms poderosos que ofrece C#. Analizaremos aqu
ACCESO A DATOS EXTERNOSVeremos cmo acceder y emplear la informacin almacenada en archivos de texto y binarios, y tambin en bases de datos relacinales por medio de AD0.NET.
Captulo 9MANEJO DE EXCEPCIONESC# ofrece un sistema de manejo de excepciones muy completo, que nos permitir
diferentes tipos de arrays, de una dimensin y lidiar con estas situaciones imprevistas
6 u s r .c o d e
-
El libro de un vistazo
de un modo muy sencillo y efectivo. En este captulo descubriremos cmo sacar el mximo provecho de l.
: Captulo 10CARACTERISTICAS AVANZADAS DEL LENGUAJEConoceremos los aspectos avanzados con los que cuenta el lenguaje: boxing/unboxing, qu son y para qu se utilizan los atributos, qu es Reflection y cmo acceder a libreras creadas en otros lenguajes, entre otros temas.
Captulo 11SERVICIOS WEBSin dudas, los servicios web son uno de los aspectos de la plataforma que ms han crecido en popularidad en los ltimos tiempos. Veremos de qu trata esta tecnologa y cmo podremos utilizarla desde C#.
tulo 12SOCKETSEn este captulo, desarrollaremos la programacin de sockets, y podremos hacer que nuestra aplicacin se comunique con otra por medio de una red de datos.
: Captulo 13INTRODUCCIN A MANAGED DIRECTXRealizaremos una breve introduccin a Managed DirectX, una suma de clases para .NET que nos permitirn hacer uso de DirectX.
SUDOCUMENTACIN DE CDIGOConoceremos qu herramientas nos ofrece C# para llevar adelante esta ardua pero importante tarea.
LA NOTACIN HNGARAEn este apartado veremos los conceptos fundamentales de la notacin Hngara. Bsicamente, se trata de una convencin de nombramiento de variables y funciones muy utilizada en C++, que tiene una menor incidencia en lenguajes como C# y Java.
Apndice CUMLDescubriremos los fundamentos del lenguaje de modelado unificado, un sistema notacional destinado al modelado de aplicaciones que se basen en conceptos de la programacin orientada a objetos.
Q INFORMACIN COMPLEMENTARIA
A lo largo de este manual encontrar una serie de recuadros que le brindarn informacin com-
plementaria: curiosidades, trucos, ideas y consejos sobre los temas tratados.Cada recuadro est identificado con uno de los siguientes iconos;
u s r .c o d e 7
-
Q n W E B J E C J |.M E S': C ;p M
Aqu encontrar diferentes tutariates en video relacionados
con el libro. Slo deber hacer un clic en Ver Tutorial
para bajar el video a su PC. S ? e.
Una completa guia con sitios web, para acceder
a ms informacin y recursos tiles que
ie permitirn profundizar t sus conocimientos.
Las mejores aplicaciones y herramientas accesorias,
ejemplos y listados del libro para que no tenga que invertir su
tiempo en transcribirlos.
OnWeb. el sitio que le permitir aprovechar al mximo cada uno de nuestros libros, con contenido exclusivo: la mejor seleccin de software y los ejemplos analizados en e! texto, tutoriales en video y una completa guia de sitios de Internet. > Adems, un foro a travs del cual podr realizar interconsultas con otros lectores y usuarios, debatir con ellos y estar en contacto con la editorial. Como siempre. MP Ediciones, a la vanguardia en la divulgacin de la tecnologa
BIENVENIDO A LOS SERVICIOS EXCLUSIVOS DE 0N W E E-.Ingrese al sitio onweb.tectimes.com. La primera vez que acceda, deber registrarse con un nombre de usuario y una clave.Para completar el proceso de registro, se le har una pregunta P referida al libro y se le solicitarn sus datos personales.
0 N W E I . I E C 1 I M E S . C O M
-
Contenido
CONTENIDO
Sobre et autor 4Prlogo 5El libro de un vistazo 6Informacin complementaria 8Introduccin 14
EL LENGUAJE C#Y LA PLATAFORMA .NETOtro lenguaje nuevo? 16.NET 19
Elframevvork.NET 19
E J E i B E 0VtaMl
.1
Eipttcadon cwwr. t tefl*uaet (CIR/
; fWMMlk.Nn1
WMwt
El lenguaje C# 20Caractersticas fundamentales del lenguaje 21C# contra Visual Basic 6.0 21C# contra C++ 22CU contra Java 23
El entorno de desarrollo Visual Studio .NET 24
Nuestra primera aplicacin conVisualStudio.NET 28
Resumen 33Actividades 34
FUNDAMENTOS DEL LENGUAJE C#Sintaxis bsica del lenguaje 36
Espacios de nombres La sentencia using
Los comentarios Las variablesLas palabras reservadas de C# Ejemplos de identificadores Convenciones de nombramiento Tipos de datos fundamentales Asignar valor a una variable ConstantesConversiones de tipo de datos Operadores
Control del flujo de ejecucin Sentencias condicionales Sentencia de bucle
ResumenActividades
Captulo 3CLASES Y OBJETOS Qu es una clase Cmo declarar una clase
Modificadores de acceso Instanciacin Constantes de una clase
36373839404041424748 50 53 55 55 66
79
82828486
-
PROGRAMACION C*
Variables estticas Los mtodos
I[1JO
^identificador j
EstructurasResumenActividades
ENCAPSULAMIENTO, HERENCIA
109111112
Mtodos virtuales 145Interfaces 153Clases abstractas 154
Resumen 155Actividades 156
COLECCIONESArrays 158
Mtodos de la clase Array 164Arrays como parmetros de mtodos 166Valores predeterminados en un array 169 Inicializando elementos de arrays 171 Recorriendo arrays 172El modificador params 172
Arrays multidimensionales 173Inicializacin de un array de dos dimensiones 176
Arrays de arrays 176Indexadores 179Indexadores para acceder a arrays de dos dimensiones 184
Colecciones 185lEnumerable y lEnumerator 185
I m te i f a j innumerable
ntertar- - lEnumerator
Y POLIMORFISMO j CloscEnumcrabie 1 1 ClaseEmimeraooiHerencia 114 *------ -----------O Cuf
-
Contenido
DELEGADOS Y EVENTOSDelegados 196Qu es un delegado? 199El delegado es una clase 201
Eventos 201Invocar mltiples mtodos 204
void Ktodo2
i itiro t u * Bxeeptiool*
La clase System.Timers.Timer 207Caso de estudio 208
Resolucin 209Resumen 213Actividades 214
APLICACIONES CON WINDOWS.FORMSArquitectura de una aplicacin Windows 216
La clase Application 221Controles 222
Formularios 227Crear una aplicacin sencilla 229
Convencin de nombramiento para controles
Manipulacin de los controles bsicosCaso de estudio 1 Caso de estudio 2 Caso de estudio 3 Caso de estudio 4 Caso de estudio 5
Resumen Actividades
ACCESO A DATOS EXTERNOSArchivos
FileTipos de streams Manipulando archivos de texto Manipulando archivos binarios
Bases de datos SQLElementos de una base de datos relacional
------ ]r ----.NET Data Providct r
DUAdJpt-':
| Comando 5E1ECT |
| Coiwctioa | j | Comando INSERI j
Comrnar.d j ! | Coma* UMWl |
DataRcadr 1L _ -------- J i
j Ccmanoo DEtfTE j
i L
232
23423423924124625G253254
256256256257 260 263265
266
Un ejemplo sencillo Crear un DataSet mediante cdigo
Resumen Actividades
2692 7 9
281281
-
PROGRAMACION C*
MANEJO DE EXCEPCIONES Tratamiento de errores 284Encerrar las excepciones 286Clases de excepciones 287Generar excepciones 294
v i / r f :i J j .
W ix * un
> kr,:
- V . . .J/t* CU Mtill' IwwdruMonay.
, KiioaoiUnJi
Crear nuestras propias clasesde excepcinResumenActividades
296297298
Captulo 1$CARACTERISTICAS AVANZADAS DEL LENGUAJEBoxing/UnboxingAtributos
300301
Atributos predefinidos 305Consultar los atributos en tiempo de ejecucin 306
Reflection 307Ejecutar mtodos de tipos desconocidos 308
Acceso a otras libreras 311Punteros 312Resumen 315Actividades 316
SERVICIOS WEBQu son los servicios web?
Servicio de bsqueda de Google
Crear un servicio webResumenActividades
318318
s .
327331332
SOCKETSQu es un socket? 334Arquitectura de una aplicacinde sockets 334Dilogo entre un clientey un servidor 334Sincrnico vs. Asincrnico 335La clase Socket 335
Resumen 341Actividades 342
-
Introduccin
INTRODUCCION A MNAGED DIRECTXManaged DirectX 344Qu necesitamos? 344
El sistema de coordenadas 3D 345Antes de empezar 346Inicializar Direct3D 347
Dibujar objetos El mtodo ProcsVerts de la clase Renderer
Ejecutar la aplicacin Resumen Actividades
'Apndice A
DOCUMENTACION DE CDIGO Cmo documentar cdigo
Los tags disponibles Otras herramientas para crear
356
359360361362
364367
LA NOTACIN HNGARALa convencin Un tipo base Un prefijo Un calificador
Algunos ejemplos Ventajas y desventajas de la convencin
UMLIntroduccinDiagramas de casos de uso Diagramas de clases Diagramas de objetos Diagramas de secuencia
370370370 37!371
372
374374375375376
* de la e l* *rbeouewCoiiun vi
peticin! 10
p Mitn y - C
r* I rtiacior-di*, | * " * - c o m p o n
itutC-1: T tilu j
nombre MvtOl.brfi
U h k -12?
i w v W t .............. - prcpietok-
documentacin 368 Diagramas de estados 377........ Diagramas de colaboracin 378..
r# Diagramas de actividad 379Diagramas de componentes 380Extensiones a UML 381
tix&sszffCMM M Servicios al lector
Lenguajes .NET 382
ndice temtico 385
-
PROGRAMACIN C *
INTRODUCCINEste libro se encuentra dirigido, principalmente, al programador novato y de nivel medio, as como al estudiante o al aficionado autodidacto.Quienes estn dando sus primeros pasos en el mundo de la programacin no podrn dejar de sumergirse en los primeros dos captulos, donde se realiza una introduccin a la plataforma .NET y a la sintaxis bsica del lenguaje. Tambin ambos resultarn muy tiles para quienes provengan de otros lenguajes de programacin, ya que se evidencian las diferencias sustanciales que stos poseen respecto a C .
Si acaso a usted le atrae la programacin orientada a objetos y desea conocer sus conceptos fundamentales y cmo C# la soporta, los captulos 3 y 4 le sern de gran utilidad.Si, en cambio, desea crear aplicaciones de escritorio, no puede dejar de visitar el captulo 7, donde veremos cmo generar este tipo de programas haciendo uso de la gran diversidad de controles que la plataforma .NET nos ofrece. Pero claro, ninguna aplicacin es demasiado til si no puede interactuar con datos externos. En el captulo 8 veremos de qu trata ADO.NET y cmo nos facilita la tarea de trabajar con diversas fuentes de datos.
Y esto no termina aqu! C# y la plataforma .NET son tan verstiles, que nos permitirn publicar los servicios de una aplicacin en una red de un modo muy sencillo. En el captulo 11 veremos cmo generar servicios web, y en el captulo 12 aprenderemos a crear aplicaciones de red utilizando sockets.Desea crear aplicaciones grficas de alto desempeo? Acaso le interesa programar juegos? Entonces la librera Managed DirectX ser una gran aliada en su misin, y el captulo 13 ofrece una introduccin a sus principales caractersticas.
Y como si todo esto fuera poco, en los apndices encontrar cmo crear documentacin a partir del cdigo escrito en G?, de que trata la notacin de nombramiento Hngara, un listado de lenguajes .NET que podr encontrar en la Red -son ms de cincuenta!- y, por ltimo, una introduccin al lenguaje unificado de modelado (UMLj. No es exagerado enunciar que C# y la plataforma .NET son el sueo de todo programador. Si acaso duda de mi palabra, qu espera para comprobarlo!
Ing. Diego G. Ruizni izciieept^ 'gmai .coir.
-
Captulo 1PROGRAMACIN C#
El lenguaje C# y la plataforma.NETEn este prim er captulo estudiaremos
qu nos ofrece este nuevo lenguaje
y por qu habra de interesarnos.
Realizarem os una comparacin
con lenguajes sim ilares y analizarem os
cul es la arquitectura de la plataform a
sobre la que esta construido.
Otro lenguaje nuevo? 16.NET 19
El framework .NET 19El lenguaje CU 20
Caracterstica: fundamentalesdel lenguaje 21CS contra Visual Easic 6.0 21CS contra C++ 22CS contra Java 23
El entorno de desarrolleVisual SturiiG .NET 24
Nuestra primera aplicacincon Visual Studio .NET 2?
Resumen 32Actividades 34
- PROGRAMACIN C
-
Otro lenguaje nuevo-?
Classes, un grupo de clases que encapsulan el API de Win32 y agregan algunas funcionalidades para facilitar la creacin de aplicaciones). Disear formularios con MFC es una tarea poco grata; muchas de las propiedades de los controles de esta librera debern ser fijadas en tiempo de ejecucin, lo que aumentar la can- tidad de cdigo que deber poseer nuestra aplicacin.
Delphi y C++ Buiider: basados en el lenguaje de programacin Pascal y C++. respectivamente, y ambos haciendo uso de una librera llamada VCL (Visual ComponnU Library), permiten la creacin de formularios complejos de una manera bastante sencilla, y poseen la capacidad de fijar casi la totalidad de las propiedades necesarias en tiempo de diseo y con base en dos de los lenguajes ms exitosos de todos los tiempos.
7/rl ** vm* vtw paJc- Pjr. SKI-. H* 'Manr J.! : * G C\i' j * 4? W r X , i er.i tl C I At>J * W5ke: > Ino**./.. J
y: 5 ~ - ; T 'i' * AfST *; j>l R f *5 ^ > **r
r j:-i : r- . r.* ;Jjee'* J'-i*::!* fSU'xri: , .
vt-W. tu 1 rv< ,1.:
, ;|1MN(*Jl.aI,Kfl*!*:, KHL'.IH.T TI'H! IHClOi
:*i\ fw*. i* . :> HKOJll WHEIHOtf! i i *.- v h H v . v .
. HKMU11 f K.r:HOf v k rwiv ''r.iifi riAjr, Hfit'jlT $7'Hf :>nxJiM i ., v r f .r 'i i^ . " x. v . , HRt-iKT'.TJn 1.tw jiwl h/lw /
V
Figura i . El entorno ele programacin Borland C++ Buiider 6.0.
| 2 | ONWEB.TECTIMES.COM
En el sitio onweb.tectimes.com encontrar contenido adicional vinculado a los temas tratados en este manual, incluyendo el cdigo fuente de los ejemplos que se desarrollarn en este libro, listo bajar y probar, as como una completa guia de sitios web recomendados.
17
-
PROGRAMACIN C*
Pero no todo es color de rosa para estos entornos. Las aplicaciones son cada da ms complejas y los programadores requieren, cada vez en mayor medida, un buen soporte a la colaboracin entre componentes. Sera deseable poder emplear desde Delphi una librera C++ ya existente, de una manera sencilla, sin tener que estar utilizando herramientas de conversin.
En el caso de C++ Builder, hasta existen inconvenientes para acceder a libreras creadas en Visual C++ debido a que utilizan formatos de libreras distintos (OMF en el caso de C++ Builder y COFF en el caso de Visual C++), y esto es malo dado que Visual C++ es el entorno ms popular (por lejos) para la creacin de libreras para Windows, y muchsimos recursos que podemos encontrar en la Red fueron creados con este entorno.
Si deseamos, por ejemplo, crear una aplicacin que utilice DirectX desde C++ Builder, tendremos que buscar en la Red las libreras .LIB correspondientes en formato OMF (existe una herramienta provista por el entorno para la conversin de formato COFF a OMF, pero la importacin de libreras complejas, como lo es DirectX, no es para nada trivial).
Finalmente, en los ltimos aos ha surgido una gran variedad de plataformas mviles muy poderosas: PDAs, telfonos celulares, Tablet PCs, etc. Estos dispositivos no son compatibles con binarios creados para microprocesadores Intel x86, ya que poseen su propia familia de microprocesadores con su propio paquete de herramientas para la construccin de aplicaciones nativas.
Ni Delphi ni C++ Builder se encuentran presentes en otras plataformas ms all de Windows (y Linux, si tomamos en consideracin a Kylix, que es un entorno de desarrollo creado por Borland, muy similar a Delphi y a C++Builder). Visual Basic y Visual C.++ se hallan en versiones especiales para algunos dispositivos mviles, pero el subconjunto de funciones del API de Win32 que estn en dichos dispositivos hace que la migracin de una aplicacin de una plataforma se convierta en una tarea bastante engorrosa.
Q BORLAND KYLIX
Kylix es un entorno de programacin para sistemas Linux muy similar a Delphi y a C++ Builder. Con l es posible crear aplicaciones con ventanas y controles (botones, cuadros de texto, cuadros de lista, etc.) y compilar en Windows y en Linux. Ms info: www.borland.com/kylix.
-
.NE7
.NET
.NET es un conjunto de tecnologas construidas a partir de una estrategia de M icrosoft para la cual ha destinado gran parte de su presupuesto de investigacin. Esta estrategia surge: a su vez, del nuevo mapa de necesidades y requerimientos que Microsoft advirti que se suscitaran en el futuro.
.NET son aplicaciones de servidor (SQL Server 2000, Exchange 2000, etc.), es un entorno de desarrollo (Visual Studio .NET), son componentes clave que se integran al sistema operativo, son servicios, y es, finalmente, una plataforma de desarrollo denominada firamework .NET.
E! framework .NETEs una infraestructura de desarrollo que est compuesta por diversos recursos, entre los cuales se destaca el ms importante, que es una mquina virtual conocida como CLR (Common Language Runtime), sobre la cual se ejecutan las aplicaciones. De este modo, nuestros programas ya no poseern cdigo nativo de ningn micro- procesador en particular, sino instrucciones M SIL (Microsoft Intermedate Langua- ge) que sern traducidas a cdigo nativo en el momento de su ejecucin (por medio de un compilador Jiist ln Time).
El framework tambin define una librera base de clases, BCL (Base Ciass Libranj, a la cual puede acceder cualquier desde lenguaje desarrollado para la plataforma.
Por encima de la infraestructura se ubicar un conjunto de reglas bsicas que debe implementar un lenguaje para poder ser parte de la familia .NET. Esta especificacin es conocida como CLS (Common Language Specificeation).
Finalmente, se encuentra el conjunto de lenguajes que cumplan con la especificacin CLS. como el C#, el VB.NET, Managed C++, etc.
.NET FRAMEWORK SDK
El desarrollo del framework .NET no se detiene. Actualmente la versin 2.0 se encuentra en etapa beta. Es posible acceder a ms informacin acerca de esta nueva versin en el sitio oficial: http://msdn.microsoft.com/netframework.
-
PROGRAMACIN CU
Es posible crear recursos en cualquiera de estos lenguajes que hagan uso de recursos escritos en otros; de hecho, es posible crear una clase en C# que herede de una clase creada en Managed C++.
c# C++I
VB.NET | JScript
Especificacin comn de lenguaje (CU?)
VisualStudio.NET
Framework.NET
Windows
Figura 2. Arquitectura de la infraestructura de desarrollo.
EL LENGUAJE C#CJ es un lenguaje que cumple con la especificacin CLS. El cdigo que crearemos con l ser traducido a instrucciones M SIL para entonces ser traducido, justo antes de su ejecucin, a instrucciones nativas que correspondan a la plataforma concreta sobre la cual estemos trabajando.
Cabe destacar que el compilador J1T (Just In Time) traduce el cdigo M SIL a cdigo nativo no de manera monoltica, sino por mtodos, mdulos y componentes. Por io tanto, a grandes rasgos: cdigo que no sea ejecutado no ser compilado.
El cdigo M SIL generado a partir de la compilacin de cdigo C# es idntico al cdigo M SIL generado a partir de cualquier otro lenguaje CLS. Esto podra abrir el interrogante de por qu programar en C# en lugar de hacerlo en VB.NET o en Managed C++ o, incluso, en Delphi .NET? Esta pregunta podra responderse con otra: por qu programar en C++ en lugar de hacerlo en C o Pascal, o en cualquier otro lenguaje compilado, si todos generan el mismo cdigo Intel x86?
-
El lenguaje Cti
Cada lenguaje posee sus caractersticas que lo tornan ideal para ciertos usos; adems, presenta diversos grados de expresividad que pueden permitir implementar el mismo algoritmo de maneras diversas, por lo que un modo puede resultar ms eficiente que otro.
Caractersticas fundamentales del lenguajeC# es un lenguaje moderno y altamente expresivo que se ajusta al paradigma de programacin orientada a objetos. Su sintaxis es similar a C++ y Java. Ei lenguaje fue desarrollado en gran parte por Anders Hejlsbcrg (creador del mtico compilador Turbo Pascal1 y uno de los diseadores lder del lenguaje de programacin Delphi).
En C# no existe el concepto de funcin global o variable fuera de una clase u objeto. Por su buen apego a la POO, es posible sobrecargar mtodos y operadores. Soporta definicin de interfaces. Ninguna clase puede poseer ms de un padre (no se permite la herencia mltiple), pero s puede suscribir un contrato con diversas interfaces. Soporta la definicin de estructuras, pero, a diferencia de C++, aqu no son tan parecidas a las clases y poseen ciertas restricciones que veremos luego.Permite adems la declaracin de propiedades, eventos y atributos (que son construcciones declarativas).Por ltimo, una caracterstica distintiva cada vez ms presente en lenguajes modernos es la gestin automtica de memoria y el uso de referencias en lugar de punteros. Gracias a esta gestin automtica de memoria ya no tendremos que preocuparnos por la existencia de memory leaks (zonas de memoria que permanecen reservadas pero ya no son utilizadas debido a errores de programacin).
A continuacin realizaremos una breve comparacin de C# con los lenguajes ms populares del momento:
C# contra Visual Basic 6.0Si usted es un programador Visual Basic y est evaluando moverse a C#, no lo dude un segundo. Existen muchsimas razones para tomar esta decisin, y aqu expondremos algunas de ellas. En primer lugar, uno de los motivos por los cuales Visual Basic era atractivo era su productividad. S, a pesar de algunos de sus inconvenientes para crear aplicaciones sencillas, no exista mejor solucin que Visual Basic; ningn
1 No confundir con el autor del lenguaje Pascal, que fue Niklaus Wirth. Anders Hejlsberg fue el creador de un compilador llamado Turbo Pascar, que fue muy popular en sus tiempos por su velocidad y bajo costo.
-
PROGRAMACIN CS
otro leneuaje poda competir en velocidad de desarrollo con l. Pues bien, C# le ba quitado la corona; la misma aplicacin que usted puede realizar en Visual Basic podr crearla en C# en, al menos, el mismo tiempo, e incluso ms rpidamente. Por otro lado, gracias a las nuevas caractersticas del lenguaje, el diseo de sus aplicaciones podr ser ms elegante y simple, y de este modo podr manejar la complejidad de una manera ms natural.
En segundo lugar, seamos sinceros: los programadores Visual Basic nunca fueron vistos como programadores reales, aunque muchsimos profesionales sufran de esta etiqueta de manera injusta. Los sueldos de un programador Visual Basic son mucho ms bajos que los de un programador C++ o Java. C#, en cambio, es visto como un lenguaje ms profesional. Claro que sre es un punro un tanto controvertido, y podramos discutir las razones del porqu de esta situacin, pero, dejando excepciones a un lado, es una realidad de mercado.
Por ltimo, el pasaje de Visual Basic 6.0 a C# hasta podra ser considerado lgico para quien sea un dominador del VB; es como comprarse un automvil ms lujoso o mudarse a una casa ms grande: es el paso evolutivo natural.
Probablemente, lo que usted estar preguntndose respecto al pasaje de Visual Basic 6.0 a C# es el natural para qu existe Visual Basic .NET? Bueno, tai vez Visual Basic .NET nunca debi haber existido: es demasiado distinto de Visual Basic 6.0 para ser considerado una nueva versin del lenguaje y, a fin de cuentas, sigue siendo Basic. Tal vez la pregunta que podramos hacernos sera: si es que vamos a tener que aprender un lenguaje nuevo, por qu no aprender el mejor y ms popular lenguaje de la plataforma?
C# contra C++Admito que C++ es mi lenguaje preferido; trabaj durante muchos aos con l c, incluso, escrib un libro de C++ (C++ Programacin Orientada a Objetos, de esta misma editorial), pero prob C# y fue como probar ambrosa.
Q VISUAL BASIC .NET VS. C
En el enlace de referencia es posible encontrar una comparativa entre Visual Basic .NET y C# escrita por Mario Flix Guerrero.Enlace: www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/MTJ_2128.asp,
-
El lenguaje Cf?
Hoy da, en mi trabajo diario, complemento de manera natural ambos lenguajes; no fue difcil ingresar en el mundo C# desde C++. Lo que debo admitir es que luego de estar das trabajando con C#, volver a C++ es un cambio un tanto abrupto, y me descubro preguntando una y otra vez por qu no se encontrar disponible tal o cual caracterstica de C# en C++.
Los detractores de C++ lo acusan de ser un lenguaje hbrido, un C con clases, como muchas veces es definido. El problema de esta falta de decisin en cuanto al diseo del lenguaje es que permite que convivan clases con funciones y variables globales, lo cual podra ser tentador para el programador y podra empobrecer el diseo de una aplicacin construida de este modo. Claro que, por otro lado, hay quienes gustan de ver el vaso medio lleno y sostienen que esta caracterstica de hibridez' es positiva, pues deja al programador la posibilidad de tomar lo mejor de los dos mundos.
C# es, en alguna medida, una evolucin de C++, ya que toma prestada su sintaxis y mejora muchos de sus aspectos, como el hecho de poseer una librera de clases unificada y ser un lenguaje orientado a objetos puro (adis hibridez). Esto no quiere decir que lo reemplace en todos sus usos, claro. C++ seguir teniendo su segmento de utilizacin en donde es ideal, pero C# invade da tras da reas donde antes C++ era nico conquistador.
C# contra JavaMuchos sostienen que C# es una copia de Java. Si tomamos ciertos trozos de cdigo (convenientemente) escritos en alguno de estos lenguajes, podra ser imposible determinar si es C# o es Java.
Lo cierto es que parte de la filosofa empleada por ambos lenguajes es la misma. Ambos se ejecutan sobre una mquina virtual, y esta caracterstica los convierte en lenguajes potencialmente multiplatabrma; ambos poseen especificaciones de subconjuntos de recursos de lenguaje para implemenraciones en diversos dispositivos (por ejemplo, mviles), y ambos tienen una librera de clases con muchas caractersticas en comn.
Q SIMILITUDES ENTRE C#. C++ Y JAVA
En el enlace de referencia podrn encontrar una breve comparativa entre estos lenguajes. Enlace: www.microsoft.com/spanish/MSDN/estudiantes/desarrollo/lenguajes/c-sharp.asp.
-
PROGRAMACIN Cfl
Sin embargo, C# presenta la ventaja de integrarse mejor con aplicaciones nativas de la plataforma sobre la cual estemos trabajando. Claro que, si accedemos a recursos nativos, perder la caracterstica de ser multiplataforma, pero esta caracterstica no siempre es deseada. Podramos tener la necesidad de invocar mtodos de libreras nativas creadas en C++ para Windows de una manera sencilla y eficiente.
Luego podramos discutir en muchos puntos cul es mejor que cul; en la Red, los foros de discusin sobre programacin se encuentran plagados de peleas de este tipo. La realidad es que hoy da C# es ms fuerte en plataformas basadas en Windows. mientras que Java es ms fuerte en una gran diversidad de plataformas menos populares (celulares, tarjetas inteligentes, etc.) y es el candidato ideal si hoy desea construir una aplicacin que deba ejecutarse sin cambios en Linux y Windows, aunque esta realidad se encuentre prxima a cambiar.
EL ENTORNO DE DESARROLLO VISUAL STUDIO .NET
En el desarrollo de este libro trabajaremos con Visual Studio .NET 2003, que es la ltima versin de produccin del entorno en el momento de escribir estas lneas. Existe una versin 2005 Express en estado beta que tambin podra utilizar el lector.
Por otro lado, el libro se basa principalmente en la versin 1.1 del framework, que tambin es la ltima versin de produccin a la fecha de publicacin de esta obra. Quienes no posean el entorno Microsoft Visual Studio pueden utilizar Mono en ambientes Windows. GNU/Linux y Mac Os X.
El entorno Visual Studio .NET 2003 es una excelente herramienta de desarrollo. Con ella podremos crear soluciones que, a su vez, podrn contener uno o ms proyectos de diversos lenguajes en funcin de los paquetes que tengamos instalados; en
M VISUAL STUDI 2005 EDtdN EXPRESS
Es posible descargar la versin beta de este entorno desde http://msdn.microsoft.com/vs2005 Seguramente, en el transcurso del ao, el entorno saldr en su versin definitiva y ya no ser posible descargar la versin beta de manera gratuita. De todos modos, Microsoft planea ofrecer las versiones express del entorno de desarrollo a un costo alcanzable por cualquier desarrollador.
-
El entorno de desarrollo Visual Studio .NET
principio dispondremos de C J , Visual Basic .NET y C++. Tambin es posible crear aplicaciones C# utilizando el framework .NET SDK, que es un conjunto de herramientas que nos permiten compilar cdigo fuente C# para crear aplicaciones. V isual Studio .NET hace uso del framework .NET SDK y funciona como front end para evitar que nosotros tengamos que interactuar con herramientas en comando de lnea. El framework .NET SDK puede ser descargado desde el siguiente enlace: http://msdn.microsoft.com/netframework.
Sin embargo. Visual Studio .NET es mucho ms que un simple front end. Algunas de las tareas que podremos realizar con l son las siguientes:
Navegar fcilmente por las clases por medio del visor de clases. Navegar por los archivos de nuesrros proyectos por medio del explorador de so
luciones. Entender ms rpidamente el cdigo escrito gracias a que el editor colorea las pa
labras reservadas y los tipos de datos conocidos. Organizar mltiples proyectos y editar fcilmente sus propiedades. Configurar el entorno para que ejecute herramientas externas (como precompi-
ladores). Depurar nuestros proyectos fcilmente y consultar valores de objetos de modo in
teractivo, as como realizar depuraciones remotas desde otras computadoras. Acceder a facilidades de bsqueda y reemplazo por hoja de cdigo fuente activo y
en archivos. Editar recursos (bitmaps, iconos, archivos binarios, etc.) por medio de herramien
tas integradas, y navegar por ellos por medio del visor de recursos. Agregar tareas por realizar haciendo uso de la lista de tareas pendientes, que ade
ms inserta automticamente tareas a partir de comentarios prefijados. Generar documentacin en formato HTML por medio de una herramienta pro
vista con el entorno. Esta documentacin es generada a partir del cdigo fuente y comentarios con formatos especficos que escribiremos en l.
Colapsar y expandir trozos de cdigo para mejorar la legibilidad de nuestras fuentes. Posibilidad de integrar herramientas al entorno por medio de un sistema de plug-ins.
[ j | j QU ES MONO'/
Desde el ao 2001, la empresa Ximian (adquirida luego por Novell) comenz a desarrollar el proyecto Mono, que es una plataforma de desarrollo Open Source basada en el framework .NET. Con Mono es posible escribir aplicaciones en C# (o VB.NET) y ejecutarlas no slo en Windows, sino tambin en GNU/Linux y Mac Os X. Se puede descargar desde www.mono-project.com.
i
r .c o d e
-
PROGRAMACIN Cg
Haciendo uso de entorno de programacin Visual Studio .NET crearemos proyectos. Un proyecto contendr, bsicamente, hojas de cdigo fuente en C# (luego veremos que tambin podr contener otros recursos).
Figura 3. Organizacin de un proyecte.
Un proyecto posee ciertas propiedades, las cuales indican de qu manera debern compilarse las fuentes y los recursos que incluye. La idea de ' proyecto' como organizacin de fuentes se encuentra muy extendida, y casi todo entorno de programacin la maneja. Usualmente, un proyecto construido tendr como salida una aplicacin ejecutable (archivo .EXE) o una librera (archivo .DLL). Sin embargo, es posible (y, de hecho, muy comn) que el sistema en el cual estemos trabajando se encuentre integrado por ms de un componente; por ejemplo, una aplicacin y una librera de enlace dinmico que sea utilizada por la aplicacin. En este caso, no es slo un proyecto el que deberemos crear, sino dos.
Ahora bien, si necesitramos crear dos proyectos siendo uno dependiente del otro, qu deberamos hacerr Podramos crear un proyecto en una instancia de Visual Studio y otro proyecto en otra instancia, pero sta no es una muy buena idea, ya
[ Q ] QU ES UNA DLL?
Una DLL (Dynamic Link Library\ es un conjunto de funciones y/o clases que pueden ser accedidas y utilizadas por otros programas en tiempo de ejecucin. Estas libreras pueden ser creadas desde C# o desde otros lenguajes.
i K r . r n r i p
-
El entorno de desarrollo Visual Studic .NFI
que si modificamos la librera y nos olvidamos de reconstruirla, nuestra aplicacin seguir utilizando una versin vieja de sta.
Afortunadamente, Visual Studio .NET soporta ms de un proyecto abierto de manera simultnea en el mismo espacio de trabajo. Estos proyectos pueden relacionarse entre s por medio de dependencias; de modo que si reconstruimos la aplicacin., el entorno automticamente reconstruir todos los proyectos dependientes que se hayan modificado (por ejemplo, la librera).
Visual Studio denomina solucin a esta agrupacin de proyectos (aunque en ediciones anteriores del entorno se las llamaba espacios de trabajo). Todo proyecto debe estar contenido en una solucin; por lo tanto, cuando creamos un proyecto nuevo. Visual Studio nos crea automticamente una solucin que lo contiene.
i ii iY Y
Figura 4. Organizacin de una solucin.
Luego, cuando construimos la solucin se construyen todos los proyectos (que pueden estar relacionados directamente o no), es decir que se procesan todos los elementos de cada proyecto para generar los archivos de salida que correspondan.
u s r .c o d e 27
-
PIRAMACiUN C#
Proceso de Compilacin
(csc.exe)
archivos3.cs
archivosl.cs
archivos2.cs
i - -
i i i
r -i
iii
J .iii
- programa.exe
nuestro programa
Figura 5. Compilacin de un proyecto.
Nuestra primera aplicacin con Visual Studio ,NE1Pero veamos cmo crear nuestra primera aplicacin C# con l. En primer lugar, cabe destacar que el entorno es sumamente configuradle y que la organizacin de los paneles, as como la pantalla de inicio, puede variar en funcin de cmo la configuremos. Si es la primera vez que ejecuta la aplicacin o si no ha modificado las opciones de inicio predeterminadas, debera encontrarse con la pgina de inicio que se muestra en la siguiente figura:
Start Pag** j
E s a a g i E s g r i1
Verify that thc
Profijr:
followino settincii sre personaliied fsr you
: Vituf C 4+ Dvelowr
1 };fit 'Visu4!C++;
v-'tfiiov- Uv : 'lu.'ii Studi Dful!j s*: ffl. i i Visual C++Show Help: Irteti! iiclr C z m i r t
At Startup: Show Gfivironn-iefd j
Figura 6. La pgina de inicio.
v '.c o d e
-
El entorno de desarrollo Visual Studio .NE1
En lo personal, me desagrada bastante dicha pgina, por lo que lo primero que hago es fijar las opciones como indica precisamente la figura mencionada, es decir:
Profile: Visual C++ Developer At Startup: Show empty enviroment
Cambiar el perfil permite que se modifique la ubicacin predeterminada de los paneles en donde se encuentran las herramientas (como el visor de clases, el explorador de soluciones, etc.). En lo personal, me be acostumbrado a tener el panel de visor de clases a la izquierda, como estaba en el viejo y querido Visual C++ 6.0, pero cada quien podr hacei lo que le plazca, ya que esta configuracin no nos impedir modificar ni crear ningn tipo de proyecto u opcin en particular.
Fijar el inicio de aplicacin en Show empty enviroment (Mostrar un entorno vacoj tambin es una cuestin de gustos, y lo que especifica es que cada vez que iniciemos la aplicacin veremos lo que muestra la siguiente figura:
Figura 7. Visual Studio, comenzando con el entorno vaco.
Bueno, ahora s. vayamos a la accin. Teniendo el entorno ya abierto, lo primero que deberemos hacer ser Crear un nuevo proyecto. Si estamos en la Pgina de Inicio , deberemos seleccionar la pestaa Projects, y iuego, presionar el botn New Proyect que se encuentra en el extremo inferior de la pgina. Si estamos en un enromo vaco, deberemos acceder al ment File, desde all seleccionar New y, finalmente, la opcin Project. Hecho esto, deber aparecer la ventana de la Guia Visual 1.
.c o d e 2 9
-
PHOGRAMACION C*
Nuevo proyecto GUA VISUAL 1
New Project
Project Types:
'-i ,3&k~ 1
C j | Visual C # Project:- D Visual C++Pro)ects
! Setup and Deployment Project: _ i Othei Project:[ _ j Visual StufoSoM ions
: ConsofcAppkcation!
Im p fe te s :
j . A project for creating a command-line applicatioo
ame:
location:
0ASF.NET Web ASP.NET Web Control
Service M cbileW ... Library
P i j i ' Consol Windows Enipty Proiecl
Application Service
L Project will be created at E:\useis\diego\kbro C5\codl-apS\ConsoleApplicattonl.
T H cre | I o I Canee! Help
O Tipos de proyectos disponibles 6 Lista de plantillas de proyectos Nombre del proyecto O Ubicacin de la carpeta del proyecto
Seleccionaremos siempre que el tipo de proyecto sea Visual CU Projects, luego especificaremos la plantilla del tipo de proyecto que deseemos crear. Lo que hace la plantilla del proyecto es fijar opciones predeterminadas al modo de compilacin de nuestro proyecto, que finalmente especificar los parmetros que se enviarn al compilador C# cuando construyamos el proyecto para generar un archivo ejecutable (con instrucciones MSIL).Para comenzar con algo sencillo, seleccionaremos la plantilla Aplicacin de consola (en ingls. Consol Application), modificaremos el nombre del proyecto y su ubicacin, si es que no nos gustan las opciones que nos sugiere el entorno, y finalmente presionaremos el botn OK.
Hecho esto, el entorno crear un proyecto C# que poseer dos archivos del tipo .CS (por C#, que se pronuncia C Sharp y usualmente se abrevia CS). Los .CS son archivos con cdigo fuente C#; no sern distribuidos con nuestra aplicacin, solamente los utilizaremos para crearla.Si por medio del explorador de soluciones miramos los nombres de los archivos que componen nuestro proyecto, veremos estos dos archivos .CS, que se llaman:
3 0 a s r .c o d e
-
El entorno de aesarroiio Visual Studi; .NE'I
Assenxlyinfo.cs
Classl.cs
Assemblylnfo: posee informacin de nuestra aplicacin (nombre del producto, versin, empresa, etc.). Este recurso compilado es situado dentro de nuestra aplicacin y se conoce como assembly. Luego explicaremos en detalle qu es un assembly.
* Ciassl: archivo de cdigo fuente que posee la nica clase de la aplicacin y el punto de entrada al programa.
No importa lo que est escrito en dicho archivo, nosotros cambiaremos el programa y escribiremos lo siguiente:
class Clasel
{static void Main(string[] args)
{System.Consol.Write("Nuestro primer programa");
}}
Analicemos el cdigo anterior. En primer lugar vemos la palabra class seguida de un identificador de clase (en este caso, Clasel); luego existe un bloque de cdigo encerrado entre llaves.
Quienes tengan algunos mnimos conocimientos de lenguaje C o C++ sabrn que en todo programa debe existir una funcin llamada main, que hace de punto de entrada al programa, es decir, que es la funcin que debe ejecutarse para iniciar la aplicacin.
Habamos mencionado que en C# todo programa debe estar compuesto de clases, es decir, que no pueden existir funciones globales. Por lo tanto, al menos una clase deber poseer un mtodo llamado Main (esta vez con la M* en mayscula), que adems deber ser esttico (luego veremos qu significa esto).
Dentro del mtodo Main se encontrar el cdigo que ser ejecutado cuando nuestro programa sea inicializado. En nuestro caso, dicho cdigo ser solamente:
System.Consol.WriteLine("Nuestro primer programa*);
u s r .c o d e 31
-
PROGRAMACIN GS
WriteLine es un mtodo de la clase Consol que escribe un texto en la salida estndar. Dicho texto se especifica entre comillas (comillas dobles).
Bien!, ahora podremos compilar nuestro programa ingresando en el men Build, opcin Build Solution.
Si hacemos esto, podremos ver que en el panel llamado Output (salida) se observa el progreso de la construccin de nuestra aplicacin. Si existe algn error, tambin se mostrar all como informacin, y podremos hacer doble clic sobre i para que ei entorno nos lleve automticamente a la lnea donde se encontr la falla.
- Build started: Project: consoleApplicationl, Configuration:
Debug .NET ---
Preparing resources...
pdating references...
Perfonning main compilation...
Build complete - 0 errors, 0 warnings
Building satellite as3eniblies...
----------- Done -----------
Build: 1 succeeded, 0 failed, 0 skipped
Si hemos ripeado todo bien, deberemos ver lo que indica ei cuadro anterior, es decir, a notificacin de que la aplicacin ha sido construida satisfactoriamente.
Luego, podremos ingresar nuevamente en el men Build y seleccionar la opcin Start (comienzo) o Start without debuggina (comienzo sin depurar). Lo bueno de esta ltima opcin es que no cierra la ventana donde est nuestro programa cuando ste termina, sino que nos solicita que ingresemos una tecla para continuar.
i
Figura 8. Nuestro primer programa C#.
3 . : .c o d e
-
El entorno de desarrollo Visual Studio .NE'f
Claro que si no tenemos Visual Studio a mano, pero hemos instalado el framework .NET, podremos realizar la compilacin de modo manual (o para expresarnos me- jor: utilizando el compilador desde comando de lnea). Al fin y al cabo, habamos comentado que Visual Studio, entre muchas otras cosas, es un front end al compilador C# (y otros compiladores y herramientas). El compilador de C# es una aplicacin llamada csc.exe, que se encuentra en ei directorio de Windows, dentro de la carpeta Microsoft.NET/Framework, y all, dentro de la versin del framework que tengamos instalado (por ejemplo, vl.1 .4322).
Teniendo un archivo llamado, por ejemplo, programa.es, podremos realizar una compilacin en comando de lnea escribiendo:
esc programa.es
Esto nos dejar como salida, en el directorio donde nos encontremos y si no hubo errores en la compilacin, un archivo llamado programa.exe. Si ejecuta la aplicacin csc.exe con el parmetro /?, se listarn los switchs vlidos del compilador.
RESUMEN
Est bien, nuestra primera aplicacin no ha sido muy excitante, pero al menos hemos dado el primer paso y eso no es poco. Tambin es cierto que algunas cuestiones han quedado sin mucha explicacin: qu es una clase?, qu es un mtodo esttico?, qu es System? No nos desesperemos; a medida que avancemos en el libro, iremos tratando todos estos temas de manera detallada. Ya hemos visto el conejo blanco, ahora slo deberemos seguirlo.
.c o d e 33
-
PKOGRAMAWf
Q ACTIVIDADES
TEST DE AUTOEVALUACIN
1 Qu caractersticas diferencian al lengua- 3 Qu es la BCL y para que se utiliza? je C# de C++?
A Qu es elCLR?
Q S E E i !tjrufcnKft m w. o
(*:
fnme**yc . |
5 En qu plataformas se pueden ejecutar los programas creados en C#?
6 Es posible compilar un programa C# sin hacer uso del Visual Studio .NET?
2 Qu es el cdigo MSIL?
34 u s r .c o d e
-
PROGRAMACIN C# Captulo
Fundamentos de lenguaje CUEn el captulo anterior presentamos
la plataforma y el lenguaje que
tratarem os en esle libre. Ahora
nos sum ergirem os en los conceptos
fundam entales de C#, lo que ser
provechoso tanto para quienes der,
sus primeros pasos en la programacin sintaxis bsica del lenguaje 36Espacios de nombres 36
come para quienes vengan de lenguajes La sentencia using 37Los comentarios 38
como Visual Basic. C+ + o Java. tas,lrllblK 35Las palabras reservadas de C# 40Ejemplos de dentiticadorcs 40Convenciones de nombramiento 41Tipos de dalos fundamentales 4?Asignar valoi a una variable 47Constantes 46Conversiones de tipo de datos 50O peradores 53
Control del flujo de ejecucin 55Sentencias condicionales 55Sentencia de bucle 66
Resumen 79SERVICIO DE ATENCION AL LECTOR: [email protected] Actividades 80
-
PROGRAMACIN C#
SINTAXIS BSICA DEL LENGUAJE
En C# un programa es una coleccin de clases, acu no se permitirn funciones ni variables globales como en el caso de C++. C# es un lenguaje orientado a objetos que pretende ser fiel a sus conceptos, y por medio del framework .NET ofrece una librera de clases que nos sern de gran utilidad cuando construyamos aplicaciones.
Esta librera de clases, que mencionamos en el captulo anterior, se llama BCL (Base ClassLibrary), y se podra decir que es el sueo de todo programador, ya que ofrece una gran variedad de funcionalidades que iremos estudiando en el desarrollo del libro.
Por el momento, de esta librera diremos que se encuentra organizada por espacios de nombres (en ingls, namespaces).
ESPACIOS DE NOMBRES
Los espacios de nombres son un recurso que utilizan algunos lenguajes para la organizacin de un gran conjunto de tipos de datos. As como los directorios (o carpetas) permiten organizar archivos de modo que ficheros del mismo nombre convivan en directorios distintos, los espacios de nombres realizan una tarea similar, pero de manera lgica, para tipos de datos extendidos como clases y estructuras.
De este modo, dos clases distintas con el mismo nombre podran ser utilizadas en el mismo proyecto sin que se suscite ningn error.Los espacios de nombres tambin pueden ser anidados, por lo que puede haber unos dentro de otros y, de este modo, mejorar la organizacin de las libreras de un proyecto.
Gracias a esta facilidad, los nombres de los tipos de datos que nosotros crearemos en el futuro podrn ser de lo ms sencillos, sin temor a que ya exista alguna clase o estructura de nombre igual en otra librera que luego podremos querer utilizar.
U I NOMBRAMIENTO DE FUNCIONES EN LENGUAJE C
El lenguaje C no posee esta facilidad (aunque s el C++), por lo tanto es normal que una librera deba componer los nombres de las funciones que define, anteponiendo un prefijo -usualmente, una abreviacin del nombre de la librera- a cada una de ellas para evitar conflictos con otros paquetes (por ejemplo, todas las funciones de la librera SDL comienzan con SDLJ.
36 u s ! .c o d e
-
Espacios de nombres
Veamos cules son los espacios de nombres ms populares que posee la librera BCL:
1 - ESPAaOS.OENCMBRESClase base de toda la librera.
[. System, Collecticns Clases e Interfaces que definen colecciones de objetos comolistas, colas y diccionarios. java.util
System.Data Acceso a datos multiproveedor. java.sqlj System.Drawing Provee acceso a funcionalidades grficas de GDI+. java.awt
System. 10 Manejo de entrada y salida a archivos y flujos. java.ioSystem.Net Manejo de comunicacin va red por medio de una gran
variedad de protocolos. java.netSystem.Reflection Provee acceso a informacin de clases cargadas, por lo que se
pueden crear e invocar tipos de modo dinmico. java.lang.reflect System.ext Ofrece recursos para la manipulacin de texto en distintas
codificaciones. java.textSystem.Threading Provee recursos para la programacin de aplicaciones multihilo. java.util.concurrentSystem.Security Provee acceso a funcionalidades de encriptacin y configuracin
de seguridad del CLR. java.securjty, javax.cryptoSystem.Windov/s.Forms Manejo de ventanas y controles grficos. javax.swing
: System.Xml Manejo de datos en formato XML. javax.xml
Tabla 1. Espacios de nombres.
Por supuesto que la lista es an ms grande. Un acceso de referencia ideal es la documentacin que provee Visual Studio .NET o la provista por MSDN {MSDNLibrary). Ahora, si volvemos a ver el cdigo de nuestro primer programa creado en el captulo anterior, entenderemos mejor aquello de System.Console.WriteLine. Consol es una clase cue pertenece al espacio de nombres System. Si no lo hubisemos antepuesto al nombre de la clase, el compilador habra arrojado un error, oues no habra encontrado a Consol en el espacio de nombres global.
La sentencia usingUn modo de ahorrarnos trabajo, al tener que anteponer nombres de namespaces a cada una de las clases que utilicemos, es colocar en la cabecera de nuestro archivo de cdigo fuente una sentencia using, escribiendo:
using
-
PROGRAMACIN C I
Por lo tanto, el cdigo de nuestro primer programa ahora podra ser:
VConsol.WriteLina("Nuestro primer programa');
}}
Consol es una clase que no existe en el espacio de nombres global, sino en el espacio de nombres System. Gracias a que le hemos indicado al compilador que estamos utilizando dicho espacio de nombres, l sabr que las clases que utilicemos tambin podran estar all.
WriteLine es un mtodo de la clase Consol. Recordemos que para acceder a informacin de referencia sobre la BCL podemos utilizar la ayuda que provee Visual Studio, conde veremos todos los mtodos y propiedades de la clase Consol.
LOS COMENTARIOS
En un principio, nuestro programa ser pequeo, y analizar qu sucede dentro de l ser sencillo, ya que bastar con echar un ojo al cdigo escrito. Sin embargo, a medida que ste crece, se vuelve muy conveniente poder introducir notas aclaratorias sobre qu es lo que pretendemos que el programa haga. As, si escribimos un algoritmo en particular, podemos agregar un texto que indique qu debe hacer dicho algoritmo, y de este modo otro programador podr entenderlo rpidamente, o quiz nosotros mismos, releyendo el cdigo que hayamos escrito tiempo atrs.
Para que el compilador no interprete el texto aclaratorio como intentos fallidos de instrucciones, debemos indicarle que estamos introduciendo un comentario.
C# acepta dos tipos de comentarios. Uno es el comentario de lnea, que debe comenzar con los caracteres //, como por ejemplo:
; // Este es un comentario
3 8 u s r .c o d e
-
Las variables
(
El otro es el comentario clsico de! lenguaje C, que comienza con los caracteres f* y termina de manera inversa, con los caracteres */:
-/* Este es un comentario */
Este ltimo tipo de comentario puede ser multilnea; el siguiente es ejemplo de esto:
'
LAS VARIABLES
Las variables son utilizadas para almacenar datos. Sin embargo, para poder utilizar una variable, en primer lugar deberemos declararla, a diferencia de lo que ocurra en Visual Basic 6.0 o en algunos lenguajes de scripts.
La declaracin de una variable est compuesta mnimamente por dos elementos:
El tipo de dato. El identificador.
El tipo especifica el tamao en memoria asignado para el dato almacenado oor la variable y el correcto modo de presentarlo.El identificador es el nombre que tendr la variable y que utilizaremos para referenciar- la luego en el programa.
Figura 1. Declaracin de una variable.
Para que el compilador los acepte como vlidos, los identificadores debern seguir ciertas reglas, similares a las existentes en otros lenguajes como C, C++, Visual Basic o Java. Veamos:
Deben comenzar con una letra o un carcter de guin bajo (underscore). Deben continuar con una letra, un nmero o un carcter de guin bajo. No deben coincidir con una palabra reservada.
fin de sentencia
Aint contador ;
tipo identificador
u s r .c o d e 39
-
PROGRAMACIN CU
Las palabras reservadas de C#Todo lenguaje establece un conjunto de palabras reservadas que debern ser tomadas como prohibidas para la declaracin de cualquier tipo de dato definido por el programador. En C# la lista de palabras reservadas es la siguiente:
abstraer ' enum 8 long 8 stackallocas * event 8 namespace 8 staticbase explicit 8 new stringbool extern 8 nuil 8 structbreak false 8 object 8 switchbyte finally 8 operator 8 thiscase Fixed 8 out throwcatch 0 float 8 overtide 8 truechar for * params 8 trychecked foreach 8 private 8 typeofclass goto 8 proceded 8 uintconst * if 8 public 8 ulongcontinu 8 implicit 8 readonly 8 uncheckeddecimal 8 in 8 re 8 unsafedefault inr 8 return * ushortdelegate interace 8 sbyte usingdo 8 internal 8 sealed 8 virtualdoubie 8 is 8 shori 8 voidelse 8 lock 8 sizeof 8 while
Ejemplos de dentificadoresAlgunos dentificadores vlidos son:
MiVariable contadorContado_ mi_variable
O USO DE MAYSCULAS Y MINSCULAS
Para C# et uso de maysculas y minsculas es importante. Una variable llamada contador es distinta de otra llamada CONTADOR y de Contador. Sin embargo, a pesar de que crear variables diferentes slo en la utilizacin de minsculas y maysculas es vlido, no es considerado una buena prctica.
40 u t . c o d e
-
Las variables
Y algunos ejemplos de identificadores no vlidos:
IVariable: error porque comienza con un nmero. $Variable: error porque comienza son un signo $. ###Contador###: error porque comienza con un signo #. default: error porque default es una palabra reservada.
Claro que hay nombres mejores que otros. En un caso real, cuando estemos construyendo nuestras aplicaciones, lo ideal ser que el identificador de una variable sea seleccionado en funcin de un nombre que describa mejor lo que representa dentro del programa. No es una buena idea coloar como identificador de una variable el nombre Variable, aunque el compilador lo acepte.
Convenciones de nombramientoExisten diversas convenciones de nombramiento para clases, variables, funciones, etc. La idea detrs de estas convenciones es especificar reglas para la creacin de los identificadores y que, de este modo, especialmente en grupos de trabajo, los nombres asignados sean similares en cuanro a estructura.
Una convencin que Microsoft sola recomendar era la notacin hngara. A grandes rasgos, en dicha notacin se antepona como prefijo a los nombres de las variables su tipo de dato (codificado en una o dos letras) y una m_ si era una variable miembro, tina p_ si era un puntero, una g_. si era una variable global, etc.
Hoy da, esta notacin ya no es aconsejada con el mismo iervor, pues los editores modernos rpidamente nos indican el tipo de dato al cual pertenece una variable, y de este modo se pierde una de sus grandes ventajas. Sin embargo, a fin de cuentas, es una cuestin de gustos. Lo importante ser mantener la misma convencin a lo largo de todo el proyecto.
Este libro adopta la misma notacin que utiliza la librera BCL: notacin camello para variables, y notacin Pascal para clases, estructuras, enumeradores, funciones, mtodos, constantes y propiedades.
La notacin camello consiste en crear identificadores concatenando palabras sin hacer uso de caracteres especiales (como el underscore o el guin), sino colocando en mayscula la primera letra de cada palabra, a excepcin de la primera.
I unaVariableEntera contador nombrePersona
. .c o d e 41
-
PROGRAMACIN Cs
La notacin Pascal es similar a la camello, slo que la primera letra debe ser coloca-
Quienes se encuentren interesados en ia notacin hngara, en el Apndice B encontrarn su descripcin detallada.
Hemos mencionado que una variable debe poseer un tipo. El lenguaje define un conjunto de tipos de datos primitivos que pueden ser utilizados por nuestras variables, propiedades y mtodos. Tambin podremos crear nuestros propios tipos por medio de clases y estructuras, como ya veremos luego.
Una variable tiene asociada una posicin de memoria, que es donde realmente se almacena el dato en cuestin. El identificador es, al fin y al cabo, una manera amigable de referirnos a ella. Podramos decir, entonces, que el tipo de dato es una manera de comunicarle al compilador:
Cunto espacio en memoria ocupar la variable. Qu semntica tendr el dato almacenado.
Un nmero entero podra ocupar en memoria la misma cantidad de espacio que un nmero de punto flotante. El compilador sabr cmo interpretar la informacin que all encuentre precisamente por el tipo de dato que posee la variable asociada a dicha posicin de memoria.
Tambin es conveniente destacar que el compilador distingue entre los tipos de datos por valor y los tipos de datos por referencia. Esto tiene relacin con la zona de memoria que se utiliza para crear la variable en cuestin: el stack (pila) o el hen (montculo). Los tipos de datos por valor sern almacenados en el stack, mientra.-.
a. e n m a y s c u la .
ImprimirValor FijarLargo DameAltura
Tipos de datos fundamentales
BUSCANDO INFORMACIN DE NOTACIONES EN LA RED
Quienes deseen investigar acerca de notaciones en la Red, las siguientes palabras clave arrojarn resultados interesantes: hungarian notation, prefix notation, camel notation. Pascal notation.
-
Las variables
que los tipos de datos por referencia sern almacenados en el heap (en el stack quedar una referencia de la ubicacin en dicha zona de memoria).
Nmeros enterosC# ofrece tres tipos de nmeros enteros:
short: nmero entero corto signado. int: nmero entero signado. long: nmero entero largo signado.
Si ambos son enteros, qu diferencia existe entre ellos? La respuesta es sencilla: la cantidad de memoria que se deber reservar y cun grande es el nmero que cabr dentro de nuestra variable.
En 2 bytes (short) es posible especificar un nmero con rango (-32768, 32767), mientras que en 4 bytes (int) es posible especificar un nmero dentro del rango(-2147483648,2147483647).
Por otro lado, los tipos de datos numricos enteros pueden ser signados o no. Si especificamos un nmero entero corto no signado (ushort), seguimos ocupando 2 bytes, pero al ser todos positivos, el rango vlido ahora es (0, 65533). Si intentamo: asignar un nmero negativo a una variable no signada, se producir una excepcin.
Declarando algunas variables enteras:
short a; // Entero corto signado
ushort b; /./' Encero corto no signado
int d; ti Entero signadouint e; // Entero no signado
long ; 1! Entero largo signadoulong g; Entere largo no signado
U J Y LOS PUNTEROS?
Quienes vengan de C o C*+ podran preguntar: dnde estn los punteros? C# permite el uso de punteros igual queC++, pero para esto se deber marcar el bloque o funcin comounsafe (no rn gurnj, adems de- modificar parmetros de compilacin, En C# su uso oueda relegado a necesidades especificas, como intersetuar con recursos no gestionados creados en otros lenguajes.
COOt
-
PROGRAMACIN CE
Diferencias con C/C++Los ienguajes de programacin C/C++ permiten especificar tipos de datos no signados como en C#, slo que vara el modo de declararlos. En C/C++ se debe especificar el modificador unsigned delante del tipo de dato por modificar. Por lo tanto, un entero signado se declarara:
//declaracin C++ o C#
int a;
Mientras que un entero no signado se declarara:
//declaracin C++
unsigned int a;
//declaracin Cjjjf
unit a;
La idea de reemplazar el unsigned int por un simple uint tiene que ver con facilitarnos la vida a nosotros, los programadores.Finalmente, existe tambin un tipo de dato llamado byte, en el cual se puede almacenar, como su nombre lo indica, el valor de un byte. Su rango es (0,255) y es no signado, aunque es posible declarar un byte signado por medio del tipo de dato sbyte.
Nmeros no enterosC# diferencia en tipo a un nmero entero de un nmero con parte fraccionaria: para estos nmeros de datos existen tres tipos: float, double y decimal.La diferencia entre ellos es la precisin. Las computadoras se llevan muy bien con los nmeros enteros, pero para trabajar con nmeros decimales necesitan utilizar un recurso matemtico llamado coma florante. De esta manera es posible almacenar una cantidad no fija de decimales, pero con una determinada precisin mxima; esta precisin, en definitiva, se encuentra determinada por el tamao toral que ocupa la variable en memoria. Los tres tipos de datos de nmeros no enteros que maneja C# son:
float: nmero no entero de precisin simple. Las constantes literales deben contener el agregado f en la parte decimal para que el compilador pueda tomarlas como float (por ejemplo, 4 .0 f).
double: nmero no entero de precisin doble (por ejemplo, 4.0). decimal: nmero no entero de precisin mxima. Las constantes literales deben
contener el agregado M en la parte decimal para poder ser tomadas con decimal (por ejemplo,' 4.0M).
44 : .c o d e
-
Las variables
Declarando algunas variables no enteras:
float a; // Precisin simple
double b; // Precisin doble
decimal c; // Precisin mxima
BooleanosLas variables booleanas pueden albergar dos valores: true (verdadero) o false [falso).
Declarando una variable del tipo booleana:
bool a;
CaracteresPara almacenar un carcter en una variable debemos especificar su tipo en char. Ejemplo:
char a;
Este tipo de datos puede albergar un carcter del tipo Unicode, pensado especialmente para alfabetos orientales que poseen una cantidad de elementos mayor a 256. Existen ciertos tipos de caracteres especiales que son interpretados por el compilador dentro de una cadena de texto. stos son conocidos como caracteres de escape, y en la siguiente tabla pueden apreciarse algunos de ellos:
lnea nueva \n. tab horizontal \ t
backspaceretomo de carra Vbarra invertida wcomilia doble V
Tabla 2. Caracteres de escape.
De este modo, si escribimos en pantalla el siguiente texto:
ConBole .Write("\tTextol\nTexto2);
.c o d e 45
-
PROGRAMACIN Cfl
El primer carcter (\t) ser interpretado como un tab horizontal, y el carcter \n, como una lnea nueva, por lo que en pantalla podremos observar:
Textol
Texto2
Lista de tipos de datos primitivosEn la siguiente tabla se describen los tipos de datos fundamentales del lenguaje.
UPO DE DATO FUNDAMENTAL TAMAO EN BYTES TIPO ESTRUCTURA DESCRIPCIN
bool 1 System.Boolean Booleano. Su valor puede ser tnie (verdadero) o false (falso)
sbyte 1 System.SByte Byte no signadobyte 1 System.Byte Byte
; char 2 System.Qtar Carctershort 2 System.lnll6 Entero cortoushort 2 System.UIntl6 Entero corto no signadoint 4 System.lnt32 Enterouint 4 System.Ulnt32 Entero no signadolong 8 System.lnt64 Entero largo
: ulong 8 System.Ulnt64 Entero largo no signadofloat 4 System.Singie Nmero no entero de precisin simpledouble 8 System.Double Nmero no entero de precisin dobledecimal 16 System.Decimal Nmero no entero de mxima precisin
Tabla 3. Tipos de datos fundam entales de C#,
Como se puede observar en la tabla anterior, todo tipo de dato primitivo que define el lenguaje se mapea con una estructura de la librera BCL. Todos los lenguajes que se construyen para la plataforma .NET debern hacer esta tarea, y de este modo la intercomunicacin entre ellos ser mucho ms sencilla debido a que, en definitiva. utilizan ios mismos tipos de datos fundamentales
As es que declarar una variable entera como:
int a;
es exactamente igual a hacerlo del siguiente modo:
4( COC
-
Las variables
System.Int32 a;
Notemos que el nombre de la estructura relacionada est compuesto por dos partes: el tipo de dato (con la primera letra en mayscula) y la cantidad de bits que ocupa en memoria. De este modo tambin podemos inferir que un int siempre ocupar 4 bytes, ms all de la plataforma en la cual estemos trabajando (algo que no sucede en C o C++, donde la especificacin no ata los tipos de datos a tamaos fsicos, sino que simplemente exige una relacin entre stos).
Asignar valor a una variableLas variables pueden albergar valores, que estn relacionados con el tipo de dato de la propiedad en cuestin.
Ya vimos cmo declarar variables, pero no sabemos an cmo asignarles valor. Para ello deberemos usar el operador de asignacin, que en C# es el signo igual (*).
Si declaramos una variable y la utilizamos sin antes inicializarla en algn valor, su contenido ser indeterminado.
int a = 1;
En el caso expuesto hemos fijado el valor 1 a la variable a del tipo nmero entero en la misma lnea en que declaramos la variable. Esto podra no ser as; los siguientes tambin son ejemplos vlidos:
int a;
I I . . .a = 1;
DNDE ESTN LOS STRINGS?
C# utiliza una clase que representa los strings y se llama string (o System.String). Esta imple- mentacin es algo distinta del resto de tos tipos de datos, ya que stos son bsicamente estructuras. La razn es que en los strings, la cantidad de memoria que se requerir para la cadena ser variable, dependiendo de su contenido. Declarando un string: string miVariableString.
l r . c o d e 47
-
PROGRAMACIN C*
operador de asignacin , , i fin de
^ X - sentencia
a 4 ;
T Tvariable i expresinFigura 2 . El proceso de asignacin.
ConstantesExisten tres constantes:
Literales: especificadas por medio de un valor escrito en el cdigo.
int a = 25;
string nombre = "Tito";
En el caso citado, 25 es una constante literal al igual que Tito.
Simblicas: especificadas por medio de identificadorcs asociados a un literal. Son ms recomendables que el uso de literales en modo directo, ya que en ciertos contextos stos podran ser vistos como nmeros mgicos o sacados de una galera.
Estas constantes son muy similares a las variables, con la diferencia de que a stas slo se les podr dar un valor en el momento de su declaracin. Luego, cualquier intento de modificacin ser tomado como un error por parte del compilador. Las constantes simblicas se declaran del mismo modo que las variables, aunque se debe anteponer la sentencia const antes del tipo:
const int unaConstante = 1;
Enumeradores: finalmente, los enumeradores son el tercer tipo de constantes, y adquieren gran utilidad cuando debemos especificar un grupo de constantes estrechamente relacionadas.Supongamos que deseamos que una variable pueda adoptar el valor de un mes especfico del ao. Podramos definir que esta variable fuese numrica entera y
46 i : .c o d e
-
Las variables
adoptar Ja convencin de que su nmero equivaliera ai nmero del mes en cuestin. Sin embargo, esta convencin debera estar especificada en algn documento que se encuentre al alcance de todos los programadores; incluso nosotros, tiempo despus de haber escrito el cdigo, podramos dudar acerca de si el mes de enero era representado por el 1 o acaso por el 0.
Para evitar este tipo de inconvenientes y, tambin, que algn descuidado especifique un nmero fuera de rango para el mes (por ejemplo, 13), sin tener que estar colocando cdigo que realice esta verificacin, podramos crear el siguiente enumerador:
enum Mes
{Enero,
Febrero,
Marzo,
Abril,
Mayo,
Junio,
Julio,
Agosto,
Septiembre,
Octubre,
Noviembre,
Diciembre
}
Luego, podramos declarar una variable como del tipo Mes. Veamos:
Mes m;
Ahora, m slo podr adoptar los valores constantes especificados en el enumerador Mes.
m = Mes.Enero;
Si analizamos cmo declaramos el enumerador, observaremos que ste tiene la palabra reservada enum antepuesta a un identificador, y luego existe una lista de constantes separadas por comas dentro del cuerpo declarativo del enumerador que est delimitado por llaves.
i . c o d e 49
-
PROGRAMACIN C#
Estas constantes podran poseer un valor literal asignado a ellas por medio del operador de asignacin:
enum Mes
{Enero = 1,
Febrero = 2,
Marzo =3,
Abril = 4,
Mayo = 5,
Junio a 6,
Julio = 7,
Agosto a 8,
Septiembre a 9,
Octubre a 10,
Noviembre a 11,
Diciembre a 12
}
En realidad, cada constante dentro de un enumerador siempre posee un valor literal numrico asociado a ella, slo que si no lo especificamos, lo har automticamente el compilador, empezando por el nmero 0 e incrementando en una unidad. De hecho, podramos consultar por el valor numrico asociado a una variable de tipo enumerador por medio de conversiones de tipo, como veremos a continuacin.
Conversiones de tipo de datosC# es un lenguaje muy estricto en cuanto a conversiones de tipo. Quienes provengan de otros lenguajes como C o C++ se darn cuenta de esto enseguida, cuando el compilador arroje errores donde antes, utilizando otros lenguajes, arrojaba advertencias. Existen dos tipos de conversiones: implcitas y explcitas.
MS ACERCA DE LOS ENUMERADORES
Dos constantes definidas dentro de un enumerador podran poseer el mismo valor numrico. Esto seria til para definir constantes que sean sinnimos; por ejemplo, tanto "setiembre" como "septiembre" podran estar relacionados con el valor 9.
III
-
Las variables
Las implcitas son las que realiza el compilador sin requerir de nosotros la especificacin de ninguna sentencia adicional. Este tipo de conversiones se caracteriza por el hecho de que nunca se pierde informacin ni precisin. La conversin es siempre vlida. En el siguiente ejemplo vemos cmo un nmero entero es convertido a un entero largo. La conversin se da en la segunda lnea y es implcita.
int ni o 10;
long n2 = ni;
El otro ripo de conversin es explcito, y el compilador lo exige cuando podra ocurrir prdida de informacin o precisin.
long ni = 10;
int n2 - ni; // error
El cdigo anterior arrojar un error en la segunda lnea, pues el compilador no puede realizar dicha conversin de modo implcito.Para realizar una conversin explcita deberemos utilizar una expresin de aistim . Esto significa especificar el tipo de dato al cual deseamos llevar la expresin, ubicado entre parntesis y antes de la expresin en cuestin:
long ni = 10;
int n2 = (int) ni; // realizamos un cast
Ahora, el compilador ya no protestar. Pero qu sucede si el nmero en ni es ms grande de lo que podra albergar n2? Se pierde informacin! Es por esta razn por lo que el compilador nos exige la conversin explcita, ya que es una manera de indicarle que nosotros sabemos lo que hacemos. Veamos el siguiente ejemplo:
long ni = Int64.MaxValue;
int n2 = (int) ni; // realizamos un cast
Como es de suponer, en n2 no quedar el mismo valor que en ni, simplemente porque en n2 no hay lugar para albergar la magnitud que posee ni. Sin embargo, ei compilador no arrojar error alguno. ;Cmo decirle al compilador que deseemos ser alertados ante semejante circunstancia? Utilizando un bloque checked como se muestra a continuacin:
.coat
-
PROGRAMACIN CU
long ni a Int64.MaxValue;
checked
{int n2 = (int) ni; // realizamos un cast
}
Ahora, si la operacin fracasa, el compilador arrojar una excepcin. Esta excepcin podr ser capturada y tratada como veremos ms adelante.Y as como existe el bloque checked tambin existe su contrapartida, llamada un- checked. Cundo utilizaremos un bloque unchecked? Cuando el compilador no nos permita realizar una operacin, a pesar de realizar una conversin de tipos explcita como la siguiente:
short ni = 60000}
No hace falta ser un genio para saber que lo escrito en el cdigo anterior fracasar. El rango de un short es de (-32768, 32767), por lo que 60000 es un nmero demasiado grande. Tal vez el ejemplo sea trivial, pero si queremos que dicho cdigo sea compilado de todos modos, entonces deberemos encerrarlo en un bloque unchecked:
unchecked
{short ni 60000;
}
La clase ConvertLa librera BCL nos ofrece una clase llamada Convert dentro del espacio de nombres System, que es muy til en el momento de realizar conversiones. La gran va-
ERRORES DE CONVERSIN
Cuando el compilador no pueda realizar una conversin de tipos de datos, arrojar un error del tipo "Cannot implicity convert type...". Un doble clic sobre dicho error nos llevar a la lnea desde la cual proviene el mensaje. Deberemos pensar si hemos cometido algn error o si nos olvidamos de especificar la conversin de modo explcito para sobrescribir el sistema de revisiones del compilador.
52 u s r .c o d e
-
Las variables
riedad de mtodos estticos que posee Convert nos permite pasar un tipo de dato primitivo a cualquier otro tipo de dato primitivo.Por ejemplo, la siguiente operacin no es vlida debido a que intentamos pasar de un nmero entero a un tipo booleano.
bool a = 1;
Pero si, en cambio, escribimos:
bool a = Convert.ToBoolean(l);
Entonces la variable a, si recibe un nmero entero distinto de 0, ser true, y en caso contrario, false.
OperadoresEs posible combinar nmeros y variables en expresiones por medio de operadores matemticos. Veamos:
int a = 3 + 4; // Almaceno el nmero 7 en a
int a = 4;
int b o a / 2? // Almaceno en b el contenido de la variable
dividido por 2
int a =10;
int b = a * 14; // Almaceno en b el contenido de la variable
multiplicado por 14
Tambin podemos usar tipos de datos numricos decimales:
float a = 3.4f / 2;
Y podremos combinar tipos de datos en operaciones:
int a = 5;
float b = 4.3f;
float resultado = a * b;
u s r .c o d e 5 3
-
PROGRAMACIN CU
Sin embargo, cuando operamos de este modo es conveniente tener mucho cuidado, ya que el tipo de dato resultante estar en funcin de la operacin que realicemos.
Por ejemplo, la suma de dos nmeros enteros dar como resultado un nmero entero, y la divisin de dos nmeros enteros tambin dar como resultado un nmero entero; esto ltimo es lo que precisamente puede traer muchos problemas.
Si yo le pregunto cul es el resultado de la operacin 5 dividido 2, usted seguramente contestar 2,5! Pero nuestra computadora, en cambio, nos devolver 2, ya que la operacin fue entera y el resultado fue de enteros. Colocar una variable de tipo flotante al resultado no soluciona este inconveniente:
float a o 5 / 2> // El resultado de la operacin ser 2!
Para solucionar este inconveniente deberemos convertir al menos uno de los ope- randos en flotante, para que, de este modo, la divisin no sea entre nmeros enteros, sino entre un entero y un nmero flotante:
float a = 5.Of / 2; // Ahora el resultado ser 2.5
Uso de constantes en operacionesUtilizar constantes en lugar de nmeros literales de manera directa es considerado una buena prctica, ya que facilita la lectura y comprensin del cdigo fuente. Por ejemplo:
Constantes numricas literales: superficie = 3.1415 * 16;
Constantes declaradas: const float pi = 3.1415f; superficie = pi * (radio*radio);
U U NMEROS MGICOS
Colocar una constante literal escrita sobre el cdigo sin explicacin alguna es una mala prctica que suele denominarse "nmeros mgicos". Existe un muy buen libro llamado Code Complete, de Steve McConnell, que cita muchas de las malas prcticas ms populares e indica cmo evitarlas. Lectura obligada si se desea ser un buen programador.
54 i . .c o d e
-
Control del flujo de ejecucin
El ltimo listado de cdigo es un poco ms legible. Ms all de lo trivial del ejemplo, en otros casos podra no resultar obvio, en el anlisis de una expresin, que representan determinados nmeros. En cambio, al ver una constante llamada pi rpidamente entenderemos a qu nos referimos.
CONTROL DEL FLUJO DE EJECUCINSi especificamos un programa como un simple conjunto de operaciones sobre variables e invocaciones a mtodos de clases, su ejecucin ser secuencial desde la primera Enea hasta la ltima. Este escenario no es muy emocionante, y dista mucho de las necesidades que poseen los programadores para la creacin de aplicaciones del mundo real.
Para esto el lenguaje C# ofrece un conjunto de sentencias que permiten controlar el flujo de ejecucin, es decir, qu lnea de cdigo ser ejecutada por el procesador.
De este modo podremos indicarle a nuestro compilador que una determinada secuencia de instrucciones no debe ejecutarse slo una vez sino diez, o que una porcin de cdigo debe ejecutarse slo si una variable es igual a 16 o, quizs, que repita una porcin de cdigo hasta que el usuario presione una tecla determinada.
Sentencias condicionalesLa primera sentencia que veremos ser la condicional if. Con esta sentencia podremos expresar, por ejemplo, que:
Si (expresin booleana>) entonces hacer sentencia [Si no, hacer sentencia]
La expresin usualmente es una comparacin utilizando los operadores:
OPERADOR SIGNIFICADOIgual a
tSBBBHBHRBBHflHBI< Menor a> M a p a-_ _ _ _ _ _ _ _ _ _ _ _ Mayor o Igual a_ _ _ _ _ _ _ _
Tabla 4. Operadores de comparacin.
u s r .c o d e 55
-
PROGRAMACIN CK
Veamos un ejemplo:
int a * Consol. In.PeekO;
if (a 'x')
Consol.Write("Has adivinado el carcter secreto*)}
En la primera lnea utilizamos el mtodo Peek para tomar un carcter desde la entrada de consola. Luego verificamos si este carcter es igual a un carcter arbitrario. Entonces a == Y es una expresin que se evala por verdadero o falso.Si la expresin es verdadera, ingresamos en el cuerpo de la sentencia condicional; el cuerpo siempre ser la sentencia prxima al cierre del parntesis que simboliza el fin de la expresin booleana. Es posible que nuestra sentencia sea, en realidad, un grupo de sentencias; en estos casos deberemos especificar un bloque de cdigo con los caracteres llaves ({}); la llave abierta indica el comienzo de un bloque de cdigo, mientras que la llave cerrada indica el fin del bloque. Veamos:
int a = Consol.In.Peek();
if (a s= 'x')
{Consol.Write("Has adivinado el carcter secreto");
Consol.Write("Felicitaciones");
}
Otros lenguajes como Visual Basic utilizan otros criterios para exigir una sentencia de fin de condicional, como End If o similares. C#, como C y C++, utiliza el concepto de bloques en todas sus sentencias. De hecho, las variables declaradas dentro de bloques sern locales a stos.Y qu ocurre cuando la expresin booleana especificada en el if se evala por falso? Bueno, una sentencia condicional if debe poseer una sentencia que es el cdigo que se ejecuta ante una evaluacin por verdadero de la expresin booleana, y puede o no
U U EL USO DE LAS SANGRIAS
Es muy recomendable el uso de sangras para mejorar la legibilidad de nuestro cdigo. Cuando escribimos el cdigo del cuerpo de las sentencias if. lo hacemos dejando una sangra de una determinada cantidad de espacios jusualmente cuatro). En los entornos de desarrollo integrado y en casi cualquier editor de textos, lo hacemos por medio de la tecla TAB.
56 u s r .c o d e
-
Control del flu jo de ejecucin
poseer una sentencia por ejecutar si la expresin es evaluada por falso (esta sentencia debe ser precedida por la palabra clave else). Entonces, los escenarios posibles son dos:
U U QU TIPO DE SENTENCIAS PUEDEN ESCRIBIRSE?
El cdigo escrito en et cuerpo de un if no est limitado en ningn sentido. All podremos declarar variables, efectuar asignaciones, especificar otras sentencias, invocar funciones, etc.
u s r .c o d e 57
-
PROGRAMACIN C#
Como se puede apreciar en las Figuras 3 y 4, el flujo 1 corresponde a una evaluacin verdadera de la expresin, mientras que el flujo 2 corresponde a una evaluacin por falso. Veamos el ejemplo de cdigo especificando la sentencia else:
int a Consol.In.Peek();
if (a 'x')i ; {
Consola.Hrite('Has adivinado el carcter secreto*);
Consol.Nrite('Felicitaciones");
: }; else
(Consol.Write('Tal vez deberas intentarlo de nuevo*);
: }
Ntese que las llaves que colocamos en el cuerpo del else no son obligatorias en este caso, pues ste posee slo una lnea.
Y w A A J expresin , , / A v __1 i V r 1 booleana r
se sentenda
Figura 5. Sintaxis de if.
expresin booleana
if(carss'a')
sentencia [ Consola. Nrite ('Verdadero*);
elser
sentencia [ Consola, Write( 'Falso");
Figura 6. Ejemplo de la sentencia if.
56 u s r .c o d e
-
Control del flujo de ejecucin
Y qu ocurre si Jas opciones son mltiples? Si, por ejemplo, deseamos solicitar un nmero del 1 al 3 y realizar diferentes acciones en funcin de la opcin elegida.
Bueno, nada nos impide escribir lo siguiente:
i (num == l)
{. // opcin 1
}else
{if (num s= 2)
{// opcin 2
}else
{if (num =e 3)
{/./ opcin 3
}else
{// ninguna opcin
}}
}
En el listado anterior hemos anidado sentencias condicionales if. Analicemos cmo se ejecuta dicho cdigo.
Q Q OPERADOR DE IGUALDAD
Ntese que el operador de comparacin de igualdad es "==" y no (que es el operador de asignacin). Esto, en un principio, podra confundirnos, sobre todo si venimos de otros lenguajes. Afortunadamente, si nos equivocamos y utilizamos V en lugar de V , el compilador nos lo informar, ya que la expresin condicional debe poder ser evaluada por verdadero o por falso.
u s r .c o d e 59
-
PROGRAMACION Cfl
Supongamos que num es igual a 3.
1. Se evala num == 1. Como 3 es distinto de 1, entonces la expresin se evala por falso y el flujo de ejecucin ingresa en el cuerpo else de la sentencia.
2 . Dentro del else del primer if se encuentra otro if (esto es algo totalmente vlido); se evala la expresin num == 2 como falsa, ya que 3 es distinto de 2. Nuevamente se salta al else del if, en este caso, del segundo.
3. Dentro del segundo else nos encontramos con otro if con una expresin que evala num == 3 por verdadero, ya que 3 es igual a 3. Entonces, el flujo de ejecucin ingresa en el cuerpo que posee el comentario opcin 3.
Pero existe una manera de escribir lo mismo que mejora mucho la legibilidad.
if (a : '1')
1 u\
opcin 1
ielse if (a '2')
V
/'/
\opcin 2
)else if /
(a '3')
\
// opcin 3
elee
{;// ninguna opcin
En esta siruacin, la idea es exactamente la misma. De hecho, el compilador no encontrar diferencia alguna. Unicamente hemos eliminado las llaves de los bloques else, ya que dentro de stos existe slo una sentencia if (no tiene importancia que a su vez esta sentencia posea ms de una lnea u otras sentencias dentro), y hemos modificado el uso de las sangras.
Operadores lgicosDentro de los parntesis del if debemos colocar una expresin booleana. Dicha expresin puede ser trivial, como, por ejemplo:
60 u s r .c o d e
-
Control del flujo de ejecucin
bool 3alir = true;
if (salir)
Salir_del _prograraa
En el ejemplo citado, la expresin slo consiste en una variable. Esta expresin, como cualquier otra, ser evaluada por verdadero o falso.
Pero qu sucede si queremos ejecutar ciertas instrucciones slo si a es igual a 1 y b es igual a 2? Entonces podremos crear una expresin del siguiente modo:
if (a :: 1 U b *= 2)
Hacer_algoi ' ! : ' , . - . . - i . , : ;
El operador && es el operador lgico AND, por lo que nuestra expresin fue equivalente a decir: Si a es igual a 1 Y b es igual a 2, entonces....
Por lo tanto, slo ingresaramos en el cuerpo de la sentencia if cuando la expresin a == 1 y la expresin b == 2 se evaluaran por verdadero.Tambin podramos desear realizar una determinada accin cuando a fuera igual a 1 o b fuera igual a 2. En ese caso utilizaramos el operador lgico OR (| |):
if (a 1 || b = 2)
Hacer_algo
De este modo podramos crear expresiones an ms complejas combinando operadores lgicos a nuestro gusto, pero siempre deberemos tener como meta la creacin de un cdigo lo ms legible posible, ya que, recordemos, ste no ser ledo slo por una computadora.
&& Y lgico