Libro csharp

of 264/264
El lenguaje de programación C# Índice José Antonio González Seco Página 1 INTRODUCCIÓN A LA OBRA 7 REQUISITOS PREVIOS RECOMENDADOS 7 ESTRUCTURA DE LA OBRA 7 CONVENIOS DE NOTACIÓN 7 TEMA 1: INTRODUCCIÓN A MICROSOFT.NET 9 MICROSOFT.NET 9 COMMON LANGUAGE RUNTIME (CLR) 9 MICROSOFT INTERMEDIATE LANGUAGE (MSIL) 12 METADATOS 14 ENSAMBLADOS 15 LIBRERÍA DE CLASE BASE (BCL) 18 COMMON TYPE SYSTEM (CTS) 19 COMMON LANGUAGE SPECIFICATION (CLS) 19 TEMA 2: INTRODUCCIÓN A C# 21 ORIGEN Y NECESIDAD DE UN NUEVO LENGUAJE 21 CARACTERÍSTICAS DE C# 21 ESCRITURA DE APLICACIONES 26 APLICACIÓN BÁSICA ¡HOLA MUNDO! 26 PUNTOS DE ENTRADA 28 COMPILACIÓN EN LÍNEA DE COMANDOS 28 COMPILACIÓN CON VISUAL STUDIO.NET 30 TEMA 3: EL PREPROCESADOR 35 CONCEPTO DE PREPROCESADOR 35 DIRECTIVAS DE PREPROCESADO 35 CONCEPTO DE DIRECTIVA. SINTAXIS 35 DEFINICIÓN DE IDENTIFICADORES DE PREPROCESADO 36 ELIMINACIÓN DE IDENTIFICADORES DE PREPROCESADO 37 COMPILACIÓN CONDICIONAL 37 GENERACIÓN DE AVISOS Y ERRORES 40 CAMBIOS EN LA NUMERACIÓN DE LÍNEAS 40 MARCACIÓN DE REGIONES DE CÓDIGO 41 TEMA 4: ASPECTOS LÉXICOS 43 COMENTARIOS 43 IDENTIFICADORES 44 PALABRAS RESERVADAS 44 LITERALES 46 OPERADORES 48

Embed Size (px)

description

K

Transcript of Libro csharp

  • 1. El lenguaje de programacin C# ndiceINTRODUCCIN A LA OBRA 7REQUISITOS PREVIOS RECOMENDADOS 7ESTRUCTURA DE LA OBRA 7CONVENIOS DE NOTACIN 7TEMA 1: INTRODUCCIN A MICROSOFT.NET 9MICROSOFT.NET 9COMMON LANGUAGE RUNTIME (CLR) 9MICROSOFT INTERMEDIATE LANGUAGE (MSIL) 12METADATOS 14ENSAMBLADOS 15LIBRERA DE CLASE BASE (BCL) 18COMMON TYPE SYSTEM (CTS) 19COMMON LANGUAGE SPECIFICATION (CLS) 19TEMA 2: INTRODUCCIN A C# 21ORIGEN Y NECESIDAD DE UN NUEVO LENGUAJE 21CARACTERSTICAS DE C# 21ESCRITURA DE APLICACIONES 26APLICACIN BSICA HOLA MUNDO! 26PUNTOS DE ENTRADA 28COMPILACIN EN LNEA DE COMANDOS 28COMPILACIN CON VISUAL STUDIO.NET 30TEMA 3: EL PREPROCESADOR 35CONCEPTO DE PREPROCESADOR 35DIRECTIVAS DE PREPROCESADO 35CONCEPTO DE DIRECTIVA. SINTAXIS 35DEFINICIN DE IDENTIFICADORES DE PREPROCESADO 36ELIMINACIN DE IDENTIFICADORES DE PREPROCESADO 37COMPILACIN CONDICIONAL 37GENERACIN DE AVISOS Y ERRORES 40CAMBIOS EN LA NUMERACIN DE LNEAS 40MARCACIN DE REGIONES DE CDIGO 41TEMA 4: ASPECTOS LXICOS 43COMENTARIOS 43IDENTIFICADORES 44PALABRAS RESERVADAS 44LITERALES 46OPERADORES 48Jos Antonio Gonzlez Seco Pgina 1

