lenguaje prog c#

Embed Size (px)

Citation preview

  • 8/3/2019 lenguaje prog c#

    1/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 1

    INTRODUCCIN A LA OBRA 8

    REQUISITOS PREVIOS RECOMENDADOS 8ESTRUCTURA DE LA OBRA 8CONVENIOS DE NOTACIN 8

    TEMA 1: INTRODUCCIN A MICROSOFT.NET 10

    MICROSOFT.NET 10COMMON LANGUAGE RUNTIME (CLR) 10MICROSOFT INTERMEDIATE LANGUAGE (MSIL) 13METADATOS 15ENSAMBLADOS 16LIBRERA DE CLASE BASE (BCL) 19COMMON TYPE SYSTEM (CTS) 20COMMON LANGUAGE SPECIFICATION (CLS) 20

    TEMA 2: INTRODUCCIN A C# 22

    ORIGEN Y NECESIDAD DE UN NUEVO LENGUAJE 22CARACTERSTICAS DE C# 22ESCRITURA DE APLICACIONES 27APLICACIN BSICA HOLA MUNDO! 27PUNTOS DE ENTRADA 29

    COMPILACIN EN LNEA DE COMANDOS 29COMPILACIN CON VISUAL STUDIO.NET 32

    TEMA 3: EL PREPROCESADOR 36

    CONCEPTO DE PREPROCESADOR 36DIRECTIVAS DE PREPROCESADO 36CONCEPTO DE DIRECTIVA. SINTAXIS 36DEFINICIN DE IDENTIFICADORES DE PREPROCESADO 37ELIMINACIN DE IDENTIFICADORES DE PREPROCESADO 38

    COMPILACIN CONDICIONAL 38GENERACIN DE AVISOS Y ERRORES 41CAMBIOS EN LA NUMERACIN DE LNEAS 41MARCADO DE REGIONES DE CDIGO 42

    TEMA 4: ASPECTOS LXICOS 44

    COMENTARIOS 44IDENTIFICADORES 45PALABRAS RESERVADAS 45

    LITERALES 47OPERADORES 49

  • 8/3/2019 lenguaje prog c#

    2/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 2

    TEMA 5: CLASES 56

    DEFINICIN DE CLASES 56CONCEPTOS DE CLASE Y OBJETO 56SINTAXIS DE DEFINICIN DE CLASES 56

    CREACIN DE OBJETOS 59OPERADOR NEW 59CONSTRUCTOR POR DEFECTO 61REFERENCIA AL OBJETO ACTUAL CON THIS 61HERENCIA Y MTODOS VIRTUALES 62CONCEPTO DE HERENCIA 62LLAMADAS POR DEFECTO AL CONSTRUCTOR BASE 64MTODOS VIRTUALES 64CLASES ABSTRACTAS 67LA CLASE PRIMEGENIA: SYSTEM.OBJECT 68POLIMORFISMO 71CONCEPTO DE POLIMORFISMO 71MTODOS GENRICOS 72DETERMINACIN DE TIPO. OPERADOR IS 73ACCESO A LA CLASE BASE 73DOWNCASTING 75CLASES Y MTODOS SELLADOS 75OCULTACIN DE MIEMBROS 76MIEMBROS DE TIPO 82ENCAPSULACIN 82

    TEMA 6: ESPACIOS DE NOMBRES 87

    CONCEPTO DE ESPACIO DE NOMBRES 87DEFINICIN DE ESPACIOS DE NOMBRES 87IMPORTACIN DE ESPACIOS DE NOMBRES 88SENTENCIA USING 88ESPECIFICACIN DE ALIAS 90ESPACIO DE NOMBRES DISTRIBUIDOS 92

    TEMA 7: VARIABLES Y TIPOS DE DATOS 93

    DEFINICIN DE VARIABLES 93TIPOS DE DATOS BSICOS 94TABLAS 96TABLAS UNIDIMENSIONALES 96TABLAS DENTADAS 98TABLAS MULTIDIMENSIONALES 99TABLAS MIXTAS 101COVARIANZA DE TABLAS 101LA CLASE SYSTEM.ARRAY 101CADENAS DE TEXTO 102CONSTANTES 107VARIABLES DE SLO LECTURA 108

  • 8/3/2019 lenguaje prog c#

    3/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 3

    ORDEN DE INICIALIZACIN DE VARIABLES 109

    TEMA 8: MTODOS 111

    CONCEPTO DE MTODO 111DEFINICIN DE MTODOS 111LLAMADA A MTODOS 112TIPOS DE PARMETROS. SINTAXIS DE DEFINICIN 113PARMETROS DE ENTRADA 113PARMETROS DE SALIDA 114PARMETROS POR REFERENCIA 115PARMETROS DE NMERO INDEFINIDO 115SOBRECARGA DE TIPOS DE PARMETROS 116MTODOS EXTERNOS 116CONSTRUCTORES 117

    CONCEPTO DE CONSTRUCTORES 117DEFINICIN DE CONSTRUCTORES 118LLAMADA AL CONSTRUCTOR 118LLAMADAS ENTRE CONSTRUCTORES 119CONSTRUCTOR POR DEFECTO 120LLAMADAS POLIMRFICAS EN CONSTRUCTORES 121CONSTRUCTOR DE TIPO 122DESTRUCTORES 123

    TEMA 9: PROPIEDADES 127

    CONCEPTO DE PROPIEDAD 127DEFINICIN DE PROPIEDADES 127ACCESO A PROPIEDADES 128IMPLEMENTACIN INTERNA DE PROPIEDADES 129

    TEMA 10: INDIZADORES 131

    CONCEPTO DE INDIZADOR 131DEFINICIN DE INDIZADOR 131ACCESO A INDIZADORES 132IMPLEMENTACIN INTERNA DE INDIZADORES 133

    TEMA 11: REDEFINICIN DE OPERADORES 135

    CONCEPTO DE REDEFINICIN DE OPERADOR 135DEFINICIN DE REDEFINICIONES DE OPERADORES 136SINTAXIS GENERAL DE REDEFINICIN DE OPERADOR 136REDEFINICIN DE OPERADORES UNARIOS 138REDEFINICIN DE OPERADORES BINARIOS 139REDEFINICIONES DE OPERADORES DE CONVERSIN 140

    TEMA 12: DELEGADOS Y EVENTOS 145

  • 8/3/2019 lenguaje prog c#

    4/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 4

    CONCEPTO DE DELEGADO 145DEFINICIN DE DELEGADOS 145MANIPULACIN DE OBJETOS DELEGADOS 147LA CLASE SYSTEM.MULTICASTDELEGATE 150LLAMADAS ASNCRONAS 151

    IMPLEMENTACIN INTERNA DE LOS DELEGADOS 154EVENTOS 156CONCEPTO DE EVENTO 156SINTAXIS BSICA DE DEFINICIN DE EVENTOS 156SINTAXIS COMPLETA DE DEFINICIN DE EVENTOS 156

    TEMA 13: ESTRUCTURAS 159

    CONCEPTO DE ESTRUCTURA 159DIFERENCIAS ENTRE CLASES Y ESTRUCTURAS 159

    BOXING Y UNBOXING 160CONSTRUCTORES 162

    TEMA 14: ENUMERACIONES 165

    CONCEPTO DE ENUMERACIN 165DEFINICIN DE ENUMERACIONES 166USO DE ENUMERACIONES 167LA CLASE SYSTEM.ENUM 168ENUMERACIONES DE FLAGS 170

    TEMA 15: INTERFACES 173

    CONCEPTO DE INTERFAZ 173DEFINICIN DE INTERFACES 173IMPLEMENTACIN DE INTERFACES 175ACCESO A MIEMBROS DE UNA INTERFAZ 178ACCESO A MIEMBROS DE INTERFACES Y BOXING 180

    TEMA 16: INSTRUCCIONES 182

    CONCEPTO DE INSTRUCCIN 182INSTRUCCIONES BSICAS 182DEFINICIONES DE VARIABLES LOCALES 182ASIGNACIONES 182LLAMADAS A MTODOS 183INSTRUCCIN NULA 183INSTRUCCIONES CONDICIONALES 183INSTRUCCIN IF 183INSTRUCCIN SWITCH 184INSTRUCCIONES ITERATIVAS 186

    INSTRUCCIN WHILE 186INSTRUCCIN DO...WHILE 187

  • 8/3/2019 lenguaje prog c#

    5/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 5

    INSTRUCCIN FOR 187INSTRUCCIN FOREACH 188INSTRUCCIONES DE EXCEPCIONES 192CONCEPTO DE EXCEPCIN. 192LA CLASE SYSTEM.EXCEPTION 193

    EXCEPCIONES PREDEFINIDAS COMUNES 194LANZAMIENTO DE EXCEPCIONES. INSTRUCCIN THROW 195CAPTURA DE EXCEPCIONES. INSTRUCCIN TRY 195INSTRUCCIONES DE SALTO 200INSTRUCCIN BREAK 200INSTRUCCIN CONTINUE 201INSTRUCCIN RETURN 201INSTRUCCIN GOTO 202INSTRUCCIN THROW 203OTRAS INSTRUCCIONES 203INSTRUCCIONES CHECKED Y UNCHECKED 203

    INSTRUCCIN LOCK 204INSTRUCCIN USING 205INSTRUCCIN FIXED 207

    TEMA 17: ATRIBUTOS 208

    CONCEPTO DE ATRIBUTO 208UTILIZACIN DE ATRIBUTOS 208DEFINICIN DE NUEVOS ATRIBUTOS 210ESPECIFICACIN DEL NOMBRE DEL ATRIBUTO 210

    ESPECIFICACIN DEL USO DE UN ATRIBUTO 210ESPECIFICACIN DE PARMETROS VLIDOS 212LECTURA DE ATRIBUTOS EN TIEMPO DE EJECUCIN 212ATRIBUTOS DE COMPILACIN 216ATRIBUTO SYSTEM.ATTRIBUTEUSAGE 216ATRIBUTO SYSTEM.OBSOLETE 216ATRIBUTO SYSTEM.DIAGNOSTICS.CONDITIONAL 217ATRIBUTO SYSTEM.CLSCOMPLIANT 218PSEUDOATRIBUTOS 218

    TEMA 18: CDIGO INSEGURO 220

    CONCEPTO DE CDIGO INSEGURO 220COMPILACIN DE CDIGOS INSEGUROS 220MARCADO DE CDIGOS INSEGUROS 221DEFINICIN DE PUNTEROS 222MANIPULACIN DE PUNTEROS 223OBTENCIN DE DIRECCIN DE MEMORIA. OPERADOR& 223ACCESO A CONTENIDO DE PUNTERO. OPERADOR* 224ACCESO A MIEMBRO DE CONTENIDO DE PUNTERO. OPERADOR-> 224CONVERSIONES DE PUNTEROS 225

    ARITMTICA DE PUNTEROS 226OPERADORES RELACIONADOS CON CDIGO INSEGURO 227

  • 8/3/2019 lenguaje prog c#

    6/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 6

    OPERADOR SIZEOF. OBTENCIN DE TAMAO DE TIPO 227OPERADOR STACKALLOC. CREACIN DE TABLAS EN PILA. 228FIJACIN DE VARIABLES APUNTADAS 229

    TEMA 19: DOCUMENTACIN XML 232

    CONCEPTO Y UTILIDAD DE LA DOCUMENTACIN XML 232INTRODUCCIN A XML 233COMENTARIOS DE DOCUMENTACIN XML 234SINTAXIS GENERAL 234EL ATRIBUTO CREF 235ETIQUETAS RECOMENDADAS PARA DOCUMENTACIN XML 237ETIQUETAS DE USO GENRICO 237ETIQUETAS RELATIVAS A MTODOS 238ETIQUETAS RELATIVAS A PROPIEDADES 239

    ETIQUETAS RELATIVAS A EXCEPCIONES 239ETIQUETAS RELATIVAS A FORMATO 240GENERACIN DE DOCUMENTACIN XML 242GENERACIN A TRAVS DEL COMPILADOR EN LNEA DE COMANDOS 242GENERACIN A TRAVS DE VISUAL STUDIO.NET 243ESTRUCTURA DE LA DOCUMENTACIN XML 244SEPARACIN ENTRE DOCUMENTACIN XML Y CDIGO FUENTE 247

    TEMA 20: EL COMPILADOR DE C# DE MICROSOFT 249

    INTRODUCCIN

    249SINTAXIS GENERAL DE USO DEL COMPILADOR 249OPCIONES DE COMPILACIN 251OPCIONES BSICAS 251MANIPULACIN DE RECURSOS 254CONFIGURACIN DE MENSAJES DE AVISOS Y ERRORES 255FICHEROS DE RESPUESTA 257OPCIONES DE DEPURACIN 259COMPILACIN INCREMENTAL 260OPCIONES RELATIVAS AL LENGUAJE 261OTRAS OPCIONES 262

    ACCESO AL COMPILADOR DESDE VISUAL STUDIO.NET 264

    TEMA 21: NOVEDADES DE C# 2.0 267

    INTRODUCCIN 267GENRICOS 267CONCEPTO 267UTILIDADES 269SINTAXIS 270LIMITACIONES 271

    RESTRICCIONES 273VALORES POR DEFECTO 278

  • 8/3/2019 lenguaje prog c#

    7/309

    El lenguaje de programacin C# ndice

    Jos Antonio Gonzlez Seco Pgina 7

    AMBIGEDADES 279TIPOS PARCIALES 279ITERADORES 281MEJORAS EN LA MANIPULACIN DE DELEGADOS 284INFERENCIA DE DELEGADOS 284

    MTODOS ANNIMOS 285COVARIANZA Y CONTRAVARIANZA DE DELEGADOS 288TIPOS ANULABLES 289CONCEPTO 289SINTAXIS 290CONVERSIONES 291OPERACIONES CON NULOS 292OPERADOR DE FUSIN (??) 293MODIFICADORES DE VISIBILIDAD DE BLOQUES GET Y SET 294CLASES ESTTICAS 294REFERENCIAS A ESPACIOS DE NOMBRES 295

    ALIAS GLOBAL Y CALIFICADOR:: 295ALIAS EXTERNOS 297SUPRESIN TEMPORAL DE AVISOS 298ATRIBUTOS CONDICIONALES 299INCRUSTACIN DE TABLAS EN ESTRUCTURAS 299MODIFICACIONES EN EL COMPILADOR 300CONTROL DE LA VERSIN DEL LENGUAJE 300CONTROL DE LA PLATAFORMA DE DESTINO 301ENVO AUTOMTICO DE ERRORES A MICROSOFT 301CONCRETIZACIN DE AVISOS A TRATAR COMO ERRORES 303VISIBILIDAD DE LOS RECURSOS 304FIRMA DE ENSAMBLADOS 304

    DOCUMENTACIN DE REFERENCIA 306

    BIBLIOGRAFA 306INFORMACIN EN INTERNET SOBRE C# 306PORTALES 307GRUPOS DE NOTICIAS Y LISTAS DE CORREO 307

  • 8/3/2019 lenguaje prog c#

    8/309

    El lenguaje de programacin C# Introduccin a la obra

    Jos Antonio Gonzlez Seco Pgina 8

    Introduccin a la obra

    Requisitos previos recomendados

    En 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 conceptos

    bsicos 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 obra

    Bsicamente 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 que

    justifican 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 conceptos

    bsicos 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 ms

    difciles de detectar que pueden surgir al utilizarlos y cmo evitarlos. Bloque 3: Descripcin del compilador: Este ltimo bloque, formado solamente

    por 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 notacin

  • 8/3/2019 lenguaje prog c#

    9/309

    El lenguaje de programacin C# Introduccin a la obra

    Jos Antonio Gonzlez Seco Pgina 9

    Para 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.cs

    Cuando adems este tipo de texto se utilice para hacer referencia a elementos predefinidos 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.

  • 8/3/2019 lenguaje prog c#

    10/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 10

    TEMA 1: Introduccin a Microsoft.NET

    Microsoft.NET

    Microsoft.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 y

    potente 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 aplicaciones

    tradicionales (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 herramientas

    pueden descargarse gratuitamente desde http://www.msdn.microsoft.com/net, aunque laltima slo est disponible para subscriptores MSDN Universal (los no subscriptores

    pueden 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 de

    programacin 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 elementos

    complejos incluidos en los sistemas operativos actuales (registro de Windows,GUIDs, HRESULTS, IUnknown, etc.) El CLR no es que abstraiga al

  • 8/3/2019 lenguaje prog c#

    11/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 11

    programador de estos conceptos, sino que son conceptos que no existen en laplataforma .NET

    Eliminacin del infierno de las DLLs: En la plataforma .NET desaparece el problema conocido como infierno de las DLLs que se da en los sistemas

    operativos 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 viejas

    podrn 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. Es

    decir, 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) que

    puede interpretarlo. La integracin de lenguajes es tal 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 el programador 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 objetos

    basura 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 de

    objetos intiles o solicitud de acceso a miembros de objetos ya destruidos.

  • 8/3/2019 lenguaje prog c#

    12/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 12

    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 procesos

    puedan 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 podran

    pertenecer 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 puedan producir 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 en

    paralelo 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 para

    crear 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 su

    procedendecia 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 al

    administrador 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.

  • 8/3/2019 lenguaje prog c#

    13/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 13

    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 preparado

    para ser ejecutando dentro de ella. Estos mecanismos permiten tanto el acceso a

    objetos 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 llamarcdigogestionado, y al cdigono escrito para ser ejecutado directamente en la plataforma .NET se le suele llamarcdigo no gestionado.

    Microsoft Intermediate Language (MSIL)

    Ninguno de los compiladores que generan cdigo para la plataforma .NET producecdigo mquina para CPUs x86 ni para ningn otro tipo de CPU concreta, sino quegeneran cdigo escrito en el lenguaje intermedio conocido como MicrosoftIntermediate Lenguage (MSIL) El CLR da a las aplicaciones la sensacin de que seestn ejecutando sobre una mquina virtual, y precisamente MSIL es el cdigo mquinade esa mquina virtual. Es decir, MSIL es el nico cdigo que es capaz de interpretar elCLR, y por tanto cuando se dice que un compilador genera cdigo para la plataforma.NET lo que se 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 cdigo

    MSIL. 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 cdigo

    para .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 compilador

    JIT (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:

  • 8/3/2019 lenguaje prog c#

    14/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 14

    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 sustituye

    inicialmente 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 ms

    ineficiente 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 la

    sensacin 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 memoria

    dinmica 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 estas

  • 8/3/2019 lenguaje prog c#

    15/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 15

    razones, 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.

    Metadatos

    En 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 Windows

    para los que existe alguna versin del CLR.

    El contenido de un mdulo no es slo MSIL, sino que tambin consta de otras dos reasmuy importantes: la cabecera de CLR y los metadatos:

    La cabecera de CLRes 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 el

    mdulo. 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 elemento

    que almacena un identificador de versin de mdulo (GUID creado por 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 de

    acceso 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. De

    1No 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.

  • 8/3/2019 lenguaje prog c#

    16/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 16

    cada 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 mtodos

    set/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 la

    posicin de la tabla TypeRef donde se almacena informacin relativaal tipo del que es miembro.

    Tabla 1: Principales tablas de metadatos

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

    Ensamblados

    Un 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 programa

    puede acceder a informacin o cdigo almacenados en un ensamblado sin tener queconocer cul es el fichero en concreto donde se encuentran, por lo que los ensambladosnos permiten abstraernos de la ubicacin fsica del cdigo que ejecutemos o de losrecursos que usemos. Por ejemplo, podemos incluir todos los tipos de una aplicacin enun mismo ensamblado pero colocando los ms frecuentemente usados en un ciertomdulo y los menos usados en otro, de modo que slo se descarguen de Internet los

    ltimos si es que se van a usar.

  • 8/3/2019 lenguaje prog c#

    17/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 17

    Todo ensamblado contiene un manifiesto, que son metadatos con informacin sobre lascaractersticas del ensamblado. Este manifiesto puede almacenarse en cualquiera de losmdulos que formen el ensamblado o en uno especficamente creado para ello, siendo loltimo necesario cuando slo contiene recursos (ensamblado satlite)

    Las principales tablas incluidas en los manifiestos son las siguientes:

    Tabla DescripcinAssemblyDef Define las caractersticas del ensamblado. Consta de un nico

    elemento 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 ficheros

    que 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 la

    posicin en la tabla TypeDef correspondiente a su definicin.AssemblyProccesorDef Indica en qu procesadores se puede ejecutar el ensamblado, lo

    que puede ser til saberlo si el ensamblado contiene mduloscon cdigo nativo (podra hacerse usando C++ conextensiones gestionadas) Suele estar vaca, lo que indica que se

    puede ejecutar en cualquier procesador; pero si estuviese llena,cada elemento indicara un tipo de procesador admitido segn

    el 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 cualquier

    procesador; 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 la

    versin del mismo a partir de la que se admite.Tabla 2: Principales tablas de un manifiesto

  • 8/3/2019 lenguaje prog c#

    18/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 18

    Para 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 del

    mdulo 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 nuevo

    su 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 slo

    puede 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. Esta

    poltica permite resolver los conflictos derivados de que se intente instalar en un mismoequipo varios ensamblados compartidos con el mismo nombre pero procedentes de

    distintas 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) como

    la poltica de aceptacin de ensamblados compartidos (por ejemplo, para que se hagaautomticamente uso de las nuevas versiones que se instalen de DLLs compartidas)

  • 8/3/2019 lenguaje prog c#

    19/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 19

    incluyendo 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 escribir

    programas. Adems, a partir de estas clases prefabricadas el programador puede crearnuevas clases que mediante herencia extiendan su funcionalidad y se integren a la

    perfeccin 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 y

    pginas ASP.NET. Es tal la riqueza de servicios que ofrece que incluso es posible crearlenguajes que carezcan de librera de clases propia y slo se basen en la BCL -como C#.

    Dada 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 tipos

    bsicos, 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 ventanas

    para aplicaciones Web.System.Winforms Creacin de interfaces de usuario basadas en ventanas

    para aplicaciones estndar.System.XML Acceso a datos en formato XML.

    Tabla 3: Espacios de nombres de la BCL ms usados

  • 8/3/2019 lenguaje prog c#

    20/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 20

    Common 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 su propia sintaxis para definir tipos

    de datos, en el MSIL resultante de la compilacin de sus cdigos fuente se han 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 andassembly

    Cdigo del mismo tipo o de hijos de ste ubicado enel mismo ensamblado

    family orassembly

    Cdigo del mismo tipo o de hijos de ste, o cdigoubicado en el mismo ensamblado

    Tabla 4: Modificadores de acceso a miembros admitidos por el CTS

    Common 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 pueden

    tener miembros abstractos.

  • 8/3/2019 lenguaje prog c#

    21/309

    El lenguaje de programacin C# Tema 1: Introduccin a Microsoft.NET

    Jos Antonio Gonzlez Seco Pgina 21

    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 definiciones

    get/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 set_Item; y en el caso de los eventos, susdefiniciones add/remove han de traducirse en mtodos 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 slo

    puede ser uno de estos cuatro tipos bsicos: byte, short, int o long.

  • 8/3/2019 lenguaje prog c#

    22/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 22

    Tema 2: Introduccin a C#

    Origen y necesidad de un nuevo lenguaje

    C# (ledo en ingls C Sharp y en espaol C Almohadilla) es el nuevo lenguaje de propsito 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 innecesarios

    en .NET. Por esta razn, se suele decir que C# es el lenguaje nativo de .NET

    La sintaxis y estructuracin de C# es muy parecida a la de C++ o Java, puesto que laintencin de Microsoft es facilitar la migracin de cdigos escritos en estos lenguajes aC# y facilitar su aprendizaje a los desarrolladores habituados a ellos. Sin embargo, susencillez y el alto nivel de productividad son comparables con los de Visual Basic.

    Un lenguaje que hubiese sido ideal utilizar para estos menesteres es Java, pero debido a problemas 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 hacerlo

    un 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 SDK

    Caractersticas 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 exactamente

    propias del lenguaje sino de la plataforma .NET en general, y si aqu se comentan esporque tienen una repercusin directa en el lenguaje:

    Sencillez: C# elimina muchos elementos que otros lenguajes incluyen y que soninnecesarios en .NET. Por ejemplo:

    o El cdigo escrito en C# es autocontenido, lo que significa que no

    necesita de ficheros adicionales al propio fuente tales como ficheros decabecera o ficheros IDL

  • 8/3/2019 lenguaje prog c#

    23/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 23

    o 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 que

    permita recorrer colecciones con facilidad y es ampliable a tipos definidos por elusuario, la inclusin de un tipo bsico string para representar cadenas o la

    distincin 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 reduce

    problemas 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 con

    facilidad 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 modificadorvirtual (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 mtodosvirtuales se puedan hacer ms eficientemente al contribuir a que el tamao de

    dicha tabla se reduzca.

  • 8/3/2019 lenguaje prog c#

    24/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 24

    Orientacin a componentes: La propia sintaxis de C# incluye elementos propios 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 a

    notificaciones) 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 de

    basura 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 no

    perteneciente 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 usarvariables 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 secomprueba que los mtodos a los que apunten tengan parmetros y valor

    de retorno del tipo indicado al definirlos.

  • 8/3/2019 lenguaje prog c#

    25/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 25

    o Pueden definirse mtodos que admitan un nmero indefinido de parmetros 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 clase

    base comn llamada System.Object, por lo que dispondrn de todos los

    miembros 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 y

    conseguir 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 a partir 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 suversin de asignacin compuesta (+=) Adems, para asegurar la consistencia, el

    compilador vigila que los operadores con opuesto siempre se redefinan porparejas (por ejemplo, si se redefine ==, tambin hay que redefinir!=)

  • 8/3/2019 lenguaje prog c#

    26/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 26

    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 miembros

    provoquen 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 modificadoroverride,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 elmodificadorvirtual. 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 modificadornew 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 manipulandoobjetos a travs de punteros. Para ello basta marcar regiones de cdigo como

    inseguras (modificador unsafe) y podrn usarse en ellas punteros de forma

  • 8/3/2019 lenguaje prog c#

    27/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 27

    similar 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 en

    cdigo 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 regasmmediante las que es posible generar automticamente clases

    proxy 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 aplicaciones

    Aplicacin 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:2

    1: class HolaMundo2: {3: static void Main()4: {5: System.Console.WriteLine(Hola Mundo!);6: }7: }

    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 HolaMundo1

    2 Los nmeros de lnea no forman parte del cdigo sino que slo se incluyen para facilitar su posteriorexplicacin.

  • 8/3/2019 lenguaje prog c#

    28/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 28

    cuya 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 de

    cierre (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 colocados tras el nombre del mtodo indicancules son los parmetros que ste toma, y el que estn vacos significa que el mtodono toma ninguno. Los parmetros de un mtodo permiten modificar el resultado de suejecucin en funcin de 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 se denomina el punto de entrada de la aplicacin, que no es msque el mtodo por el que comenzar su ejecucin. Necesita del modificador staticparaevitar 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 para las clases algosimilar a lo que un directorio es para los ficheros: 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 del

    parmetro que ocupe la posicin i+2 en la llamada aWriteLine()

    . 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 escribirConsole 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 denombres System no existe ninguna clase con dichos nombres. En este sentido, cabesealar que un error comn entre programadores acostumbrados a Java es llamar al

  • 8/3/2019 lenguaje prog c#

    29/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 29

    punto 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 entrada

    Ya 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 es

    ms 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 otro

    Compilacin en lnea de comandos

    Una 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.cs

    csc.exe es el compilador de C# incluido en el .NET Framework SDK para Windowsde Microsoft. Aunque en principio el programa de instalacin del SDK lo aadeautomticamente al path para poder llamarlo sin problemas desde cualquier directorio,si lo ha instalado a travs de VS.NET esto no ocurrir y deber configurrselo ya seamanualmente, o bien ejecutando el fichero por lotes Common7\Tools\vsvars32.bat que VS.NET incluye bajo su directorio de instalacin, o abriendo la ventana de consoladesde el icono Herramientas de Visual Studio.NET Smbolo del sistema deVisual Studio.NET correspondiente al grupo de programas de VS.NET en el men

    3 El nombre que se d al fichero puede ser cualquiera, aunque se recomienda darle la extensin .cs yaque es la utilizada por convenio

  • 8/3/2019 lenguaje prog c#

    30/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 30

    Inicio de Windows que no hace ms que abrir la ventana de consola y llamarautomticamente avsvars32.bat. En cualquier caso, si usa otros compiladores de C#

    puede que varie la forma de realizar la compilacin, por lo que lo que aqu se explicaen principio slo ser vlido para los compiladores de C# de Microsoft para Windows.

    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 compilarVentanas.cs como ejecutable de ventanas sera conveniente escribir:

    csc /t:winexe Ventanas.cs

    Ntese 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.cs

    En 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.cs

    En 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, en

    cada 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.cs

    csc /r:HolaMundo.dll,Otro.dll,OtroMs.exe A.cs

    csc /t:HolaMundo.dll /r:Otro.dll /r:OtroMs.exe A.cs

    Hay que sealar que aunque no se indique nada, en toda compilacin siempre sereferencia por defecto a la libreramscorlib.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)

  • 8/3/2019 lenguaje prog c#

    31/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 31

    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 esmodule. Por ejemplo:

    csc /t:module HolaMundo.cs

    Con 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.cs

    Aunque 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. Por

    ejemplo, para compilar los ficheros A.cs y B.cs en una librera A.dll se ejecutara:

    csc /t:library A.cs B.cs

    Ntese 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.cs

    Vase 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 se 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 *.cs

    Con 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.cs

  • 8/3/2019 lenguaje prog c#

    32/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 32

    Lgicamente, 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 varios se volvera a tener el problema de no saber cul utilizar)

    Compilacin con Visual Studio.NETPara compilar una aplicacin en Visual Studio.NET primero hay que incluirla dentro dealgn proyecto. Para ello basta pulsar el botnNew 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 seleccionarWindows 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 Namese 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 se

    almacenarn 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.NET

  • 8/3/2019 lenguaje prog c#

    33/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 33

    Una vez configuradas todas estas opciones, al pulsar botn OKVisual 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#):

    Ilustracin 2: Plantilla para aplicaciones de consola generada por Visual Studio.NET

    A partir de esta plantilla, escribir el cdigo de la aplicacin de ejemplo es tan sencillocon simplemente teclearSystem.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 men principal 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 Bin\Debug del directorio del proyecto.

    En el extremo derecho de la ventana principal de Visual Studio.NET puede encontrar el

    denominado Solution Explorer (si no lo encuentra, seleccioneView

    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 de

    propiedades del proyecto con el aspecto mostrado en la Ilustracin 3:

  • 8/3/2019 lenguaje prog c#

    34/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 34

    Ilustracin 3: Hoja de propiedades del proyecto en Visual Studio.NET

    Esta 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 Object

    Finalemente, para aadir al proyecto referencias a ensamblados externos (opcin /r)basta seleccionarProject Add Reference en el men principal de VS.NET.

  • 8/3/2019 lenguaje prog c#

    35/309

    El lenguaje de programacin C# Tema 2: Introduccin a C#

    Jos Antonio Gonzlez Seco Pgina 35

  • 8/3/2019 lenguaje prog c#

    36/309

    El lenguaje de programacin C# Tema 3: El Preprocesador

    Jos Antonio Gonzlez Seco Pgina 36

    TEMA 3: EL PREPROCESADOR

    Concepto de preprocesador

    El 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++ y

    conozcan 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 usa

    para permitir realizar compilaciones condicionales de cdigo.

    Directivas de preprocesado

    Concepto de directiva. Sintaxis

    El 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 el

    primer carcter no blanco que aparece es una almohadilla (carcter#) Por ejemplo:

    #define TEST#error Ha habido un error fatal

    No 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 una

    directiva 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 preprocesado

    4 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.

  • 8/3/2019 lenguaje prog c#

    37/309

    El lenguaje de programacin C# Tema 3: El Preprocesador

    Jos Antonio Gonzlez Seco Pgina 37

    Pero 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 preprocesado

    Como 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 identi