c#. la guía total del programador

389

Upload: -

Post on 11-Nov-2015

227 views

Category:

Documents


29 download

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