2. El lenguaje de programacin C# ndiceTEMA 5: CLASES 55DEFINICIN DE CLASES 55CONCEPTOS DE CLASE Y OBJETO 55SINTAXIS DE DEFINICIN DE CLASES 55CREACIN DE OBJETOS 58OPERADOR NEW 58CONSTRUCTOR POR DEFECTO 60REFERENCIA AL OBJETO ACTUAL CON THIS 61HERENCIA Y MTODOS VIRTUALES 61CONCEPTO DE HERENCIA 61LLAMADAS POR DEFECTO AL CONSTRUCTOR BASE 63MTODOS VIRTUALES 64CLASES ABSTRACTAS 66LA CLASE PRIMEGENIA: SYSTEM.OBJECT 67POLIMORFISMO 70CONCEPTO DE POLIMORFISMO 70MTODOS GENRICOS 71DETERMINACIN DE TIPO. OPERADOR IS 72ACCESO A LA CLASE BASE 72DOWNCASTING 74CLASES Y MTODOS SELLADOS 74OCULTACIN DE MIEMBROS 75MIEMBROS DE TIPO 81ENCAPSULACIN 81TEMA 6: ESPACIOS DE NOMBRES 85CONCEPTO DE ESPACIO DE NOMBRES 85DEFINICIN DE ESPACIOS DE NOMBRES 85IMPORTACIN DE ESPACIOS DE NOMBRES 86SENTENCIA USING 86ESPECIFICACIN DE ALIAS 88ESPACIO DE NOMBRES DISTRIBUIDOS 90TEMA 7: VARIABLES Y TIPOS DE DATOS 91DEFINICIN DE VARIABLES 91TIPOS DE DATOS BSICOS 92TABLAS 94TABLAS UNIDIMENSIONALES 94TABLAS DENTADAS 96TABLAS MULTIDIMENSIONALES 97TABLAS MIXTAS 99COVARIANZA DE TABLAS 99LA CLASE SYSTEM.ARRAY 99CADENAS DE TEXTO 100CONSTANTES 105VARIABLES DE SLO LECTURA 106Jos Antonio Gonzlez Seco Pgina 2 3. El lenguaje de programacin C# ndiceORDEN DE INICIALIZACIN DE VARIABLES 107TEMA 8: MTODOS 109CONCEPTO DE MTODO 109DEFINICIN DE MTODOS 109LLAMADA A MTODOS 110TIPOS DE PARMETROS. SINTAXIS DE DEFINICIN 111PARMETROS DE ENTRADA 111PARMETROS DE SALIDA 112PARMETROS POR REFERENCIA 113PARMETROS DE NMERO INDEFINIDO 113SOBRECARGA DE TIPOS DE PARMETROS 114MTODOS EXTERNOS 114CONSTRUCTORES 115CONCEPTO DE CONSTRUCTORES 115DEFINICIN DE CONSTRUCTORES 116LLAMADA AL CONSTRUCTOR 116LLAMADAS ENTRE CONSTRUCTORES 117CONSTRUCTOR POR DEFECTO 118LLAMADAS POLIMRFICAS EN CONSTRUCTORES 119CONSTRUCTOR DE TIPO 120DESTRUCTORES 121TEMA 9: PROPIEDADES 125CONCEPTO DE PROPIEDAD 125DEFINICIN DE PROPIEDADES 125ACCESO A PROPIEDADES 126IMPLEMENTACIN INTERNA DE PROPIEDADES 127TEMA 10: INDIZADORES 129CONCEPTO DE INDIZADOR 129DEFINICIN DE INDIZADOR 129ACCESO A INDIZADORES 130IMPLEMENTACIN INTERNA DE INDIZADORES 131TEMA 11: REDEFINICIN DE OPERADORES 133CONCEPTO DE REDEFINICIN DE OPERADOR 133DEFINICIN DE REDEFINICIONES DE OPERADORES 134SINTAXIS GENERAL DE REDEFINICIN DE OPERADOR 134REDEFINICIN DE OPERADORES UNARIOS 136REDEFINICIN DE OPERADORES BINARIOS 137REDEFINICIONES DE OPERADORES DE CONVERSIN 138TEMA 12: DELEGADOS Y EVENTOS 143Jos Antonio Gonzlez Seco Pgina 3 4. El lenguaje de programacin C# ndiceCONCEPTO DE DELEGADO 143DEFINICIN DE DELEGADOS 143MANIPULACIN DE OBJETOS DELEGADOS 145LA CLASE SYSTEM.MULTICASTDELEGATE 148LLAMADAS ASNCRONAS 149IMPLEMENTACIN INTERNA DE LOS DELEGADOS 152EVENTOS 154CONCEPTO DE EVENTO 154SINTAXIS BSICA DE DEFINICIN DE DELEGADOS 154SINTAXIS COMPLETA DE DEFINICIN DE DELEGADOS 154TEMA 13: ESTRUCTURAS 157CONCEPTO DE ESTRUCTURA 157DIFERENCIAS ENTRE CLASES Y ESTRUCTURAS 157BOXING Y UNBOXING 158CONSTRUCTORES 160TEMA 14: ENUMERACIONES 163CONCEPTO DE ENUMERACIN 163DEFINICIN DE ENUMERACIONES 164USO DE ENUMERACIONES 165LA CLASE SYSTEM.ENUM 166ENUMERACIONES DE FLAGS 168TEMA 15: INTERFACES 171CONCEPTO DE INTERFAZ 171DEFINICIN DE INTERFACES 171IMPLEMENTACIN DE INTERFACES 173ACCESO A MIEMBROS DE UNA INTERFAZ 176TEMA 16: INSTRUCCIONES 179CONCEPTO DE INSTRUCCIN 179INSTRUCCIONES BSICAS 179DEFINICIONES DE VARIABLES LOCALES 179ASIGNACIONES 180LLAMADAS A MTODOS 180INSTRUCCIN NULA 180INSTRUCCIONES CONDICIONALES 180INSTRUCCIN IF 180INSTRUCCIN SWITCH 181INSTRUCCIONES ITERATIVAS 183INSTRUCCIN WHILE 183INSTRUCCIN DO...WHILE 184INSTRUCCIN FOR 184Jos Antonio Gonzlez Seco Pgina 4 5. El lenguaje de programacin C# ndiceINSTRUCCIN FOREACH 185INSTRUCCIONES DE EXCEPCIONES 189CONCEPTO DE EXCEPCIN. 189LA CLASE SYSTEM.EXCEPTION 190EXCEPCIONES PREDEFINIDAS COMUNES 191LANZAMIENTO DE EXCEPCIONES. INSTRUCCIN THROW 192CAPTURA DE EXCEPCIONES. INSTRUCCIN TRY 192INSTRUCCIONES DE SALTO 197INSTRUCCIN BREAK 197INSTRUCCIN CONTINUE 198INSTRUCCIN RETURN 198INSTRUCCIN GOTO 198INSTRUCCIN THROW 200OTRAS INSTRUCCIONES 200INSTRUCCIONES CHECKED Y UNCHECKED 200INSTRUCCIN LOCK 201INSTRUCCIN USING 202INSTRUCCIN FIXED 204TEMA 17: ATRIBUTOS 205CONCEPTO DE ATRIBUTO 205UTILIZACIN DE ATRIBUTOS 205DEFINICIN DE NUEVOS ATRIBUTOS 207ESPECIFICACIN DEL NOMBRE DEL ATRIBUTO 207ESPECIFICACIN DEL USO DE UN ATRIBUTO 207ESPECIFICACIN DE PARMETROS VLIDOS 209LECTURA DE ATRIBUTOS EN TIEMPO DE EJECUCIN 209ATRIBUTOS DE COMPILACIN 213ATRIBUTO SYSTEM.ATTRIBUTEUSAGE 213ATRIBUTO SYSTEM.OBSOLETE 213ATRIBUTO SYSTEM.DIAGNOSTICS.CONDITIONAL 213TEMA 18: CDIGO INSEGURO 215CONCEPTO DE CDIGO INSEGURO 215COMPILACIN DE CDIGOS INSEGUROS 215MARCACIN DE CDIGOS INSEGUROS 216DEFINICIN DE PUNTEROS 217MANIPULACIN DE PUNTEROS 218OBTENCIN DE DIRECCIN DE MEMORIA. OPERADOR & 218ACCESO A CONTENIDO DE PUNTERO. OPERADOR * 219ACCESO A MIEMBRO DE CONTENIDO DE PUNTERO. OPERADOR -> 219CONVERSIONES DE PUNTEROS 220ARITMTICA DE PUNTEROS 221OPERADORES RELACIONADOS CON CDIGO INSEGURO 222OPERADOR SIZEOF. OBTENCIN DE TAMAO DE TIPO 222OPERADOR STACKALLOC. CREACIN DE TABLAS EN PILA. 223FIJACIN DE VARIABLES APUNTADAS 224Jos Antonio Gonzlez Seco Pgina 5 6. El lenguaje de programacin C# ndiceTEMA 19: DOCUMENTACIN XML 227CONCEPTO Y UTILIDAD DE LA DOCUMENTACIN XML 227INTRODUCCIN A XML 227COMENTARIOS DE DOCUMENTACIN XML 229SINTAXIS GENERAL 229EL ATRIBUTO CREF 229ETIQUETAS RECOMENDADAS PARA DOCUMENTACIN XML 231ETIQUETAS DE USO GENRICO 232ETIQUETAS RELATIVAS A MTODOS 232ETIQUETAS RELATIVAS A PROPIEDADES 233ETIQUETAS RELATIVAS A EXCEPCIONES 234ETIQUETAS RELATIVAS A FORMATO 234GENERACIN DE DOCUMENTACIN XML 236GENERACIN A TRAVS DEL COMPILADOR EN LNEA DE COMANDOS 236GENERACIN A TRAVS DE VISUAL STUDIO.NET 238ESTRUCTURA DE LA DOCUMENTACIN XML 239SEPARACIN ENTRE DOCUMENTACIN XML Y CDIGO FUENTE 241TEMA 20: EL COMPILADOR DE C# DE MICROSOFT 243INTRODUCCIN 243SINTAXIS GENERAL DE USO DEL COMPILADOR 243OPCIONES DE COMPILACIN 245OPCIONES BSICAS 245MANIPULACIN DE RECURSOS 248CONFIGURACIN DE MENSAJES DE AVISOS Y ERRORES 249FICHEROS DE RESPUESTA 251OPCIONES DE DEPURACIN 253COMPILACIN INCREMENTAL 254OPCIONES RELATIVAS AL LENGUAJE 255OTRAS OPCIONES 256ACCESO AL COMPILADOR DESDE VISUAL STUDIO.NET 258DOCUMENTACIN DE REFERENCIA 261BIBLIOGRAFA 261INFORMACIN EN INTERNET SOBRE C# 261PORTALES 262GRUPOS DE NOTICIAS Y LISTAS DE CORREO 262Jos Antonio Gonzlez Seco Pgina 6 7. El lenguaje de programacin C# Introduccin a la obraIntroduccin a la obraRequisitos previos recomendadosEn principio, para entender con facilidad esta obra es recomendable estar familiarizadocon los conceptos bsicos de programacin orientada a objetos, en particular con loslenguajes de programacin C++ o Java de los que C# deriva.Sin embargo, estos no son requisitos fundamentales para entenderla ya que cada vez queen ella se introduce algn elemento del lenguaje se definen y explican los conceptosbsicos que permiten entenderlo. An as, sigue siendo recomendable disponer de losrequisitos antes mencionados para poder moverse con mayor soltura por el libro yaprovecharlo al mximo.Estructura de la obraBsicamente el eje central de la obra es el lenguaje de programacin C#, del que no slose describe su sintaxis sino que tambin se intenta explicar cules son las razones quejustifican las decisiones tomadas en su diseo y cules son los errores ms difciles dedetectar que pueden producirse al desarrollar de aplicaciones con l. Sin embargo, los20 temas utilizados para ello pueden descomponerse en tres grandes bloques: Bloque 1: Introduccin a C# y .NET: Antes de empezar a describir el lenguajees obligatorio explicar el porqu de su existencia, y para ello es necesario antesintroducir la plataforma .NET de Microsoft con la que est muy ligado. Ese es elobjetivo de los temas 1 y 2, donde se explican las caractersticas y conceptosbsicos de C# y .NET, las novedosas aportaciones de ambos y se introduce laprogramacin y compilacin de aplicaciones en C# con el tpico Hola Mundo! Bloque 2: Descripcin del lenguaje: Este bloque constituye el grueso de laobra y est formado por los temas comprendidos entre el 3 y el 19. En ellos sedescriben pormenorizadamente los aspectos del lenguaje mostrando ejemplos desu uso, explicando su porqu y avisando de cules son los problemas msdifciles de detectar que pueden surgir al utilizarlos y cmo evitarlos. Bloque 3: Descripcin del compilador: Este ltimo bloque, formado solamentepor el tema 20, describe cmo se utiliza el compilador de C# tanto desde laventana de consola como desde la herramienta Visual Studio.NET. Como aldescribir el lenguaje, tambin se intenta dar una explicacin lo ms exhaustiva,til y fcil de entender posible del significado, porqu y aplicabilidad de lasopciones de compilacin que ofrece.Convenios de notacinJos Antonio Gonzlez Seco Pgina 7 8. El lenguaje de programacin C# Introduccin a la obraPara ayudar a resaltar la informacin clave se utilizan diferentes convenciones respectoa los tipos de letra usados para representar cada tipo de contenido. stas son: El texto correspondiente a explicaciones se ha escrito usando la fuente TimesNew Roman de 12 puntos de tamao, como es el caso de este prrafo. Los fragmentos de cdigo fuente se han escrito usando la fuente Arial de 10puntos de tamao tal y como se muestra a continuacin:class HolaMundo{static void Main(){System.Console.WriteLine(Hola Mundo!);}}Esta misma fuente es la que se usar desde las explicaciones cada vez que sehaga referencia a algn elemento del cdigo fuente. Si adems dicho elemento esuna palabra reservada del lenguaje o viene predefinido en la librera de .NET, sunombre se escribir en negrita para as resaltar el carcter especial del mismo Las referencias a textos de la interfaz del sistema operativo (nombres deficheros y directorios, texto de la lnea de comandos, etc. ) se han escrito usandola fuente Courier New de 10 puntos de tamao. Por ejemplo:csc HolaMundo.csCuando adems este tipo de texto se utilice para hacer referencia a elementospredefinidos tales como extensiones de ficheros recomendadas o nombres deaplicaciones incluidas en el SDK, se escribir en negrita. Al describirse la sintaxis de definicin de los elementos del lenguaje se usarfuente Arial de 10 puntos de tamao y se representarn en cursiva los elementosopcionales en la misma, en negrita los que deban escribirse tal cual, y sinnegrita y entre smbolos < y > los que representen de texto que deba colocarseen su lugar. Por ejemplo, cuando se dice que una clase ha de definirse as:class {}Lo que se est diciendo es que ha de escribirse la palabra reservada class,seguida de texto que represente el nombre de la clase a definir, seguido de unallave de apertura ({), seguido opcionalmente de texto que se corresponda condefiniciones de miembros y seguido de una llave de cierre (}) Si lo que se define es la sintaxis de llamada a alguna aplicacin concreta,entonces la notacin que se usar es similar a la anterior slo que en vez defuente Arial se utilizar fuente Courier New de 10 puntos de tamao.Jos Antonio Gonzlez Seco Pgina 8 9. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETTEMA 1: Introduccin a Microsoft.NETMicrosoft.NETMicrosoft.NET es el conjunto de nuevas tecnologas en las que Microsoft ha estadotrabajando durante los ltimos aos con el objetivo de obtener una plataforma sencilla ypotente para distribuir el software en forma de servicios que puedan ser suministradosremotamente y que puedan comunicarse y combinarse unos con otros de maneratotalmente independiente de la plataforma, lenguaje de programacin y modelo decomponentes con los que hayan sido desarrollados. sta es la llamada plataforma.NET, y a los servicios antes comentados se les denomina servicios Web.Para crear aplicaciones para la plataforma .NET, tanto servicios Web como aplicacionestradicionales (aplicaciones de consola, aplicaciones de ventanas, servicios de WindowsNT, etc.), Microsoft ha publicado el denominado kit de desarrollo de software conocidocomo .NET Framework SDK, que incluye las herramientas necesarias tanto para sudesarrollo como para su distribucin y ejecucin y Visual Studio.NET, que permitehacer todo la anterior desde una interfaz visual basada en ventanas. Ambas herramientaspuede descargarse gratuitamente desde http://www.msdn.microsoft.com/net, aunque laltima slo est disponible para subscriptores MSDN Universal (los no subscriptorespueden pedirlo desde dicha direccin y se les enviar gratis por correo ordinario)El concepto de Microsoft.NET tambin incluye al conjunto de nuevas aplicaciones queMicrosoft y terceros han (o estn) desarrollando para ser utilizadas en la plataforma.NET. Entre ellas podemos destacar aplicaciones desarrolladas por Microsoft tales comoWindows.NET, Hailstorm, Visual Studio.NET, MSN.NET, Office.NET, y los nuevosservidores para empresas de Microsoft (SQL Server.NET, Exchange.NET, etc.)Common Language Runtime (CLR)El Common Language Runtime (CLR) es el ncleo de la plataforma .NET. Es elmotor encargado de gestionar la ejecucin de las aplicaciones para ella desarrolladas y alas que ofrece numerosos servicios que simplifican su desarrollo y favorecen sufiabilidad y seguridad. Las principales caractersticas y servicios que ofrece el CLR son: Modelo de programacin consistente: A todos los servicios y facilidadesofrecidos por el CLR se accede de la misma forma: a travs de un modelo deprogramacin orientado a objetos. Esto es una diferencia importante respecto almodo de acceso a los servicios ofrecidos por los algunos sistemas operativosactuales (por ejemplo, los de la familia Windows), en los que a algunos serviciosse les accede a travs de llamadas a funciones globales definidas en DLLs y aotros a travs de objetos (objetos COM en el caso de la familia Windows) Modelo de programacin sencillo: Con el CLR desaparecen muchos elementoscomplejos incluidos en los sistemas operativos actuales (registro de Windows,GUIDs, HRESULTS, IUnknown, etc.) El CLR no es que abstraiga alJos Antonio Gonzlez Seco Pgina 9 10. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETprogramador de estos conceptos, sino que son conceptos que no existen en laplataforma .NET Eliminacin del infierno de las DLLs: En la plataforma .NET desaparece elproblema conocido como infierno de las DLLs que se da en los sistemasoperativos actuales de la familia Windows, problema que consiste en que alsustituirse versiones viejas de DLLs compartidas por versiones nuevas puedeque aplicaciones que fueron diseadas para ser ejecutadas usando las viejasdejen de funcionar si las nuevas no son 100% compatibles con las anteriores. Enla plataforma .NET las versiones nuevas de las DLLs pueden coexistir con lasviejas, de modo que las aplicaciones diseadas para ejecutarse usando las viejaspodrn seguir usndolas tras instalacin de las nuevas. Esto, obviamente,simplifica mucho la instalacin y desinstalacin de software. Ejecucin multiplataforma: El CLR acta como una mquina virtual,encargndose de ejecutar las aplicaciones diseadas para la plataforma .NET. Esdecir, cualquier plataforma para la que exista una versin del CLR podrejecutar cualquier aplicacin .NET. Microsoft ha desarrollado versiones delCLR para la mayora de las versiones de Windows: Windows 95, Windows 98,Windows ME, Windows NT 4.0, Windows 2000, Windows XP y Windows CE(que puede ser usado en CPUs que no sean de la familia x86) Por otro ladoMicrosoft ha firmado un acuerdo con Corel para portar el CLR a Linux ytambin hay terceros que estn desarrollando de manera independiente versionesde libre distribucin del CLR para Linux. Asmismo, dado que la arquitecturadel CLR est totalmente abierta, es posible que en el futuro se diseen versionesdel mismo para otros sistemas operativos. Integracin de lenguajes: Desde cualquier lenguaje para el que exista uncompilador que genere cdigo para la plataforma .NET es posible utilizar cdigogenerado para la misma usando cualquier otro lenguaje tal y como si de cdigoescrito usando el primero se tratase. Microsoft ha desarrollado un compilador deC# que genera cdigo de este tipo, as como versiones de sus compiladores deVisual Basic (Visual Basic.NET) y C++ (C++ con extensiones gestionadas) quetambin lo generan y una versin del intrprete de JScript (JScript.NET) quepuede interpretarlo. La integracin de lenguajes esta que es posible escribir unaclase en C# que herede de otra escrita en Visual Basic.NET que, a su vez, heredede otra escrita en C++ con extensiones gestionadas. Gestin de memoria: El CLR incluye un recolector de basura que evita que elprogramador tenga que tener en cuenta cundo ha de destruir los objetos quedejen de serle tiles. Este recolector es una aplicacin que se activa cuando sequiere crear algn objeto nuevo y se detecta que no queda memoria libre parahacerlo, caso en que el recolector recorre la memoria dinmica asociada a laaplicacin, detecta qu objetos hay en ella que no puedan ser accedidos por elcdigo de la aplicacin, y los elimina para limpiar la memoria de objetosbasura y permitir la creacin de otros nuevos. Gracias a este recolector seevitan errores de programacin muy comunes como intentos de borrado deobjetos ya borrados, agotamiento de memoria por olvido de eliminacin deobjetos intiles o solicitud de acceso a miembros de objetos ya destruidos.Jos Antonio Gonzlez Seco Pgina 10 11. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET Seguridad de tipos: El CLR facilita la deteccin de errores de programacindifciles de localizar comprobando que toda conversin de tipos que se realicedurante la ejecucin de una aplicacin .NET se haga de modo que los tiposorigen y destino sean compatibles. Aislamiento de procesos: El CLR asegura que desde cdigo perteneciente a undeterminado proceso no se pueda acceder a cdigo o datos pertenecientes a otro,lo que evita errores de programacin muy frecuentes e impide que unos procesospuedan atacar a otros. Esto se consigue gracias al sistema de seguridad de tiposantes comentado, pues evita que se pueda convertir un objeto a un tipo demayor tamao que el suyo propio, ya que al tratarlo como un objeto de mayortamao podra accederse a espacios en memoria ajenos a l que podranpertenecer a otro proceso. Tambin se consigue gracias a que no se permiteacceder a posiciones arbitrarias de memoria. Tratamiento de excepciones: En el CLR todo los errores que se puedanproducir durante la ejecucin de una aplicacin se propagan de igual manera:mediante excepciones. Esto es muy diferente a como se vena haciendo en lossistemas Windows hasta la aparicin de la plataforma .NET, donde ciertoserrores se transmitan mediante cdigos de error en formato Win32, otrosmediante HRESULTs y otros mediante excepciones.El CLR permite que excepciones lanzadas desde cdigo para .NET escrito en uncierto lenguaje se puedan capturar en cdigo escrito usando otro lenguaje, eincluye mecanismos de depuracin que pueden saltar desde cdigo escrito para.NET en un determinado lenguaje a cdigo escrito en cualquier otro. Porejemplo, se puede recorrer la pila de llamadas de una excepcin aunque staincluya mtodos definidos en otros mdulos usando otros lenguajes. Soporte multihilo: El CLR es capaz de trabajar con aplicaciones divididas enmltiples hilos de ejecucin que pueden ir evolucionando por separado enparalelo o intercalndose, segn el nmero de procesadores de la mquina sobrela que se ejecuten. Las aplicaciones pueden lanzar nuevos hilos, destruirlos,suspenderlos por un tiempo o hasta que les llegue una notificacin, enviarlesnotificaciones, sincronizarlos, etc. Distribucin transparente: El CLR ofrece la infraestructura necesaria paracrear objetos remotos y acceder a ellos de manera completamente transparente asu localizacin real, tal y como si se encontrasen en la mquina que los utiliza. Seguridad avanzada: El CLR proporciona mecanismos para restringir laejecucin de ciertos cdigos o los permisos asignados a los mismos segn suprocedendecia o el usuario que los ejecute. Es decir, puede no darse el mismonivel de confianza a cdigo procedente de Internet que a cdigo instaladolocalmente o procedente de una red local; puede no darse los mismos permisos acdigo procedente de un determinado fabricante que a cdigo de otro; y puedeno darse los mismos permisos a un mismo cdigos segn el usuario que lo estejecutando o segn el rol que ste desempee. Esto permite asegurar aladministrador de un sistema que el cdigo que se est ejecutando no puedaponer en peligro la integridad de sus archivos, la del registro de Windows, etc.Jos Antonio Gonzlez Seco Pgina 11 12. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET Interoperabilidad con cdigo antiguo: El CLR incorpora los mecanismosnecesarios para poder acceder desde cdigo escrito para la plataforma .NET acdigo escrito previamente a la aparicin de la misma y, por tanto, no preparadopara ser ejecutando dentro de ella. Estos mecanismos permiten tanto el acceso aobjetos COM como el acceso a funciones sueltas de DLLs preexistentes (comola API Win32)Como se puede deducir de las caractersticas comentadas, el CLR lo que hace esgestionar la ejecucin de las aplicaciones diseadas para la plataforma .NET. Por estarazn, al cdigo de estas aplicaciones se le suele llamar cdigo gestionado, y al cdigono escrito para ser ejecutado directamente en la plataforma .NET se le suele llamarcdigo no gestionado.Microsoft Intermediate Language (MSIL)Todos los compiladores que generan cdigo para la plataforma .NET no generan cdigomquina para CPUs x86 ni para ningn otro tipo de CPU concreta, sino que generancdigo escrito en el lenguaje intermedio conocido como Microsoft IntermediateLenguage (MSIL) El CLR da a las aplicaciones las sensacin de que se estn ejecutandosobre una mquina virtual, y precisamente MSIL es el cdigo mquina de esa mquinavirtual. Es decir, MSIL es el nico cdigo que es capaz de interpretar el CLR, y portanto cuando se dice que un compilador genera cdigo para la plataforma .NET lo quese est diciendo es que genera MSIL.MSIL ha sido creado por Microsoft tras consultar a numerosos especialistas en laescritura de compiladores y lenguajes tanto del mundo acadmico como empresarial. Esun lenguaje de un nivel de abstraccin mucho ms alto que el de la mayora de loscdigos mquina de las CPUs existentes, e incluye instrucciones que permiten trabajardirectamente con objetos (crearlos, destruirlos, inicializarlos, llamar a mtodosvirtuales, etc.), tablas y excepciones (lanzarlas, capturarlas y tratarlas)Ya se coment que el compilador de C# compila directamente el cdigo fuente a MSIL,que Microsoft ha desarrollado nuevas versiones de sus lenguajes Visual Basic (VisualBasic.NET) y C++ (C++ con extensiones gestionadas) cuyos compiladores generanMSIL, y que ha desarrollado un intrprete de JScript (JScript.NET) que genera cdigoMSIL. Pues bien, tambin hay numerosos terceros que han anunciado estar realizandoversiones para la plataforma .NET de otros lenguajes como APL, CAML, Cobol, Eiffel,Fortran, Haskell, Java (J#), Mercury, ML, Mondrian, Oberon, Oz, Pascal, Perl, Python,RPG, Scheme y Smalltalk.La principal ventaja del MSIL es que facilita la ejecucin multiplataforma y laintegracin entre lenguajes al ser independiente de la CPU y proporcionar un formatocomn para el cdigo mquina generado por todos los compiladores que generen cdigopara .NET. Sin embargo, dado que las CPUs no pueden ejecutar directamente MSIL,antes de ejecutarlo habr que convertirlo al cdigo nativo de la CPU sobre la que sevaya a ejecutar. De esto se encarga un componente del CLR conocido como compiladorJIT (Just-In-Time) o jitter que va convirtiendo dinmicamente el cdigo MSIL aejecutar en cdigo nativo segn sea necesario. Este jitter se distribuye en tres versiones:Jos Antonio Gonzlez Seco Pgina 12 13. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET jitter normal: Es el que se suele usar por defecto, y slo compila el cdigoMSIL a cdigo nativo a medida que va siendo necesario, pues as se ahorratiempo y memoria al evitarse tener que compilar innecesariamente cdigo quenunca se ejecute. Para conseguir esto, el cargador de clases del CLR sustituyeinicialmente las llamadas a mtodos de las nuevas clases que vaya cargando porllamadas a funciones auxiliares (stubs) que se encarguen de compilar elverdadero cdigo del mtodo. Una vez compilado, la llamada al stub essustituida por una llamada directa al cdigo ya compilado, con lo que posterioresllamadas al mismo no necesitarn compilacin. jitter econmico: Funciona de forma similar al jitter normal solo que no realizaninguna optimizacin de cdigo al compilar sino que traduce cada instruccinMSIL por su equivalente en el cdigo mquina sobre la que se ejecute. Estaespecialmente pensado para ser usado en dispositivos empotrados que dispongande poca potencia de CPU y poca memoria, pues aunque genere cdigo msineficiente es menor el tiempo y memoria que necesita para compilar. Es ms,para ahorrar memoria este jitter puede descargar cdigo ya compilado que llevecierto tiempo sin ejecutarse y sustituirlo de nuevo por el stub apropiado. Porestas razones, este es el jitter usado por defecto en Windows CE, sistemaoperativo que se suele incluir en los dispositivos empotrados antes mencionados.Otra utilidad del jitter econmico es que facilita la adaptacin de la plataforma.NET a nuevos sistemas porque es mucho ms sencillo de implementar que elnormal. De este modo, gracias a l es posible desarrollar rpidamente unaversin del CLR que pueda ejecutar aplicaciones gestionadas aunque sea de unaforma poco eficiente, y una vez desarrollada es posible centrarse en desarrollarel jitter normal para optimizar la ejecucin de las mismas. prejitter: Se distribuye como una aplicacin en lnea de comandos llamadangen.exe mediante la que es posible compilar completamente cualquierejecutable o librera (cualquier ensamblado en general, aunque este concepto sever ms adelante) que contenga cdigo gestionado y convertirlo a cdigonativo, de modo que posteriores ejecuciones del mismo se harn usando estaversin ya compilada y no se perder tiempo en hacer la compilacin dinmica.La actuacin de un jitter durante la ejecucin de una aplicacin gestionada puede dar lasensacin de hacer que sta se ejecute ms lentamente debido a que ha de invertirsetiempo en las compilaciones dinmicas. Esto es cierto, pero hay que tener en cuenta quees una solucin mucho ms eficiente que la usada en otras plataformas como Java, yaque en .NET cada cdigo no es interpretado cada vez que se ejecuta sino que slo escompilado la primera vez que se llama al mtodo al que pertenece. Es ms, el hecho deque la compilacin se realice dinmicamente permite que el jitter tenga acceso a muchams informacin sobre la mquina en que se ejecutar la aplicacin del que tendracualquier compilador tradicional, con lo que puede optimizar el cdigo para ellagenerado (por ejemplo, usando las instrucciones especiales del Pentium III si lamquina las admite, usando registros extra, incluyendo cdigo inline, etc.) Adems,como el recolector de basura de .NET mantiene siempre compactada la memoriadinmica las reservas de memoria se harn ms rpido, sobre todo en aplicaciones queno agoten la memoria y, por tanto, no necesiten de una recoleccin de basura. Por estasJos Antonio Gonzlez Seco Pgina 13 14. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETrazones, los ingenieros de Microsoft piensan que futuras versiones de sus jitters podrnincluso conseguir que el cdigo gestionado se ejecute ms rpido que el no gestionado.MetadatosEn la plataforma .NET se distinguen dos tipos de mdulos de cdigo compilado:ejecutables (extensin .exe) y libreras de enlace dinmico (extensin .dllgeneralmente) Ambos son ficheros que contienen definiciones de tipos de datos, y ladiferencia entre ellos es que slo los primeros disponen de un mtodo especial que sirvede punto de entrada a partir del que es posible ejecutar el cdigo que contienen haciendouna llamada desde la lnea de comandos del sistema operativo. A ambos tipos demdulos se les suele llamar ejecutables portables (PE), ya que su cdigo puedeejecutarse en cualquiera de los diferentes sistemas operativos de la familia Windowspara los que existe alguna versin del CLR.El contenido de un mdulo no slo MSIL, sino que tambin consta de otras dos reasmuy importantes: la cabecera de CLR y los metadatos: La cabecera de CLR es un pequeo bloque de informacin que indica que se tratade un mdulo gestionado e indica es la versin del CLR que necesita, cul es sufirma digital, cul es su punto de entrada (si es un ejecutable), etc. Los metadatos son un conjunto de datos organizados en forma de tablas quealmacenan informacin sobre los tipos definidos en el mdulo, los miembros destos y sobre cules son los tipos externos al mdulo a los que se les referencia en elmdulo. Los metadatos de cada modulo los genera automticamente el compiladoral crearlo, y entre sus tablas se incluyen1:Tabla DescripcinModuleDef Define las caractersticas del mdulo. Consta de un nico elementoque almacena un identificador de versin de mdulo (GUID creadopor el compilador) y el nombre de fichero que se dio al mdulo alcompilarlo (as este nombre siempre estar disponible, aunque serenombre el fichero)TypeDef Define las caractersticas de los tipos definidos en el mdulo. De cadatipo se almacena su nombre, su tipo padre, sus modificadores deacceso y referencias a los elementos de las tablas de miembroscorrespondientes a sus miembros.MethodDef Define las caractersticas de los mtodos definidos en el mdulo. Decada mtodo se guarda su nombre, signatura (por cada parmetro seincluye una referencia al elemento apropiado en la tabla ParamDef),modificadores y posicin del mdulo donde comienza el cdigo MSILde su cuerpo.ParamDef Define las caractersticas de los parmetros definidos en el mdulo. Decada parmetro se guarda su nombre y modificadores.FieldDef Define las caractersticas de los campos definidos en el mdulo. De1 No se preocupe si no entiende an algunos de los conceptos nuevos introducido en las descripciones delas tablas de metadatos, pues ms adelante se irn explicando detalladamente.Jos Antonio Gonzlez Seco Pgina 14 15. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETcada uno se almacena informacin sobre cul es su nombre, tipo ymodificadores.PropertyDef Define las caractersticas de las propiedades definidas en el mdulo.De cada una se indica su nombre, tipo, modificadores y referencias alos elementos de la tabla MethodDef correspondientes a sus mtodosset/get.EventDef Define las caractersticas de los eventos definidos en el mdulo. Decada uno se indica su nombre, tipo, modificadores. y referencias a loselementos de la tabla MethodDef correspondientes a sus mtodosadd/remove.AssemblyRef Indica cules son los ensamblados externos a los que se referencia enel mdulo. De cada uno se indica cul es su nombre de fichero (sinextensin), versin, idioma y marca de clave pblica.ModuleRef Indica cules son los otros mdulos del mismo ensamblado a los quereferencia el mdulo. De cada uno se indica cul es su nombre defichero.TypeRef Indica cules son los tipos externos a los que se referencia en elmdulo. De cada uno se indica cul es su nombre y, segn dondeestn definidos, una referencia a la posicin adecuada en la tablaAssemblyRef o en la tabla ModuleRef.MemberRef Indican cules son los miembros definidos externamente a los que sereferencia en el mdulo. Estos miembros pueden ser campos, mtodos,propiedades o eventos; y de cada uno de ellos se almacenainformacin sobre su nombre y signatura, as como una referencia a laposicin de la tabla TypeRef donde se almacena informacin relativaal tipo del que es miembro.Tabla 1: Principales tablas de metadatosNtese que el significado de los metadatos es similar al de otras tecnologas previas a laplataforma .NET como lo son los ficheros IDL. Sin embargo, los metadatos tienen dosventajas importantes sobre stas: contiene ms informacin y siempre se almacenanincrustados en el mdulo al que describen, haciendo imposible la separacin entreambos. Adems, como se ver ms adelante, es posible tanto consultar los metadatos decualquier mdulo a travs de las clases del espacio de nombres System.Reflection de laBCL como aadirles informacin adicional mediante atributos (se ver ms adelante)EnsambladosUn ensamblado es una agrupacin lgica de uno o ms mdulos o ficheros de recursos(ficheros .GIF, .HTML, etc.) que se engloban bajo un nombre comn. Un programapuede acceder a informacin o cdigo almacenados en un ensamblado sin tener porqusabe cul es el fichero en concreto donde se encuentran, por lo que los ensamblados nospermiten abstraernos de la ubicacin fsica del cdigo que ejecutemos o de los recursosque usemos. Por ejemplo, podemos incluir todos los tipos de una aplicacin en unmismo ensamblado pero colocando los ms frecuentemente usados en un cierto mduloy los menos usados en otro, de modo que slo se descarguen de Internet los ltimos sies que se van a usar.Jos Antonio Gonzlez Seco Pgina 15 16. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETTodo ensamblado contiene un manifiesto, que son metadatos con informacin sobre lascaractersticas del ensamblado. Este manifiesto puede almacenarse cualquiera de losmdulos que formen el ensamblado o en uno especficamente creado para ello, caso steltimo necesario cuando es un ensamblado satlite (slo contiene recursos)Las principales tablas incluidas en los manifiestos son las siguientes:Tabla DescripcinAssemblyDef Define las caractersticas del ensamblado. Consta de un nicoelemento que almacena el nombre del ensamblado sinextensin, versin, idioma, clave pblica y tipo de algoritmode dispersin usado para hallar los valores de dispersin de latabla FileDef.FileDef Define cules son los archivos que forman el ensamblado. Decada uno se da su nombre y valor de dispersin. Ntese queslo el mdulo que contiene el manifiesto sabr qu ficherosque forman el ensamblado, pero el resto de ficheros del mismono sabrn si pertenecen o no a un ensamblado (no contienenmetadatos que les indique si pertenecen a un ensamblado)ManifestResourceDef Define las caractersticas de los recursos incluidos en elmdulo. De cada uno se indica su nombre y modificadores deacceso. Si es un recurso incrustado se indica dnde empiezadentro del PE que lo contiene, y si es un fichero independientese indica cul es el elemento de la tabla FileDefcorrespondiente a dicho fichero.ExportedTypesDef Indica cules son los tipos definidos en el ensamblado yaccesibles desde fuera del mismo. Para ahorrar espacio slorecogen los que no pertenezcan al mdulo donde se incluye elmanifiesto, y de cada uno se indica su nombre, la posicin enla tabla FileDef del fichero donde se ha implementado y laposicin en la tabla TypeDef correspondiente a su definicin.AssemblyProccesorDef Indica en qu procesadores se puede ejecutar el ensamblado, loque puede ser til saberlo si el ensamblado contiene mduloscon cdigo nativo (podra hacerse usando C++ conextensiones gestionadas) Suele estar vaca, lo que indica que sepuede ejecutar en cualquier procesador; pero si estuviese llena,cada elemento indicara un tipo de procesador admitido segnel formato de identificadores de procesador del ficheroWinNT.h incluido con Visual Studio.NET (por ejemplo, 586 =Pentium, 2200 = Arquitectura IA64, etc.)AssemblyOSDef Indica bajo qu sistemas operativos se puede ejecutar elensamblado, lo que puede ser til si contiene mdulos contipos o mtodos disponibles slo en ciertos sistemas. Sueleestar vaca, lo que indica que se puede ejecutar en cualquierprocesador; pero si estuviese llena, indicara el identificador decada uno de los sistemas admitidos siguiendo el formato delWinNT.h de Visual Studio.NET (por ejemplo, 0 = familiaWindows 9X, 1 = familia Windows NT, etc.) y el nmero de laversin del mismo a partir de la que se admite.Tabla 2: Principales tablas de un manifiestoJos Antonio Gonzlez Seco Pgina 16 17. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETPara asegurar que no se haya alterado la informacin de ningn ensamblado se usa elcriptosistema de clave pblica RSA. Lo que se hace es calcular el cdigo de dispersinSHA-1 del mdulo que contenga el manifiesto e incluir tanto este valor cifrado conRSA (firma digital) como la clave pblica necesaria para descifrarlo en algn lugar delmdulo que se indicar en la cabecera de CLR. Cada vez que se vaya a cargar enmemoria el ensamblado se calcular su valor de dispersin de nuevo y se comprobarque es igual al resultado de descifrar el original usando su clave pblica. Si no fuese asse detectara que se ha adulterado su contenido.Para asegurar tambin que los contenidos del resto de ficheros que formen unensamblado no hayan sido alterados lo que se hace es calcular el cdigo de dispersinde stos antes de cifrar el ensamblado y guardarlo en el elemento correspondiente a cadafichero en la tabla FileDef del manifiesto. El algoritmo de cifrado usado por defecto esSHA-1, aunque en este caso tambin se da la posibilidad de usar MD5. En ambos casos,cada vez que se accede al fichero para acceder a un tipo o recurso se calcular de nuevosu valor de dispersin y se comprobar que coincida con el almacenado en FileDef.Dado que las claves pblicas son valores que ocupan muchos bytes (2048 bits), lo quese hace para evitar que los metadatos sean excesivamente grandes es no incluir en lasreferencias a ensamblados externos de la tabla AssemblyRef las claves pblicas dedichos ensamblados, sino slo los 64 ltimos bits resultantes de aplicar un algoritmo dedispersin a dichas claves. A este valor recortado se le llama marca de clave pblica.Hay dos tipos de ensamblados: ensamblados privados y ensamblados compartidos.Los privados se almacenan en el mismo directorio que la aplicacin que los usa y slopuede usarlos sta, mientras que los compartidos se almacenan en un cach deensamblado global (GAC) y pueden usarlos cualquiera que haya sido compiladareferencindolos.Los compartidos han de cifrase con RSA ya que lo que los identifica es en el GAC essu nombre (sin extensin) ms su clave pblica, lo que permite que en el GAC puedaninstalarse varios ensamblados con el mismo nombre y diferentes claves pblicas. Esdecir, es como si la clave pblica formase parte del nombre del ensamblado, razn porla que a los ensamblados as cifrados se les llama ensamblados de nombre fuerte. Estapoltica permite resolver los conflictos derivados de que se intente instalar en un mismoequipo varios ensamblados compartidos con el mismo nombre pero procedentes dedistintas empresas, pues stas tendrn distintas claves pblicas.Tambin para evitar problemas, en el GAC se pueden mantener mltiples versiones deun mismo ensamblado. As, si una aplicacin fue compilada usando una cierta versinde un determinado ensamblado compartido, cuando se ejecute slo podr hacer uso deesa versin del ensamblado y no de alguna otra ms moderna que se hubiese instaladoen el GAC. De esta forma se soluciona el problema del infierno de las DLL comentadoal principio del tema.En realidad es posible modificar tanto las polticas de bsqueda de ensamblados (porejemplo, para buscar ensamblados privados fuera del directorio de la aplicacin) comola poltica de aceptacin de ensamblados compartidos (por ejemplo, para que se hagaautomticamente uso de las nuevas versiones que se instalen de DLLs compartidas)Jos Antonio Gonzlez Seco Pgina 17 18. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETincluyendo en el directorio de instalacin de la aplicacin un fichero de configuracinen formato XML con las nuevas reglas para las mismas. Este fichero ha de llamarseigual que el ejecutable de la aplicacin pero ha de tener extensin .cfg.Librera de clase base (BCL)La Librera de Clase Base (BCL) es una librera incluida en el .NET Frameworkformada por cientos de tipos de datos que permiten acceder a los servicios ofrecidos porel CLR y a las funcionalidades ms frecuentemente usadas a la hora de escribirprogramas. Adems, a partir de estas clases prefabricadas el programador puede crearnuevas clases que mediante herencia extiendan su funcionalidad y se integren a laperfeccin con el resto de clases de la BCL. Por ejemplo, implementando ciertosinterfaces podemos crear nuevos tipos de colecciones que sern tratadas exactamenteigual que cualquiera de las colecciones incluidas en la BCL.Esta librera est escrita en MSIL, por lo que puede usarse desde cualquier lenguajecuyo compilador genere MSIL. A travs de las clases suministradas en ella es posibledesarrollar cualquier tipo de aplicacin, desde las tradicionales aplicaciones deventanas, consola o servicio de Windows NT hasta los novedosos servicios Web ypginas ASP.NET. Es tal la riqueza de servicios que ofrece que puede crearse lenguajesque carezcan de librera de clases propia y slo usen la BCL -como C#.Dado la amplitud de la BCL, ha sido necesario organizar las clases en ella incluida enespacios de nombres que agrupen clases con funcionalidades similares. Por ejemplo,los espacios de nombres ms usados son:Espacio de nombres Utilidad de los tipos de datos que contieneSystem Tipos muy frecuentemente usados, como los los tiposbsicos, tablas, excepciones, fechas, nmeros aleatorios,recolector de basura, entrada/salida en consola, etc.System.Collections Colecciones de datos de uso comn como pilas, colas,listas, diccionarios, etc.System.Data Manipulacin de bases de datos. Forman la denominadaarquitectura ADO.NET.System.IO Manipulacin de ficheros y otros flujos de datos.System.Net Realizacin de comunicaciones en red.System.Reflection Acceso a los metadatos que acompaan a los mdulos decdigo.System.Runtime.Remoting Acceso a objetos remotos.System.Security Acceso a la poltica de seguridad en que se basa el CLR.System.Threading Manipulacin de hilos.System.Web.UI.WebControls Creacin de interfaces de usuario basadas en ventanaspara aplicaciones Web.System.Winforms Creacin de interfaces de usuario basadas en ventanaspara aplicaciones estndar.System.XML Acceso a datos en formato XML.Tabla 3: Espacios de nombres de la BCL ms usadosJos Antonio Gonzlez Seco Pgina 18 19. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NETCommon Type System (CTS)El Common Type System (CTS) o Sistema de Tipo Comn es el conjunto de reglasque han de seguir las definiciones de tipos de datos para que el CLR las acepte. Esdecir, aunque cada lenguaje gestionado disponga de sus propia sintaxis para definirtipos de datos, en el MSIL resultante de la compilacin de sus cdigos fuente se ha decumplir las reglas del CTS. Algunos ejemplos de estas reglas son: Cada tipo de dato puede constar de cero o ms miembros. Cada uno de estosmiembros puede ser un campo, un mtodo una propiedad o un evento. No puede haber herencia mltiple, y todo tipo de dato ha de heredar directa oindirectamente de System.Object. Los modificadores de acceso admitidos son:Modificador Cdigo desde el que es accesible el miembropublic Cualquier cdigoprivate Cdigo del mismo tipo de datofamily Cdigo del mismo tipo de dato o de hijos de ste.assembly Cdigo del mismo ensambladofamily andassemblyCdigo del mismo tipo o de hijos de ste ubicado enel mismo ensambladofamily orassemblyCdigo del mismo tipo o de hijos de ste, o cdigoubicado en el mismo ensambladoTabla 4: Modificadores de acceso a miembros admitidos por el CTSCommon Language Specification (CLS)El Common Language Specification (CLS) o Especificacin del Lenguaje Comn esun conjunto de reglas que han de seguir las definiciones de tipos que se hagan usandoun determinado lenguaje gestionado si se desea que sean accesibles desde cualquier otrolenguaje gestionado. Obviamente, slo es necesario seguir estas reglas en lasdefiniciones de tipos y miembros que sean accesibles externamente, y no la en las delos privados. Adems, si no importa la interoperabilidad entre lenguajes tampoco esnecesario seguirlas. A continuacin se listan algunas de reglas significativas del CLS: Los tipos de datos bsicos admitidos son bool, char, byte, short, int, long, float,double, string y object Ntese pues que no todos los lenguajes tienen porquadmitir los tipos bsicos enteros sin signo o el tipo decimal como lo hace C#. Las tablas han de tener una o ms dimensiones, y el nmero de dimensiones decada tabla ha de ser fijo. Adems, han de indexarse empezando a contar desde 0. Se pueden definir tipos abstractos y tipos sellados. Los tipos sellados no puedentener miembros abstractos.Jos Antonio Gonzlez Seco Pgina 19 20. El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET Las excepciones han de derivar de System.Exception, los delegados deSystem.Delegate, las enumeraciones de System.Enum, y los tipos por valor queno sean enumeraciones de System.ValueType. Los mtodos de acceso a propiedades en que se traduzcan las definicionesget/set de stas han de llamarse de la forma get_X y set_X respectivamente,donde X es el nombre de la propiedad; los de acceso a indizadores han detraducirse en mtodos get_Item y setItem; y en el caso de los eventos, susdefiniciones add/remove han de traducirse en mtodos de add_X y remove_X. En las definiciones de atributos slo pueden usarse enumeraciones o datos de lossiguientes tipos: System.Type, string, char, bool, byte, short, int, long, float,double y object. En un mismo mbito no se pueden definir varios identificadores cuyos nombresslo difieran en la capitalizacin usada. De este modo se evitan problemas alacceder a ellos usando lenguajes no sensibles a maysculas. Las enumeraciones no pueden implementar interfaces, y todos sus campos hande ser estticos y del mismo tipo. El tipo de los campos de una enumeracin slopuede ser uno de estos cuatro tipos bsicos: byte, short, int o long.Jos Antonio Gonzlez Seco Pgina 20 21. El lenguaje de programacin C# Tema 2: Introduccin a C#Tema 2: Introduccin a C#Origen y necesidad de un nuevo lenguajeC# (ledo en ingls C Sharp y en espaol C Almohadilla) es el nuevo lenguaje depropsito general diseado por Microsoft para su plataforma .NET. Sus principalescreadores son Scott Wiltamuth y Anders Hejlsberg, ste ltimo tambin conocido porhaber sido el diseador del lenguaje Turbo Pascal y la herramienta RAD Delphi.Aunque es posible escribir cdigo para la plataforma .NET en muchos otros lenguajes,C# es el nico que ha sido diseado especficamente para ser utilizado en ella, por loque programarla usando C# es mucho ms sencillo e intuitivo que hacerlo concualquiera de los otros lenguajes ya que C# carece de elementos heredados innecesariosen .NET. Por esta razn, se suele decir que C# es el lenguaje nativo de .NETLa sintaxis y estructuracin de C# es muy similar a la C++, ya que la intencin deMicrosoft con C# es facilitar la migracin de cdigos escritos en estos lenguajes a C# yfacilitar su aprendizaje a los desarrolladores habituados a ellos. Sin embargo, susencillez y el alto nivel de productividad son equiparables a los de Visual Basic.Un lenguaje que hubiese sido ideal utilizar para estos menesteres es Java, pero debido aproblemas con la empresa creadora del mismo -Sun-, Microsoft ha tenido quedesarrollar un nuevo lenguaje que aadiese a las ya probadas virtudes de Java lasmodificaciones que Microsoft tena pensado aadirle para mejorarlo an ms y hacerloun lenguaje orientado al desarrollo de componentes.En resumen, C# es un lenguaje de programacin que toma las mejores caractersticas delenguajes preexistentes como Visual Basic, Java o C++ y las combina en uno solo. Elhecho de ser relativamente reciente no implica que sea inmaduro, pues Microsoft haescrito la mayor parte de la BCL usndolo, por lo que su compilador es el ms depuradoy optimizado de los incluidos en el .NET Framework SDKCaractersticas de C#Con la idea de que los programadores ms experimentados puedan obtener una visingeneral del lenguaje, a continuacin se recoge de manera resumida las principalescaractersticas de C# Alguna de las caractersticas aqu sealadas no son exactamentepropias del lenguaje sino de la plataforma .NET en general. Sin embargo, tambin secomentan aqu tambin en tanto que tienen repercusin directa en el lenguaje, aunque seindicar explcitamente cules son este tipo de caractersticas cada vez que se toquen: Sencillez: C# elimina muchos elementos que otros lenguajes incluyen y que soninnecesarios en .NET. Por ejemplo:Jos Antonio Gonzlez Seco Pgina 21 22. El lenguaje de programacin C# Tema 2: Introduccin a C#o El cdigo escrito en C# es autocontenido, lo que significa que nonecesita de ficheros adicionales al propio fuente tales como ficheros decabecera o ficheros IDLo El tamao de los tipos de datos bsicos es fijo e independiente delcompilador, sistema operativo o mquina para quienes se compile (nocomo en C++), lo que facilita la portabilidad del cdigo.o No se incluyen elementos poco tiles de lenguajes como C++ tales comomacros, herencia mltiple o la necesidad de un operador diferente delpunto (.) acceder a miembros de espacios de nombres (::) Modernidad: C# incorpora en el propio lenguaje elementos que a lo largo delos aos ha ido demostrndose son muy tiles para el desarrollo de aplicacionesy que en otros lenguajes como Java o C++ hay que simular, como un tipo bsicodecimal que permita realizar operaciones de alta precisin con reales de 128 bits(muy til en el mundo financiero), la inclusin de una instruccin foreach quepermita recorrer colecciones con facilidad y es ampliable a tipos definidos por elusuario, la inclusin de un tipo bsico string para representar cadenas o ladistincin de un tipo bool especfico para representar valores lgicos. Orientacin a objetos: Como todo lenguaje de programacin de propsitogeneral actual, C# es un lenguaje orientado a objetos, aunque eso es ms bienuna caracterstica del CTS que de C#. Una diferencia de este enfoque orientado aobjetos respecto al de otros lenguajes como C++ es que el de C# es ms puro entanto que no admiten ni funciones ni variables globales sino que todo el cdigo ydatos han de definirse dentro de definiciones de tipos de datos, lo que reduceproblemas por conflictos de nombres y facilita la legibilidad del cdigo.C# soporta todas las caractersticas propias del paradigma de programacinorientada a objetos: encapsulacin, herencia y polimorfismo.En lo referente a la encapsulacin es importante sealar que aparte de los tpicosmodificadores public, private y protected, C# aade un cuarto modificadorllamado internal, que puede combinarse con protected e indica que al elemento acuya definicin precede slo puede accederse desde su mismo ensamblado.Respecto a la herencia -a diferencia de C++ y al igual que Java- C# slo admiteherencia simple de clases ya que la mltiple provoca ms quebraderos de cabezaque facilidades y en la mayora de los casos su utilidad puede ser simulada confacilidad mediante herencia mltiple de interfaces. De todos modos, esto vuelvea ser ms bien una caracterstica propia del CTS que de C#.Por otro lado y a diferencia de Java, en C# se ha optado por hacer que todos losmtodos sean por defecto sellados y que los redefinibles hayan de marcarse conel modificador virtual (como en C++), lo que permite evitar errores derivados deredefiniciones accidentales. Adems, un efecto secundario de esto es que lasllamadas a los mtodos sern ms eficientes por defecto al no tenerse que buscaren la tabla de funciones virtuales la implementacin de los mismos a la que se hade llamar. Otro efecto secundario es que permite que las llamadas a los mtodosJos Antonio Gonzlez Seco Pgina 22 23. El lenguaje de programacin C# Tema 2: Introduccin a C#virtuales se puedan hacer ms eficientemente al contribuir a que el tamao dedicha tabla se reduzca. Orientacin a componentes: La propia sintaxis de C# incluye elementospropios del diseo de componentes que otros lenguajes tienen que simularmediante construcciones ms o menos complejas. Es decir, la sintaxis de C#permite definir cmodamente propiedades (similares a campos de accesocontrolado), eventos (asociacin controlada de funciones de respuesta anotificaciones) o atributos (informacin sobre un tipo o sus miembros) Gestin automtica de memoria: Como ya se coment, todo lenguaje de .NETtiene a su disposicin el recolector de basura del CLR. Esto tiene el efecto en ellenguaje de que no es necesario incluir instrucciones de destruccin de objetos.Sin embargo, dado que la destruccin de los objetos a travs del recolector debasura es indeterminista y slo se realiza cuando ste se active ya sea por faltade memoria, finalizacin de la aplicacin o solicitud explcita en el fuente-, C#tambin proporciona un mecanismo de liberacin de recursos determinista atravs de la instruccin using. Seguridad de tipos: C# incluye mecanismos que permiten asegurar que losaccesos a tipos de datos siempre se realicen correctamente, lo que permite evitaque se produzcan errores difciles de detectar por acceso a memoria noperteneciente a ningn objeto y es especialmente necesario en un entornogestionado por un recolector de basura. Para ello se toman medidas del tipo:o Slo se admiten conversiones entre tipos compatibles. Esto es, entre untipo y antecesores suyos, entre tipos para los que explcitamente se hayadefinido un operador de conversin, y entre un tipo y un tipo hijo suyodel que un objeto del primero almacenase una referencia del segundo(downcasting) Obviamente, lo ltimo slo puede comprobarlo en tiempode ejecucin el CLR y no el compilador, por lo que en realidad el CLR yel compilador colaboran para asegurar la correccin de las conversiones.o No se pueden usar variables no inicializadas. El compilador da a loscampos un valor por defecto consistente en ponerlos a cero y controlamediante anlisis del flujo de control del fuente que no se lea ningunavariable local sin que se le haya asignado previamente algn valor.o Se comprueba que todo acceso a los elementos de una tabla se realicecon ndices que se encuentren dentro del rango de la misma.o Se puede controlar la produccin de desbordamientos en operacionesaritmticas, informndose de ello con una excepcin cuando ocurra. Sinembargo, para conseguirse un mayor rendimiento en la aritmtica estascomprobaciones no se hacen por defecto al operar con variables sino slocon constantes (se pueden detectar en tiempo de compilacin)o A diferencia de Java, C# incluye delegados, que son similares a lospunteros a funciones de C++ pero siguen un enfoque orientado a objetos,pueden almacenar referencias a varios mtodos simultneamente, y seJos Antonio Gonzlez Seco Pgina 23 24. El lenguaje de programacin C# Tema 2: Introduccin a C#comprueba que los mtodos a los que apunten tengan parmetros y valorde retorno del tipo indicado al definirlos.o Pueden definirse mtodos que admitan un nmero indefinido deparmetros de un cierto tipo, y a diferencia lenguajes como C/C++, enC# siempre se comprueba que los valores que se les pasen en cadallamada sean de los tipos apropiados. Instrucciones seguras: Para evitar errores muy comunes, en C# se hanimpuesto una serie de restricciones en el uso de las instrucciones de control mscomunes. Por ejemplo, la guarda de toda condicin ha de ser una expresincondicional y no aritmtica, con lo que se evitan errores por confusin deloperador de igualdad (==) con el de asignacin (=); y todo caso de un switch hade terminar en un break o goto que indique cul es la siguiente accin a realizar,lo que evita la ejecucin accidental de casos y facilita su reordenacin. Sistema de tipos unificado: A diferencia de C++, en C# todos los tipos de datosque se definan siempre derivarn, aunque sea de manera implcita, de una clasebase comn llamada System.Object, por lo que dispondrn de todos losmiembros definidos en sta clase (es decir, sern objetos)A diferencia de Java, en C# esto tambin es aplicable a los tipos de datos bsicosAdems, para conseguir que ello no tenga una repercusin negativa en su nivelde rendimiento, se ha incluido un mecanismo transparente de boxing y unboxingcon el que se consigue que slo sean tratados como objetos cuando la situacinlo requiera, y mientras tanto puede aplicrseles optimizaciones especficas.El hecho de que todos los tipos del lenguaje deriven de una clase comn facilitaenormemente el diseo de colecciones genricas que puedan almacenar objetosde cualquier tipo. Extensibilidad de tipos bsicos: C# permite definir, a travs de estructuras,tipos de datos para los que se apliquen las mismas optimizaciones que para lostipos de datos bsicos. Es decir, que se puedan almacenar directamente en pila(luego su creacin, destruccin y acceso sern ms rpidos) y se asignen porvalor y no por referencia. Para conseguir que lo ltimo no tenga efectosnegativos al pasar estructuras como parmetros de mtodos, se da la posibilidadde pasar referencias a pila a travs del modificador de parmetro ref. Extensibilidad de operadores: Para facilitar la legibilidad del cdigo yconseguir que los nuevos tipos de datos bsicos que se definan a travs de lasestructuras estn al mismo nivel que los bsicos predefinidos en el lenguaje, aligual que C++ y a diferencia de Java, C# permite redefinir el significado de lamayora de los operadores -incluidos los de conversin, tanto para conversionesimplcitas como explcitas- cuando se apliquen a diferentes tipos de objetos.Las redefiniciones de operadores se hacen de manera inteligente, de modo que apartir de una nica definicin de los operadores ++ y -- el compilador puedededucir automticamente como ejecutarlos de manera prefijas y postifja; ydefiniendo operadores simples (como +), el compilador deduce cmo aplicar suJos Antonio Gonzlez Seco Pgina 24 25. El lenguaje de programacin C# Tema 2: Introduccin a C#versin de asignacin compuesta (+=) Adems, para asegurar la consistencia, elcompilador vigila que los operadores con opuesto siempre se redefinan porparejas (por ejemplo, si se redefine ==, tambin hay que redefinir !=)Tambin se da la posibilidad, a travs del concepto de indizador, de redefinir elsignificado del operador [] para los tipos de dato definidos por el usuario, con loque se consigue que se pueda acceder al mismo como si fuese una tabla. Esto esmuy til para trabajar con tipos que acten como colecciones de objetos. Extensibilidad de modificadores: C# ofrece, a travs del concepto deatributos, la posibilidad de aadir a los metadatos del mdulo resultante de lacompilacin de cualquier fuente informacin adicional a la generada por elcompilador que luego podr ser consultada en tiempo ejecucin a travs de lalibrera de reflexin de .NET . Esto, que ms bien es una caracterstica propia dela plataforma .NET y no de C#, puede usarse como un mecanismo para definirnuevos modificadores. Versionable: C# incluye una poltica de versionado que permite crear nuevasversiones de tipos sin temor a que la introduccin de nuevos miembrosprovoquen errores difciles de detectar en tipos hijos previamente desarrolladosy ya extendidos con miembros de igual nombre a los recin introducidos.Si una clase introduce un nuevo mtodo cuyas redefiniciones deban seguir laregla de llamar a la versin de su padre en algn punto de su cdigo,difcilmente seguiran esta regla miembros de su misma signatura definidos enclases hijas previamente a la definicin del mismo en la clase padre; o siintroduce un nuevo campo con el mismo nombre que algn mtodo de una clasehija, la clase hija dejar de funcionar. Para evitar que esto ocurra, en C# setoman dos medidas:o Se obliga a que toda redefinicin deba incluir el modificador override,con lo que la versin de la clase hija nunca sera considerada como unaredefinicin de la versin de miembro en la clase padre ya que noincluira override. Para evitar que por accidente un programador incluyaeste modificador, slo se permite incluirlo en miembros que tengan lamisma signatura que miembros marcados como redefinibles mediante elmodificador virtual. As adems se evita el error tan frecuente en Java decreerse haber redefinido un miembro, pues si el miembro con override noexiste en la clase padre se producir un error de compilacin.o Si no se considera redefinicin, entonces se considera que lo que sedesea es ocultar el mtodo de la clase padre, de modo que para la clasehija sea como si nunca hubiese existido. El compilador avisar de estadecisin a travs de un mensaje de aviso que puede suprimirseincluyendo el modificador new en la definicin del miembro en la clasehija para as indicarle explcitamente la intencin de ocultacin. Eficiente: En principio, en C# todo el cdigo incluye numerosas restriccionespara asegurar su seguridad y no permite el uso de punteros. Sin embargo, y adiferencia de Java, en C# es posible saltarse dichas restricciones manipulandoJos Antonio Gonzlez Seco Pgina 25 26. El lenguaje de programacin C# Tema 2: Introduccin a C#objetos a travs de punteros. Para ello basta marcar regiones de cdigo comoinseguras (modificador unsafe) y podrn usarse en ellas punteros de formasimilar a cmo se hace en C++, lo que puede resultar vital para situacionesdonde se necesite una eficiencia y velocidad procesamiento muy grandes. Compatible: Para facilitar la migracin de programadores, C# no slo mantieneuna sintaxis muy similar a C, C++ o Java que permite incluir directamente encdigo escrito en C# fragmentos de cdigo escrito en estos lenguajes, sino que elCLR tambin ofrece, a travs de los llamados Platform Invocation Services(PInvoke), la posibilidad de acceder a cdigo nativo escrito como funcionessueltas no orientadas a objetos tales como las DLLs de la API Win32. Nteseque la capacidad de usar punteros en cdigo inseguro permite que se puedaacceder con facilidad a este tipo de funciones, ya que stas muchas vecesesperan recibir o devuelven punteros.Tambin es posible acceder desde cdigo escrito en C# a objetos COM. Parafacilitar esto, el .NET Framework SDK incluye una herramientas llamadastlbimp y regasm mediante las que es posible generar automticamente clasesproxy que permitan, respectivamente, usar objetos COM desde .NET como si deobjetos .NET se tratase y registrar objetos .NET para su uso desde COM.Finalmente, tambin se da la posibilidad de usar controles ActiveX desde cdigo.NET y viceversa. Para lo primero se utiliza la utilidad aximp, mientras que paralo segundo se usa la ya mencionada regasm.Escritura de aplicacionesAplicacin bsica Hola Mundo!Bsicamente una aplicacin en C# puede verse como un conjunto de uno o msficheros de cdigo fuente con las instrucciones necesarias para que la aplicacinfuncione como se desea y que son pasados al compilador para que genere un ejecutable.Cada uno de estos ficheros no es ms que un fichero de texto plano escrito usandocaracteres Unicode y siguiendo la sintaxis propia de C#.Como primer contacto con el lenguaje, nada mejor que el tpico programa de iniciacinHola Mundo! que lo nico que hace al ejecutarse es mostrar por pantalla el mensajeHola Mundo! Su cdigo es:21: class HolaMundo2: {3: static void Main()4: {5: System.Console.WriteLine(Hola Mundo!);6: }7: }2 Los nmeros de lnea no forman parte del cdigo sino que slo se incluyen para facilitar su posteriorexplicacin.Jos Antonio Gonzlez Seco Pgina 26 27. El lenguaje de programacin C# Tema 2: Introduccin a C#Todo el cdigo escrito en C# se ha de escribir dentro de una definicin de clase, y loque en la lnea 1: se dice es que se va a definir una clase (class) de nombre HolaMundo1cuya definicin estar comprendida entre la llave de apertura de la lnea 2: y sucorrespondiente llave de cierre en la lnea lnea 7:Dentro de la definicin de la clase (lnea 3:) se define un mtodo de nombre Main cuyocdigo es el indicado entre la llave de apertura de la lnea 4: y su respectiva llave decierre (lnea 6:) Un mtodo no es ms que un conjunto de instrucciones a las que se lesasocia un nombre, de modo que para posteriormente ejecutarlas baste referenciarlas porsu nombre en vez de tener que reescribirlas.La partcula que antecede al nombre del mtodo indica cul es el tipo de valor que sedevuelve tras la ejecucin del mtodo, y en este caso es void que significa que no sedevuelve nada. Por su parte, los parntesis que se colocado tras el nombre del mtodoindican cules son los parmetros ste toma, y como en este caso estn vacos ellosignifica que el mtodo no toma parmetros. Los parmetros de un mtodo permitenvariar el resultado de su ejecucin segn los valores que se les d en cada llamada.La palabra static que antecede a la declaracin del tipo de valor devuelto es unmodificador del significado de la declaracin de mtodo que indica que el mtodo estasociado a la clase dentro de la que se define y no a los objetos que se creen a partir deella. Main() es lo que es denomina el punto de entrada de la aplicacin, que no es msque el mtodo por el que comenzar su ejecucin. Necesita del modificador static paraevitar que para llamarlo haya que crear algn objeto de la clase donde se haya definido.Finalmente, la lnea 5: contiene la instruccin con el cdigo a ejecutar, que lo que sehace es solicitar la ejecucin del mtodo WriteLine() de la clase Console definida en elespacio de nombres System pasndole como parmetro la cadena de texto con elcontenido Hola Mundo! Ntese que las cadenas de textos son secuencias de caracteresdelimitadas por comillas dobles aunque dichas comillas no forman parte de la cadena.Por su parte, un espacio de nombres puede considerarse que es algo similar para lasclases a lo que un directorio es para los ficheros; es decir, es una forma de agruparlas.El mtodo WriteLine() se usar muy a menudo en los prximos temas, por lo que esconveniente sealar ahora que una forma de llamarlo que se utilizar en repetidasocasiones consiste en pasarle un nmero indefinido de otros parmetros de cualquiertipo e incluir en el primero subcadenas de la forma {i}. Con ello se consigue que semuestre por la ventana de consola la cadena que se le pasa como primer parmetro perosustituyndole las subcadenas {i} por el valor convertido en cadena de texto delparmetro que ocupe la posicin i+2 en la llamada a WriteLine(). Por ejemplo, lasiguiente instruccin mostrara Tengo 5 aos por pantalla si x valiese 5:System.Console.WriteLine(Tengo {0} aos, x);Para indicar cmo convertir cada objeto en un cadena de texto basta redefinir su mtodoToString(), aunque esto es algo que no se ver hasta el Tema 5: Clases.Antes de seguir es importante resaltar que C# es sensible a las maysculas, los quesignifica que no da igual la capitalizacin con la que se escriban los identificadores. Esdecir, no es lo mismo escribir Console que COnsole o CONSOLE, y si se hace de algunade las dos ltimas formas el compilador producir un error debido a que en el espacio deJos Antonio Gonzlez Seco Pgina 27 28. El lenguaje de programacin C# Tema 2: Introduccin a C#nombres System no existe ninguna clase con dichos nombres. En este sentido, cabesealar que un error comn entre programadores acostumbrados a Java es llamar alpunto de entrada main en vez de Main, lo que provoca un error al compilar ejecutables entanto que el compilador no detectar ninguna definicin de punto de entrada.Puntos de entradaYa se ha dicho que el punto de entrada de una aplicacin es un mtodo de nombreMain que contendr el cdigo por donde se ha de iniciar la ejecucin de la misma. Hastaahora slo se ha visto una versin de Main() que no toma parmetros y tiene como tipode retorno void, pero en realidad todas sus posibles versiones son:static void Main()static int Main()static int Main(string[] args)static void Main(string[] args)Como se ve, hay versiones de Main() que devuelven un valor de tipo int. Un int no esms que un tipo de datos capaz de almacenar valor enteros comprendidos entre 2.1471483.648 y 2.1471483.647, y el nmero devuelto por Main() sera interpretadocomo cdigo de retorno de la aplicacin. ste valor suele usarse para indicar si laaplicacin a terminado con xito (generalmente valor 0) o no (valor segn la causa de laterminacin anormal), y en el Tema 8: Mtodos se explicar como devolver valores.Tambin hay versiones de Main() que toman un parmetro donde se almacenar la listade argumentos con los que se llam a la aplicacin, por lo que slo es til usar estasversiones del punto de entrada si la aplicacin va a utilizar dichos argumentos para algo.El tipo de este parmetro es string[], lo que significa que es una tabla de cadenas detexto (en el Tema 5: Campos se explicar detenidamente qu son las tablas y lascadenas), y su nombre -que es el que habr de usarse dentro del cdigo de Main() parahacerle referencia- es args en el ejemplo, aunque podra drsele cualquier otroCompilacin en lnea de comandosUna vez escrito el cdigo anterior con algn editor de textos como el Bloc de Notasde Windows- y almacenado en formato de texto plano en un fichero HolaMundo.cs3,para compilarlo basta abrir una ventana de consola (MS-DOS en Windows), colocarseen el directorio donde se encuentre y pasrselo como parmetro al compilador as:csc HolaMundo.cscsc.exe es el compilador de C# incluido en el .NET Framework SDK para Windowsde Microsoft, y es posible llamarlo desde cualquier directorio en tanto que al instalarlose aade una referencia al mismo en el path. Si utiliza otros compiladores de C# puedeque varie la forma en que se realice la compilacin, por lo que lo que aqu se explica enprincipio slo podra ser vlido para el compilador de Microsoft para Windows.3 El nombre que se d al fichero puede ser cualquiera, aunque se recomienda darle la extensin .cs yaque es la utilizada por convenioJos Antonio Gonzlez Seco Pgina 28 29. El lenguaje de programacin C# Tema 2: Introduccin a C#Tras la compilacin se obtendra un ejecutable llamado HolaMundo.exe cuya ejecucinproducira la siguiente salida por la ventana de consola:Hola Mundo!Si la aplicacin que se vaya a compilar no utilizase la ventana de consola para mostrarsu salida sino una interfaz grfica de ventanas, entonces habra que compilarla pasandoal compilador la opcin /t con el valor winexe antes del nombre del fichero acompilar. Si no se hiciese as se abrra la ventana de consola cada vez que ejecutase laaplicacin de ventanas, lo que suele ser indeseable en este tipo de aplicaciones. As,para compilar Ventanas.cs como ejecutable de ventanas sera conveniente escribir:csc /t:winexe Ventanas.csNtese que aunque el nombre winexe d la sensacin de que este valor para la opcin/t slo permite generar ejecutables de ventanas, en realidad lo que permite es generarejecutables sin ventana de consola asociada. Por tanto, tambin puede usarse paragenerar ejecutables que no tengan ninguna interfaz asociada, ni de consola ni grfica.Si en lugar de un ejecutable -ya sea de consola o de ventanas- se desea obtener unalibrera, entonces al compilar hay que pasar al compilador la opcin /t con el valorlibrary. Por ejemplo, siguiendo con el ejemplo inicial habra que escribir:csc /t:library HolaMundo.csEn este caso se generara un fichero HolaMundo.dll cuyos tipos de datos podranutilizarse desde otros fuentes pasando al compilador una referencia a los mismosmediante la opcin /r. Por ejemplo, para compilar como ejecutable un fuente A.cs queuse la clase HolaMundo de la librera HolaMundo.dll se escribira:csc /r:HolaMundo.dll A.csEn general /r permite referenciar a tipos definidos en cualquier ensamblado, por lo queel valor que se le indique tambin puede ser el nombre de un ejecutable. Adems, encada compilacin es posible referenciar mltiples ensamblados ya sea incluiyendo laopcin /r una vez por cada uno o incluiyendo mltiples referencias en una nicaopcin /r usando comas o puntos y comas como separadores. Por ejemplo, lassiguientes tres llamadas al compilador son equivalentes:csc /r:HolaMundo.dll;Otro.dll;OtroMs.exe A.cscsc /r:HolaMundo.dll,Otro.dll,OtroMs.exe A.cscsc /t:HolaMundo.dll /r:Otro.dll /r:OtroMs.exe A.csHay que sealar que aunque no se indique nada, en toda compilacin siempre sereferencia por defecto a la librera mscorlib.dll de la BCL, que incluye los tipos deuso ms frecuente. Si se usan tipos de la BCL no incluidos en ella habr que incluir alcompilar referencias a las libreras donde estn definidos (en la documentacin del SDKsobre cada tipo de la BCL puede encontrar informacin sobre donde se defini)Tanto las libreras como los ejecutables son ensamblados. Para generar un mdulo decdigo que no forme parte de ningn ensamblado sino que contenga definiciones detipos que puedan aadirse a ensamblados que se compilen posteriormente, el valor queha de darse al compilar a la opcin /t es module. Por ejemplo:Jos Antonio Gonzlez Seco Pgina 29 30. El lenguaje de programacin C# Tema 2: Introduccin a C#csc /t:module HolaMundo.csCon la instruccin anterior se generara un mdulo llamado HolaMundo.netmoduleque podra ser aadido a compilaciones de ensamblados incluyndolo como valor de laopcin /addmodule. Por ejemplo, para aadir el mdulo anterior a la compilacin delfuente librera Lib.cs como librera se escribira:csc /t:library /addmodule:HolaMundo.netmodule Lib.csAunque hasta ahora todas las compilaciones de ejemplo se han realizado utilizando unnico fichero de cdigo fuente, en realidad nada impide que se puedan utilizar ms. Porejemplo, para compilar los ficheros A.cs y B.cs en una librera A.dll se ejecutara:csc /t:library A.cs B.csNtese que el nombre que por defecto se d al ejecutable generado siempre es igual aldel primer fuente especificado pero con la extensin propia del tipo de compilacinrealizada (.exe para ejecutables, .dll para libreras y .netmodule para mdulos) Sinembargo, puede especificrse como valor en la opcin /out del compilador cualquierotro tal y como muestra el siguiente ejemplo que compila el fichero A.cs como unalibrera de nombre Lib.exe:csc /t:library /out:Lib.exe A.csVase que aunque se haya dado un nombre terminado en .exe al fichero resultante,ste sigue siendo una librera y no un ejecutable e intentar ejecutarlo producira unmensaje de error. Obviamente no tiene mucho sentido darle esa extensin, y slo se leha dado en este ejemplo para demostrar que, aunque recomendable, la extensin delfichero no tiene porqu corresponderse realmente con el tipo de fichero del que se trate.A la hora de especificar ficheros a compilar tambin es pueden utilizar los caracteres decomodn tpicos del sistema operativo. Por ejemplo, para compilar todos los ficheroscon extensin .cs del directorio actual en una librera llamada Varios.dll se hara:csc /t:library /out:varios.dll *.csCon lo que hay que tener cuidado, y en especial al compilar varios fuentes, es con queno se compilen a la vez ms de un tipo de dato con punto de entrada, pues entonces elcompilador no sabra cul usar como inicio de la aplicacin. Para orientarlo, puedeespecificarse como valor de la opcin /main el nombre del tipo que contenga el Main()ha usar como punto de entrada. As, para compilar los ficheros A.cs y B.cs en unejecutable cuyo punto de entrada sea el definido en el tipo Principal, habra que escribir:csc /main:Principal A.cs B.csObviamente, para que esto funcione A.cs o B.cs tiene que contener alguna definicinde algn tipo llamado Principal con un nico mtodo vlido como punto de entrada.(obviamente si contiene varias se volvera a tener el problema de no saber cul usar)Compilacin con Visual Studio.NETJos Antonio Gonzlez Seco Pgina 30 31. El lenguaje de programacin C# Tema 2: Introduccin a C#Para compilar una aplicacin en Visual Studio.NET primero hay que incluirla dentro dealgn proyecto. Para ello basta pulsar el botn New Project en la pgina de inicio quese muestra nada ms arrancar dicha herramienta, tras lo que se obtendr una pantallacon el aspecto mostrado en la Ilustracin 1.En el recuadro de la ventana mostrada etiquetado como Project Types se ha deseleccionar el tipo de proyecto a crear. Obviamente, si se va a trabajar en C# la opcinque habr que escoger en la misma ser siempre Visual C# Projects.En el recuadro Templates se ha de seleccionar la plantilla correspondiente al subtipode proyecto dentro del tipo indicado en Project Types que se va a realizar. Pararealizar un ejecutable de consola, como es nuestro caso, hay que seleccionar el iconoetiquetado como Console Application. Si se quisiese realizar una librera habra queseleccionar Class Library, y si se quisies realizar un ejecutable de ventanas habraque seleccionar Windows Application. Ntese que no se ofrece ninguna plantilla pararealizar mdulos, lo que se debe a que desde Visual Studio.NET no pueden crearse.Por ltimo, en el recuadro de texto Name se ha de escribir el nombre a dar al proyecto yen Location el del directorio base asociado al mismo. Ntese que bajo de Locationaparecer un mensaje informando sobre cual ser el directorio donde finalmente sealmacenarn los archivos del proyecto, que ser el resultante de concatenar la rutaespecificada para el directorio base y el nombre del proyecto.Ilustracin 1: Ventana de creacin de nuevo proyecto en Visual Studio.NETUna vez configuradas todas estas opciones, al pulsar botn OK Visual Studio creartoda la infraestructura adecuada para empezar a trabajar cmodamente en el proyecto.Como puede apreciarse en la Ilustracin 2, esta infraestructura consistir en lageneracin de un fuente que servir de plantilla para la realizacin de proyectos del tipoelegido (en nuestro caso, aplicaciones de consola en C#):Jos Antonio Gonzlez Seco Pgina 31 32. El lenguaje de programacin C# Tema 2: Introduccin a C#Ilustracin 2: Plantilla para aplicaciones de consola generada por Visual Studio.NETA partir de esta plantilla, escribir el cdigo de la aplicacin de ejemplo es tan sencillocon simplemente teclear System.Console.WriteLine(Hola Mundo!) dentro de la definicindel mtodo Main() creada por Visual Studio.NET. Claro est, otra posibilidad es borrartoda la plantilla y sustituirla por el cdigo para HolaMundo mostrado anteriormente.Sea haga como se haga, para compilar y ejecutar tras ello la aplicacin slo hay quepulsar CTRL+F5 o seleccionar Debug Start Without Debugging en el menprincipal de Visual Studio.NET. Para slo compilar el proyecto, entonces hay queseleccionar Build Rebuild All. De todas formas, en ambos casos el ejecutablegenerado se almacenar en el subdirectorio BinDebug del directorio del proyecto.En el extremo derecho de la ventana principal de Visual Studio.NET puede encontrar eldenominado Solution Explorer (si no lo encuentra, seleccione View SolutionExplorer), que es una herramienta que permite consultar cules son los archivos queforman el proyecto. Si selecciona en l el icono correspondiente al proyecto en queestamos trabajando y pulsa View Property Pages obtendr una hoja depropiedades del proyecto con el aspecto mostrado en la Ilustracin 3:Jos Antonio Gonzlez Seco Pgina 32 33. El lenguaje de programacin C# Tema 2: Introduccin a C#Ilustracin 3: Hoja de propiedades del proyecto en Visual Studio.NETEsta ventana permite configurar de manera visual la mayora de opciones con las que sellamar al compilador en lnea de comandos. Por ejemplo, para cambiar el nombre delfichero de salida (opcin /out) se indica su nuevo nombre en el cuadro de texto CommonProperties General Assembly Name; para cambiar el tipo de proyecto agenerar (opcin /t) se utiliza Common Properties General Output Type(como ver si intenta cambiarlo, no es posible generar mdulos desde VisualStudio.NET); y el tipo que contiene el punto de entrada a utilizar (opcin /main) seindica en Common Properties General Startup ObjectFinalemente, para aadir al proyecto referencias a ensamblados externos (opcin /r)basta seleccionar Project Add Reference en el men principal de VS.NET.Jos Antonio Gonzlez Seco Pgina 33 34. El lenguaje de programacin C# Tema 2: Introduccin a C#Jos Antonio Gonzlez Seco Pgina 34 35. El lenguaje de programacin C# Tema 3: El PreprocesadorTEMA 3: EL PREPROCESADORConcepto de preprocesadorEl preprocesado es un paso previo4 a la compilacin mediante el que es posiblecontrolar la forma en que se realizar sta. El preprocesador es el mdulo auxiliar queutiliza el compilador para realizar estas tareas, y lo que finalmente el compiladorcompila es el resultado de aplicar el preprocesador al fichero de texto fuente, resultadoque tambin es un fichero de texto. Ntese pues, que mientras que el compilador haceuna traduccin de texto a binario, lo que el preprocesador hace es una traduccin detexto a texto.Aquellos que tengan experiencia en el uso del preprocesador en lenguajes como C++ yconozcan los problemas que implica el uso del mismo pueden respirar tranquilos, yaque en C# se han eliminado la mayora de caractersticas de ste que provocaban erroresdifciles de detectar (macros, directivas de inclusin, etc.) y prcticamente slo se usapara permitir realizar compilaciones condicionales de cdigo.Directivas de preprocesadoConcepto de directiva. SintaxisEl preprocesador no interpreta de ninguna manera el cdigo fuente del fichero, sino queslo interpreta de dicho fichero lo que se denominan directivas de preprocesado. Estasdirectivas son lneas de texto del fichero fuente que se caracterizan porque en ellas elprimer carcter no blanco que aparece es una almohadilla (carcter #) Por ejemplo:#define TEST#error Ha habido un error fatalNo se preocupe ahora si no entiendo el significado de estas directivas, ya que seexplicarn ms adelante. Lo nico debe saber es que el nombre que se indica tras elsmbolo # es el nombre de la directiva, y el texto que se incluye tras l (no todas lasdirectivas tienen porqu incluirlo) es el valor que se le da. Por tanto, la sintaxis de unadirectiva es:# Es posible incluir comentarios en la misma lnea en que se declara una directiva, aunqueestos slo pueden ser comentarios de una lnea que empiecen con // Por ejemplo, elsiguiente comentario es vlido:#define TEST // Ha habido algn error durante el preprocesado4 En realidad, en C# se realiza a la vez que el anlisis lxico del cdigo fuente; pero para simplificar laexplicacin consideraremos que se realiza antes que ste, en una etapa previa independiente.Jos Antonio Gonzlez Seco Pgina 35 36. El lenguaje de programacin C# Tema 3: El PreprocesadorPero este otro no, pues aunque ocupa una lnea tiene la sintaxis de los comentarios quepueden ocupar varias lneas:#define TEST /* Ha habido algn error durante el preprocesado */Definicin de identificadores de preprocesadoComo ya se ha comentado, la principal utilidad del preprocesador en C# es la depermitir determinar cules regiones de cdigo de un fichero fuente se han de compilar.Para ello, lo que se hace es encerrar las secciones de cdigo opcionales dentro dedirectivas de compilacin condicional, de modo que slo se compilarn si determinadosidentificadores de preprocesado estn definidos. Para definir un identificador de estetipo la directiva que se usa sigue esta sintaxis:#define Esta directiva define un identificador de preprocesado .Aunque ms adelante estudiaremos detalladamente cules son los nombres vlidoscomo identificadores en C#, por ahora podemos considerar que son vlidos aquellosformados por uno o ms caracteres alfanumricos tales que no sean ni true ni false y noempiecen con un numero. Por ejemplo, para definir un identificador de preprocesado denombre PRUEBA se hara:#define PRUEBAPor convenio se da a estos identificadores nombres en los que todas las letras seescriben en maysculas, como en el ejemplo anterior. Aunque es slo un convenio ynada obliga a usarlo, sta ser la nomenclatura que usaremos en el presente documento,que es la usada por Microsoft en sus cdigos de ejemplo. Conviene familiarizarse conella porque por un lado hay mucho cdigo escrito que la usa y por otro usarla facilita lalectura de nuestro cdigo a los dems al ser la notacin que esperarn encontrar.Es importante sealar que cualquier definicin de identificador ha de preceder acualquier aparicin de cdigo en el fichero fuente. Por ejemplo, el siguiente cdigo noes vlido, pues antes del #define se ha incluido cdigo fuente (el class A):class A#define PRUEBA{}Sin embargo, aunque no pueda haber cdigo antes de un #define, s que es posibleincluir antes de l otras directivas de preprocesado con total libertad.Existe una forma alternativa de definir un identificador de preprocesado y que ademspermite que dicha definicin slo sea vlida en una compilacin en concreto. Esta formaconsiste en pasarle al compilador en su llamada la opcin /d:(forma abreviada de /define:), caso en que durante lacompilacin se considerar que al principio de todos los ficheros fuente a compilar seencuentra definido el identificador indicado. Las siguientes tres formas de llamar alJos Antonio Gonzlez Seco Pgina 36 37. El lenguaje de programacin C# Tema 3: El Preprocesadorcompilador son equivalentes y definen identificadores de preprocesado de nombresPRUEBA y TRAZA durante la compilacin de un fichero fuente de nombre ejemplo.cs:csc /d:PRUEBA /d:TRAZA ejemplo.cscsc /d:PRUEBA,TRAZA ejemplo.cscsc /d:PRUEBA;TRAZA ejemplo.csNtese en el ejemplo que si queremos definir ms de un identificador usando estatcnica tenemos dos alternativas: incluir varias opciones /d en la llamada al compiladoro definir varios de estos identificadores en una misma opcin /d separndolos mediantecaracteres de coma (,) o punto y coma (;)Si se trabaja con Visual Studio.NET en lugar de directamente con el compilador enlnea de comandos, entonces puede conseguir mismo efecto a travs de View Property Pages Configuration Options Build ConditionalCompilation Constants, donde nuevamente usado el punto y coma (;) o la coma (,)como separadores, puede definir varias constantes. Para que todo funcione bien, antesde seleccionar View ha de seleccionar en el Solution Explorer (se abre con View Solution Explorer) el proyecto al que aplicar la definicin de las constantes.Finalmente, respecto al uso de #define slo queda comentar que es posible definir variasveces una misma directiva sin que ello provoque ningn tipo de error en el compilador,lo que permite que podamos pasar tantos valores a la opcin /d del compilador comoqueramos sin temor a que entren en conflicto con identificadores de preprocesado yaincluidos en los fuentes a compilar.Eliminacin de identificadores de preprocesadoDel mismo modo que es posible definir identificadores de preprocesado, tambin esposible eliminar definiciones de este tipo de identificadores previamente realizadas.Para ello la directiva que se usa tiene la siguiente sintaxis:#undef En caso de que se intente eliminar con esta directiva un identificador que no haya sidodefinido o cuya definicin ya haya sido eliminada no se producir error alguna, sino quesimplemente la directiva de eliminacin ser ignorada. El siguiente ejemplo muestra unejemplo de esto en el que el segundo #undef es ignorado:#define VERSION1#undef VERSION1#undef VERSION1Al igual que ocurra con las directivas #define, no se puede incluir cdigo fuente antesde las directivas #undef, sino que, todo lo ms, lo nico que podran incluirse antes queellas seran directivas de preprocesado.Compilacin condicionalComo se ha repetido varias veces a lo largo del tema, la principal utilidad delpreprocesador en C# es la de permitir la compilacin de cdigo condicional, lo queJos Antonio Gonzlez Seco Pgina 37 38. El lenguaje de programacin C# Tema 3: El Preprocesadorconsiste en slo permitir que se compile determinadas regiones de cdigo fuente si lasvariables de preprocesado definidas cumplen alguna condicin determinada. Paraconseguir esto se utiliza el siguiente juego de directivas:#if #elif ...#else#endifEl significado de una estructura como esta es que si se cumple entoncesse pasa al compilador el , si no ocurre esto pero se cumple entonces lo que se pasara al compilador sera , y as continuamente hastaque se llegue a una rama #elif cuya condicin se cumpla. Si no se cumple ninguna perohay una rama #else se pasar al compilador el , pero si dicha rama noexistiese entonces no se le pasara cdigo alguno y se continuara preprocesando elcdigo siguiente al #endif en el fuente original.Aunque las ramas #else y #endif son opcionales, hay que tener cuidado y no mezclarlasya que la rama #else slo puede aparecer como ltima rama del bloque #if...#endif.Es posible anidar varias estructuras #if...#endif, como muestra el siguiente cdigo:#define PRUEBAusing System;class A{public static void Main(){#if PRUEBAConsole.Write (Esto es una prueba);#if TRAZAConsole.Write( con traza);#elif !TRAZAConsole.Write( sin traza);#endif#endif}}Como se ve en el ejemplo, las condiciones especificadas son nombres de identificadoresde preprocesado, considerndose que cada condicin slo se cumple si el identificadorque se indica en ella est definido. O lo que es lo mismo: un identificador depreprocesado vale cierto (true en C#) si est definido y falso (false en C#) si no.El smbolo ! incluido en junto al valor de la directiva #elif es el smbolo de no lgico,y el #elif en el que se usa lo que nos permite es indicar que en caso de que no seencuentre definido el identificador de preprocesado TRAZA se han de pasar al compiladorlas instrucciones a continuacin indicadas (o sea, el Console.Write(sin traza);)Jos Antonio Gonzlez Seco Pgina 38 39. El lenguaje de programacin C# Tema 3: El PreprocesadorEl cdigo fuente que el preprocesador pasar al compilador en caso de que compilemossin especificar ninguna opcin /d en la llamada al compilador ser:using System;class A{public static void Main(){Console.Write(Esto es una prueba);Console.Write( sin traza);}}Ntese como en el cdigo que se pasa al compilador ya no aparece ninguna directiva depreprocesado, pues lo que el preprocesador le pasa es el cdigo resultante de aplicar aloriginal las directivas de preprocesado que contuviese.Asimismo, si c