introducción al lenguaje c# eidos

38
Introducción al lenguaje y características derivadas de su entorno de ejecución.  A lo largo de los últimos meses, hemos estado hablando de algunas características del nuevo entorno .NET Framework que Microsoft está desarrollando y a medida que pasaba el tiempo, aquí en Grupo EIDOS, nos hemos ido dividiendo los roles de trabajo, para poder abarcar todo este nuevo paradigma de la programación con la profundidad que se merece. Así pues, tras unos primeros devaneos con Visual Studio, el nuevo Visual Basic .NET y su interfaz de usuario (ver artículo del mes de Abril), cedo los trastos de Visual Basic a mi compañero Luis Miguel Blanco, de sobra conocido por los lectores de Algoritmo y de La Librería Digital, para dedicarme por entero al nuevo lenguaje de programación: C# (C-Sharp). Pretendemos, a lo largo de los próximos meses, ir publicando un curso completo del lenguaje que sirva de introducción a nivel básico-intermedio para los lectores, de forma que, cuando hacia el mes de Noviembre aparezca el producto, ya dispongan de una buena base para poder trabajar y continuar la producción con este lenguaje (como quizá sepa ya el lector, el pasado día 21 de Junio, coincidiendo con el primer evento Tech-Ed del año, celebrado en Atlanta (Georgia), se hizo, por fin pública la beta 2 de Microsoft .NET Framework, así como -para usuarios del MSDN y otros- la beta 2 de Visual Studio .NET. A título personal, tengo fundadas razones para dudar de la demora hasta Febrero/2002, como se ha comentado en algunos foros, y por si esto fuera poco, el Dr.GUI, mentor ficticio del MSDN de Microsoft afirmaba en su 6ª entrega de sus cursos sobre .NET que "a partir del próximo número, todo el código será compatible con la Beta 2 de .NET Framework, puesto que Microsoft no planea ya ningún cambio significativo al API entre la Beta 2 y el p roducto final, solamente ajustes, optimización y algún cambio de mínima importancia", lo que da idea de lo avanzado del proyecto). Introducción a C# El lenguaje C# se presenta como el último invento en materia de lenguajes de programación, y constituye también la más reciente y ambiciosa apuesta en este sentido por parte de Microsoft . Quizás, lo primero que habría que aclarar, es que, de todo el .NET Framework, es la única parte que puede considerarse terminada, hasta el punto de que el propio Visual Studio .NET ha sido construido al 90% en C# y el 10% restante en C++. Por otro lado, el lenguaje merece el calificativo de estándar, en el sentido de que –al igual que algunos otros aspectos del entorno- está siendo sometido a estandarización por parte de ECMA, la misma entidad de normalización que llevó a cabo la estandarización de Javascript. Nota: En una reciente visita Madrid por parte de dos de los promotores y desarrolladores de .NET (  Ari Bixhorn y Drew Fletcher  ), a la que tuvimos ocasión de asistir, se respondía a una pregunta del amigo Francisco Charte en ese sentido, afirmando que ellos eran conscientes de que ECMA estaba manteniendo reuniones mensuales con los equipos de estudio de la normalización (los Working Teams  ), y que esperaban que dicha labor estuviera completada, sino antes, sí para el momento de la aparición del  producto. Rumores sobre el impacto de C# en el mundo de la programación 

Upload: alex-paredes

Post on 13-Oct-2015

94 views

Category:

Documents


4 download

TRANSCRIPT

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    1/38

    Introduccin al lenguaje y caractersticasderivadas de su entorno de ejecucin.

    A lo largo de los ltimos meses, hemos estado hablando de algunas caractersticas

    del nuevo entorno .NET Frameworkque Microsoft est desarrollando y a medidaque pasaba el tiempo, aqu en Grupo EIDOS, nos hemos ido dividiendo los rolesde trabajo, para poder abarcar todo este nuevo paradigma de la programacin conla profundidad que se merece. As pues, tras unos primeros devaneos con VisualStudio, el nuevo Visual Basic .NETy su interfaz de usuario (ver artculo del mes deAbril), cedo los trastos de Visual Basic a mi compaero Luis Miguel Blanco, desobra conocido por los lectores de Algoritmoy de La Librera Digital, paradedicarme por entero al nuevo lenguaje de programacin: C#(C-Sharp).

    Pretendemos, a lo largo de los prximos meses, ir publicando un curso completo dellenguaje que sirva de introduccin a nivel bsico-intermedio para los lectores, deforma que, cuando hacia el mes de Noviembre aparezca el producto, ya dispongan

    de una buena base para poder trabajar y continuar la produccin con este lenguaje(como quiz sepa ya el lector, el pasado da 21 de Junio, coincidiendo con el primerevento Tech-Eddel ao, celebrado en Atlanta (Georgia), se hizo, por fin pblica labeta 2 de Microsoft .NET Framework, as como -para usuarios del MSDN y otros- labeta 2 de Visual Studio .NET. A ttulo personal, tengo fundadas razones para dudarde la demora hasta Febrero/2002, como se ha comentado en algunos foros, y por siesto fuera poco, el Dr.GUI, mentor ficticio del MSDN de Microsoft afirmaba en su6 entrega de sus cursos sobre .NET que "a partir del prximo nmero, todo elcdigo ser compatible con la Beta 2 de .NET Framework, puesto que Microsoft noplanea ya ningn cambio significativo al API entre la Beta 2 y el productofinal, solamente ajustes, optimizacin y algn cambio de mnimaimportancia", lo que da idea de lo avanzado del proyecto).

    Introduccin a C#

    El lenguaje C# se presenta como el ltimo invento en materia de lenguajes deprogramacin, y constituye tambin la ms reciente y ambiciosa apuesta en estesentido por parte de Microsoft. Quizs, lo primero que habra que aclarar, es que,de todo el .NET Framework, es la nica parte que puede considerarseterminada, hasta el punto de que el propio Visual Studio .NET ha sido construidoal 90% en C#y el 10% restante en C++. Por otro lado, el lenguaje merece elcalificativo de estndar, en el sentido de que al igual que algunos otros aspectosdel entorno- est siendo sometido a estandarizacin por parte de ECMA, la misma

    entidad de normalizacin que llev a cabo la estandarizacin de Javascript.

    Nota: En una reciente visita Madrid por parte de dos de los promotores ydesarrolladores de .NET (Ari Bixhorny Drew Fletcher), a la que tuvimosocasin de asistir, se responda a una pregunta del amigo Francisco Charteen ese sentido, afirmando que ellos eran conscientes de que ECMAestabamanteniendo reuniones mensuales con los equipos de estudio de lanormalizacin (los Working Teams), y que esperaban que dicha laborestuviera completada, sino antes, s para el momento de la aparicin del

    producto.

    Rumores sobre el impacto de C# en el mundo de la

    programacin

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    2/38

    Es natural que, ante la creciente comunidad mundial de profesionales de las TI, laaparicin de un nuevo lenguaje tenga ms impacto hoy que en etapas anteriores,ms arcaicas. Los medios lo favorecen, y la difusin de Internet, tambin. Por eso,nos hemos paseado por algunas revistas en la Web donde los gurs mas conocidosdan sus opiniones.

    La impresin de estos autores podramos resumirla as:C# supone una mejora respecto a otros lenguajesexistentes por dos razones bsicas: primero, por que esel ltimo, y por lo tanto, el ms adaptado a lasnecesidades actuales del programador y el que ms haaprendidode los dems, heredando lo mejor de cadaentorno, y aadiendo las cosas que los programadores

    solicitaban. En segundo trmino, por que su creadorprincipal (el jefe del equipo de desarrollo, el dansAnders Hejlsberg, de quien Bixhorny Fletcherhablaban maravillas), ha podido hacer un excelentetrabajo basado su experiencia personal (es el diseadorde Turbo Pascal 5.5y Delphi), con tiempo suficiente,y un pequeo pero impresionante equipo decolaboradores entre los que figuran Peter Kukol, JeffreyRichter, etc.

    Anders Hejlsberg, arquitectoprincipal del lenguaje C#

    De hecho, el propio nombre del lenguaje (se pronuncia CSharp) fue una decisinposterior, como se ha sabido, en el sentido de que era una extensin de C++:C++++ (con 4 +), para indicar su origen principal. Si bien esto es cierto, no lo esmenos que en un famoso e-mail que se hizo pblico a raz del contencioso Sun-Microsoft, dirigido por Hejlsberga Bill Gates, se habla del proyecto de desarrollo delnuevo lenguaje con frases esclarecedoras sobre la intencin con que se construa...

    As, podemos leer (la traduccin es ma) Peter Kukol y yo hemos estadotrabajando en un conjunto de extensiones de Java que yo definira comoun cuidadoso maridaje entre Java y C (Original: Peter Kukol and I have

    been working on a set of Java language extensions that I wouldcharacterize as "A careful marriage of Java and C."). Y ms adelante, en unasignificativa referencia al nombre del nuevo engendro, afirma A falta de unnombre mejor, estamos llamando al lenguaje J++ (Original: For lack of abetter name we're calling the language J++), en una clara alusin a susfundamentos basados tambin en el lenguaje Java. Finalmente, otra fraseentresacada de este e-mail, explica claramente el propsito del diseo al afirmarque lo que muchos programadores quieren es una versin limpia de C++que aporte los beneficios de productividad de Java combinados con lascaractersticas de bajo nivel de C (Original: what a lot of programmerswant is a "cleaned up: version of C++ which gives them the productivitybenefits of Java coupled with the lower level features of C).

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    3/38

    Naturalmente, las reacciones han sido muy variadas: desde aquellos que por elmero hecho de que el producto sea de Microsoft- lo desdean, hasta (unamayora), que aprecian sus nuevas caractersticas en lo que valen y promueven suutilizacin. Quiz por eso, sean de especial valor las opiniones de algunos gurs(Ben Albaharide Genamics, Christopher P. Caliside SD Times, e inclusoJim FarleydeOReally), que estando dedicados a la programacin en Java no les importa

    reconocer en sus comparativas (el lector tiene las referencias bibliogrficas al finalde este articulo), que si eres un seguidor acrrimo de Java...(el utiliza lapalabra evangelist, que tiene otras connotaciones en ingls) no te fes de que C#sea simplemente otro marketing de Microsoft. Mejor, preprate.

    Bien, pues vamos a prepararnos. Sobre todo teniendo en cuenta que, como serepite con ms frecuencia cada vez, ste cambio a .NETva a afectar a la forma deprogramar al menos por los prximos 10 aos...

    El lenguaje C# y el Entorno Comn deEjecucin (CLR)

    Una de las caractersticas principales de C# es que se trata de un lenguaje quecompila (por defecto) a un formato intermedio, al estilo de Java, denominadoIntermediate Language (IL), que posteriormente, debe de ser interpretado porun entorno de ejecucin, una mquina JIT (just-in-time), tambin al estilo de Java.La gran diferencia respecto a Java es que, se intrprete ser comn a todos loslenguaje soportados por el entorno de ejecucin (veintitantos ya...) y medianteeste mecanismo permitir que los componentes realizados en cualquier lenguajepuedan comunicarse entre s.

    Se trata pues, de una extensin del concepto inicial que dio origen a Java:en lugar de un nico lenguaje para muchas plataformas, se pretende unentorno comn multiplataforma, que soporte muchos lenguajes, basndoseen que todos ellos compilen a un mismo cdigo intermedio. Para hacer viableesta idea, se ha optimizado considerablemente la velocidad, respecto a Java y ya seestn anunciando los primeros .NET Framework para otras plataformas: El pasado

    mes de Marzo, Steve Ballmer anunciaba la disponibilidad para Linux, y estn enmarcha las implementaciones para Unix, McIntosh System-8y BEos.

    Este lenguaje intermedio, es gestionado por un mecanismo llamado Entorno Comnde Ejecucin (Common Language Runtime), encargado, adems, de la gestinde memoria, y en general, de las tareas ms importantes, relacionadas con laejecucin de programas.

    Programacin en C#

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    4/38

    Para una primera toma de contacto con el lenguaje, nada mejor que ponernosmanos a la obra e ir analizando algunos casos prcticos, empezando por el yaclsico Hola Mundo.

    Principios bsicos de la construccin de programas en C#

    Pero antes, recordemos las bases sobre las que se asienta la construccin de unprograma escrito en C#:

    1) Todo programa compilado para el entorno comn de ejecucin (CLR) comparteun mismo cdigo intermedio (Intermediate Language IL) que debe ser ejecutadopor un intrprete JIT que resida en la plataforma de ejecucin. Aunque puedendistinguirse entre componentes y ejecutables, en ste ltimo caso, el formatoresultante es independiente del lenguaje que se utiliz en su escritura. El formatode los ejecutables independientes se denomina PE (PortableExecutable).

    2) El entorno comn de ejecucin (CLR) es invocado por cualquier programaescrito en el formato PE, y es quien se hace cargo del mantener la zona dememoria en la que se ejecuta el programa y suministra un sistema de tipos dedatos comn (Common Type System), que describe los tipos soportados por elintrprete y cmo estos tipos pueden interactuar unos con otros y cmo puede seralmacenados en metadatos.

    3) Los servicios del sistema operativo se suministran mediante libreras (DLL)dispuestas por el CLR cuando se instala .NET Frameworken una plataforma(Windows, McIntosh, Linux, etc.). Dichas libreras son referenciadas en el cdigode C# mediante la sentencia using seguida del nombre de la librera deseada.Tales declaraciones reciben el nombre de Espacios Calificados o Espacios conNombre (Namespaces).

    4) En C#, todo puede ser tratado como un objeto, aunque no obligatoriamente, ysin la penalizacin que supone esta caracterstica en lenguajes orientados a objetos

    "puros", como SmallTalk. Por tanto cualquier cdigo en C# estar incluido en unaclase, ya sea esta instanciada o no. Adems, se protege la inversin realizadapreviamente en desarrollo, ya que permite la llamada a componentes COM, alibreras nativas del API de Windows (DLL's), permite el acceso de bajo nivelcuando sea apropiado y los ejecutables y componentes producidos con l seintegran perfectamente con otros ejecutables o componentes realizados en otroslenguajes del entorno.

    5) La sintaxis de C# recuerda bastante la de Java, si bien los conceptos implicadosen la construccin de objetos, tipos, propiedades, mtodos, y eventos no suelen ser

    idnticos teniendo -en ocasiones- notables diferencias conceptuales. La mayor

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    5/38

    similitud se encuentra, como caba esperar, en el tratamiento de las estructuras decontrol del programa (prcticamente idnticas a C++ y Java).

    Primer ejemplo: Hola mundo desde C#

    Siguiendo la tradicin, comentaremos para empezar el cdigo de la implementacin de unasalida por la consola con el texto Hola Mundo. El cdigo es el siguiente:

    Cdigo fuente del Hola Mundousing System;

    class HolaMundoCS

    {

    public static void Main()

    {

    Console.WriteLine("Hola desde C#");

    }

    }

    Y, como es de esperar, produce una salida en una ventana del DOS (Consola), conel texto indicado entre parntesis por el mtodo WriteLine (Hola desde C#).

    Anlisis del cdigo

    Vamos a analizar el cdigo fuente para irnos familiarizando con los mecanismostpicos de un programa en C#: La primera declaracin indica que vamos a utilizar elespacio calificado (o NameSpace) llamado System. Un espacio calificado onominado es una especie de firma digital con la que podemos hacer referencia auna librera o bien -mediante la declaracin NameSpace- hacer que sirva deidentificador de todos los mdulos que pertenezcan a una aplicacin, o unfragmento de aplicacin. System es el NameSpace bsico para todas lasaplicaciones que requieran algn servicio del sistema (que son prcticamentetodas). Note el lector que la declaracin del espacio calificado podra haberseeliminado si en el cdigo hubiramos hecho referencia a la jerarqua completa, estoes, si hubiramos escrito:

    System.Console.WriteLine(Hola Mundo);

    Ms sobre el concepto de Namespace

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    6/38

    Esto es as, porque el CLR pone a disposicin de cualquier aplicacin todos losservicios de sistema operativo a travs de un conjunto jerrquico de clases con slohacer referencia a ellas. No obstante, y para facilitar la escritura del cdigoutilizamos el concepto de Namespace (espacio calificado espacio con nombre).Un namespacees una forma adecuada de organizar clases y otros tipos de datosen una jerarqua. Podramos decir que sirven al mismo tiempo para 3 propsitos:

    organizar (dentro de la jerarqua), para firmar (o marcar de forma nica)fragmentos de cdigo como pertenecientes a ese namespace, evitando colisionescon otros fragmentos que puedan contener definiciones iguales, y como mtodo deabreviacin, ya que una vez declarado el namespace podemos referirnos a suscontenidos en el cdigo sin necesidad de repetir toda la secuencia jerrquica, tal ycomo aparece en la lnea de cdigo anterior.

    Los espacios calificados pueden estar predefinidos, como en este caso, o serdeclarados en el cdigo por el propio usuario. Como nuestra aplicacin utiliza unanica salida de texto por el dispositivo por defecto (Consola), no es preciso hacerninguna referencia a Windows ni a sus servicios. La consola est representada endicho espacio por el objeto Console que dispone de mtodos para escribir texto enla consola por defecto (Write() y Writeline()) y tambin para recoger entradasde datos del mismo dispositivo (Read()y Readline()) (Piense el lector, que puedehaber casos en los que la labor de un programa es totalmente desatendida (estoes, no dispone de ninguna interfaz de usuario), ya que sus salidas no van dirigidasa un usuario en concreto, sino a un fichero, tal y como ocurre muchas veces con loscomponentes).

    Main(): la funcin principal

    La segunda lnea contiene otra declaracin importante. Como se ha indicado, todoel cdigo de un programa en C# debe estar incluido en una clase. Adems, en C#no existen mtodos ni variables globales, por tanto, mediante la palabra reservadaclass declaramos la clase HolaMundoCS, que contiene todo el cdigo ejecutable.

    Esta clase est compuesta por una nica funcin, que, en ste caso, hace las vecesde mtodo constructor y funcin principal (Main). Dicha funcin esta precedida de3 calificadores: de mbito (public), de acceso (static) y de valor de retorno

    (void) y es la funcin principal de todo programa ejecutable en C#. En ella esdonde comienza y termina el control del programa y es donde se crean objetos y seejecutan otros mtodos.

    Tambin debemos tener en cuenta que Main() admite varios modos deimplementacin similares segn devuelva o no valores (en nuestro ejemploanterior, el calificador void indica que no devuelve ninguno), y tambin es posibleeliminar la declaracin public, haciendo que no se pueda acceder a el desde otrasclases. Finalmente, se puede declarar un array de argumentos, de manera querecoja los argumentos que se le pasen al programa en la lnea de comandos.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    7/38

    Versin del Hola Mundo que devuelve un "int"using System;

    class HolaMundoCS

    {

    public static int Main()

    {

    Console.WriteLine("Hola desde C#");

    return 0;

    }

    }

    Versin del Hola Mundo que puede recibir argumentos en la lnea de comandosusing System;

    class HolaMundoCS

    {

    public static void Main ( string[] args )

    {

    Console.WriteLine("Hola desde C#");

    }

    }

    Es especialmente importante distinguir desde el principio estos calificadores (sobretodo, los dos primeros) por que establecen la manera en que el cdigo queescribimos puede ser utilizado. Aunque, a continuacin incluimos unas tablasresumen del modo de funcionamiento de todos los calificadores importantes dellenguaje, aclaremos ante todo (sobre todo para los poco versados en ste tipo delenguajes) que el cdigo incluido en una clase puede ser accedidobsicamente de dos formas: mediante un objeto que haga referencia(instancie) dicha clase, o de forma directa, al estilo de como lo hacemoscon las funciones de librera en otros lenguajes, sin utilizar ningn objetoexplcito.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    8/38

    Clases, mtodos y propiedades de tipo static

    En ste segundo caso, la clase o el mtodo al que queramos referirnos en staforma ser declarado como static. A una clase definida de esta forma, se ladenomina clase global. La jerarqua de objetos de .NET contiene muchas clases de

    este tipo, no pudiendo heredarse de ellas, y estando pensadas para ser usadasdirectamente. El mtodo inicial de toda aplicacin se declara como staticprecisamente para que el CLR pueda acceder a l sin necesidad de haberseinstanciado ningn objeto. Cuando un mtodo se declara como static, no esposible aadir los calificadores que permiten heredar de el (virtual, abstract) osobrescribir su modo de implementacin (override). Lo mismo es aplicable para laspropiedades declaradas como static. Tampoco se permite la utilizacin dentro deese cdigo de la palabra reservada que se utiliza para referirse a la propia clase(this).

    Entradas y salidas de datos

    En principio, el lenguaje C# no dispone de forma nativa de ningn mecanismo deacceso directo a los dispositivos perifricos (consola, teclado, etc). Dichos accesosvienen suministrados mediante libreras dentro del Microsoft .NET Framework. En elcaso de nuestro programa inicial, dicho acceso se obtiene mediante System.Consolecomo hemos comentado, (que tambien da acceso al dispositivo de errores estndar(standard error). Si la aplicacin requiere ventanas de Windows (lo ms normal),sera preciso hacer referencia a la librera System.WinForms, y as sucesivamente.

    Los procesos de Edicin, Compilacin y/o llamada alejecutable.

    Por otro lado, y debido a su naturaleza, el lenguaje C# no requiere de ningnentorno de desarrollo, estrictamente hablando. Basta con un editor de texto y unallamada al compilador pasndole los parmetros de compilacin adecuados.Podemos utilizar el Bloc de Notas, o cualquiera de los editores Sharewaredisponibles en la red, para este propsito. El editor Antechinuses un buen ejemplode ello. Para compilar un programa escrito en C#, podemos utilizar dosmecanismos, dependiendo del editor que estemos utilizando. Si el editor es elpropio de Visual Studio .NET, basta con seleccionar la opcin de construir la

    aplicacion (Build). Pero no olvidemos que una llamada directa al compilador puedehacer la misma labor.

    Para llamar al compilador de C# desde la lnea de comandos, teclearamos:

    csc Hola.cs /out:Hola.exe

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    9/38

    donde csc es el nombre del compilador, "Hola.cs" nuestro fichero de cdigo fuenteen C#, y "Hola.exe" el nombre del fichero de salida. En caso de que se requiera lapresencia de libreras adicionales (por defecto se incluye mscorelib.dll, que es laque contiene a System), haramos las referencias aadiendo a la lnea de comandostantos modificadores /r: como libreras necesitsemos. Veremos ejemplos de lautilizacin del compilador en lnea ms adelante.

    A lo largo de los siguientes artculos, iremos profundizando en las distintascaractersticas de uso del lenguaje a travs de ejemplos. De esta forma, al analizaruna simple aplicacin vamos a ir revisando el lenguaje en sus caractersticas msimportantes.

    Anexo 1: Accesibilidad de los tipos y mtodosde una clase

    De cara al futuro, aadimos a continuacin las tablas que definen, respectivamente,los calificadores de mbito,la accesibilidad y los modificadores de acceso, a modode referencia. Como el lector tendr oportunidad de comprobar, las palabrasreservadas que se indican en las tablas adjuntas, aparecen constantemente en losprogramas escritos en C#. Por tanto, y resumiendo la situacin podemosdesglosarla de la siguiente forma:

    Calificadores de mbito de accesibilidad para tipos y mtodos de una clase

    Declaracion Nivel de Accesibilidad Tipo de accesibilidad

    Public Sin restricciones Declara miembros accesibles desde cualquierotra clase

    Protected Limitado a la clase contenedora ytipos derivados

    Declara miembros accesibles nicamente desdedentro de la clase y sus clases derivadas

    Internal Limitado al proyecto actual Declara miembros accesibles nicamente desdedentro de mismo mdulo de ensamblaje(assembly)

    ProtectedInternal

    Limitado al proyecto actual o tiposderivados

    Private Limitado al tipo contenedor. Declara miembros accesibles nicamente desdela clase o estructura en la que son declarados.

    Tabla 1. Calificadores de mbito de accesibilidad

    La accesibilidad de un tipo o mtodo se especifica en C# mediante uno de lossiguientes modificadores (modifiers) o declaraciones, tal y como aparecen en latabla adjunta:

    De las declaraciones indicadas en la tabla adjunta la nica combinacin permitidaes protected internal. Por otro lado los Espacios Calificados no estn sujetos a

    ningn tipo de restriccin. Adems, el contexto de la declaracin, imponerestricciones adicionales, y en caso de no utilizar ningn modificador, se asume ladeclaracin por defecto para el contexto de uso que corresponda.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    10/38

    Los miembros de Disponen de una accesibilidadpor defecto del tipo:

    Y a sus miembros, se lespermite un nivel dedeclaraciones de acceso:

    enum public Ningunoclass private public

    protected

    internal

    private

    protected internal

    interface public Ningunostruct private public

    internal

    private

    Tabla 2. Accesibilidad

    Entendemos por dominio de accesibilidad, aquellas secciones del cdigo deun programa en las cuales se puede hacer referencia a un miembrodeterminado. Segn esto, la accesibilidad de un tipo anidado depende de sudominio de accesibilidad, que viene determinado por dos aspectos: el nivel deaccesibilidad del miembro y el dominio de accesibilidad del tipo contenedor. Sinembargo, el dominio de accesibilidad de un tipo anidado

    [1]no puede exceder el del tipo contenedor.

    Otros Modificadores

    La lista completa de modificadores en C# es la siguiente:

    Modificador PropsitoModificadores de acceso (yacomentados):public,private,internalyprotected

    Especifican declaraciones de accesibilidad de tiposy tipos miembro.

    abstract Indica que una clase sirve solamentede clase base oclase abstracta para otras clases. No se pueden instanciar

    http://www.algoritmodigital.com/articulos/069/a069mpm1.asphttp://www.algoritmodigital.com/articulos/069/a069mpm1.asphttp://www.algoritmodigital.com/articulos/069/a069mpm1.asp
  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    11/38

    objetos a partir de ella.const Especifica valores para campos o variables que no pueden

    modificarse.event Declara un evento.extern Indica un mtodo que se implementa de forma externa.

    (Por ejemplo, declara una funcin de librera de una API).override Indica que se trata de una nueva implementacin de un

    miembro virtual heredado de una clase base.readonly Declara un campo cuyo valor slo puede asignarse una

    vez, bien como parte de la declaracin, o en unconstructor de esa misma clase..

    sealed Especifica una clase de la que no puede heredarse. (Peros instanciar objetos a partir de ella)

    static Declara un miembro asociado con el tipo mismo (la clase,estructura, etc), en lugar de pertenecer a un objetoconcreto. Interviene en el concepto de clases globales,comentado ms arriba.

    virtual Declara que el mtodo que sigue se podr sobrescribir enuna clase derivada de ella.

    Tabla 3. Modificadores de Acceso

    Siguiendo con nuestro razonamiento, vemos que el siguiente modificador denuestra declaracin del mtodo Mainerastatic. Segn la tabla adjunta, esosignifica que puede ser llamado desde otro proyecto, o directamente, por CLR, aliniciarse la aplicacin.

    [1]Un tipo anidado (nested type) es aquel que se declara dentro del mbito de otrotipo y suele ser til para encapsular detalles de la implementacin de ste, talescomo enumeraciones, etc.

    http://www.algoritmodigital.com/articulos/069/a069mpm1.asphttp://www.algoritmodigital.com/articulos/069/a069mpm1.asp
  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    12/38

    El Common Type System (Sistema Comn deTipos de Datos)

    Una vez hecha la introduccin bsica al lenguaje C#, es costumbre continuar con la

    descripcin de los elementos fundamentales del lenguaje, comenzando por los tiposde datos que es capaz de manejar. Y una de las caractersticas principales quepermite la integracin de los diferentes lenguajes soportados por el entorno comnde ejecucin (CLR), se basa en la existencia un conjunto comn de tipos de datosque coinciden para cualquier lenguaje. No importa que estemos utilizando VB.NET,C# o -el recientemente anunciado por Fujitsu- COBOL.NET, los tipos de datosdefinidos son siempre son los mismos, y su definicin e implantacin se agrupanbajo el epgrafe de Sistema Comn de Tipos de Datos Common TypeSystem (desde ahora,CTS).

    La principal ventaja que tiene un sistema de tipos comn radica en la seguridad.Seguridad en la conversin de tipos y garanta de que cualquier lenguaje que

    utilizar el CTSpodr interpretar e interactuar con mdulos creados en otroslenguajes sin traducciones. Adems, ciertas operaciones no estn permitidas deforma explcita, como algunas conversiones, para las que es preciso especificarlo deforma explcita. Piense el lector, lo que suceda, por ejemplo en Visual Basic: enlas versiones anteriores, podamos llamar a funciones del API de Windows, perocomo las definiciones de esas funciones haban sido originalmente hechas en C++,muchas veces se requeran adaptar los tipos de datos VBa los de C++, para que lallamada a la funcin no terminase en un error de ejecucin.Adems, esta situacinfacilita la construccin de componentes, que -ms incluso que los ejecutables-necesitan interactuar con cualquier cdigo.

    El siguiente grfico, muestra esta situacin, esquematizada segn una divisin

    conceptual que se basa en la ubicacin de los tipos de datos: la pila (stack), o elmontn (heap):

    Figura 1. Esquema general del Sistema Comn de Tipos (CTS)

    Analizaremos con ms detalle este diagrama para explicar brevemente sufuncionamiento. Como anticipbamos, la primera divisin importante, se establecea la hora de distinguir la ubicacin de los tipos de datos (stack heap).

    Diferenciacin entre la pila ( stack)y el montn (heap)

    La pila es un rea de memoria utilizada para el almacenamiento y recuperacin devalores de longitud fija. Hay que recordar que cada programa en ejecucin (cada

    proceso, en trminos de Windows), mantiene su propia pila, a la que ningn otroprograma puede acceder. Con eso se garantiza la seguridad. Cuando se llama afuncin todas las variables locales a esa funcin son almacenadas (instrucciones

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    13/38

    PUSHde Ensamblador) en la pila, para ser posteriormente recuperadas(instrucciones POP) cuando el flujo de ejecucin sale de la funcin. El tpico error"stack overflow" se produce precisamente cuando una rutina (por ejemplo,alguna de tipo recursivo) almacena demasiadas variables en la pila y sta sedesborda.

    La otra ubicacin posible para los datos de un programa es el montn (o heap), quese usaba en C/C++para almacenar valores de longitud variable (por ejemploarrays de chars), o datos cuyo ciclo vital superaba el de una funcin de manera quese puede hacer referencia a ellos fuera de la funcin que los define. Aunque lasituacin en C#es similar, la diferencia con C/C++es que los datos de este tipo(objetos), se almacenan en una zona denominada managedheap, algo as comomontn administrado, de cuya gestin se encarga el Entorno Comn deEjecucin(CLR). Internamente, opera de forma ms eficiente, y la eleccin entreel uso de la pila o el montn la toma el compilador, dependiendo del tipo de dato.

    Declaraciones de tipos por valorint x = 1, y = 1; //x e y se declaran por valor

    Esto significa que cada instruccin es separada por el compilador y se asocian losnombres X e Y a sendas direcciones de memoria, almacenando copiasindependientes de los datos, como vemos en la figura adjunta:

    Figura 2. Asignacin de tipos predeterminados en la pila

    Aparte de tener una incidencia en el rendimiento (el acceso a la pila es ms rpidoque el acceso al montn, por razones que tienen que ver con los registros de laCPU, pero que no vamos a detallar aqu), en el primer caso, estamos hablando detipos que no tienen una identidad establecida. Se trata de valores, de secuenciasde bits situadas en memoria. El sistema se las arregla para hacer corresponder losnombres de las variables con las direcciones de memoria en las que estas seubican, pero cada variable guarda una copia distinta del valor, aunque este sea el

    mismo (como en la figura 2).

    Sin embargo, en el caso de los tipos por referencia, se habla de una combinacinde identidad, ubicaciny valores(secuencias de bits). De acuerdo con esto, dosobjetos se consideran iguales NO SI ALMACENAN EL MISMO VALOR, SINO CUANDOAPUNTAN A LA MISMA DIRECCIN DE MEMORIA (que, como consecuencia, va aimplicar que los valores sean los mismos, pero que supone que el cambio de estadoen una de las variables de objeto va a significar tambin el cambio en todas lasotras variables que hagan referencia al mismo objeto(o sea, que apunten a lamisma direccin).

    La diferencia queda esquematizada en la figura 3, adjunta:

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    14/38

    Figura 3. Asignacin de variables de objeto que apuntan a la misma direccin de memoria

    Nota: Esto significa que aunque se declaren variables miembro de unaclase (campos) utilizando las declaraciones abreviadas (int, double, etc),como son pertenecientes a un objeto situado en el montn, ellas, a su vez,estarn tambin situadas en el montn. La ubicacin depende de la

    declaracin inicial y del mbito.

    Boxing y Unboxing

    Como en ocasiones es necesario utilizar un tipo por valor como si fuera un objeto yviceversa, en C# se denominan boxing y unboxing a los procesos de conversinque permiten este tratamiento. En el primero de los procesos, no se necesitaningn tipo de casting mientras que en el contrario s lo es (en principio, podramosconvertirlo en cualquier tipo de dato).

    Proceso de Boxing y Unboxingint y = 1; //Tipo por valor

    object x = y; //Proceso de boxing:y se convierte a referencia para

    permitir la asignacin

    int z = (int) x; //Proceso de Unboxing: x se convierte a entero para

    copiar su valor en z

    Existe un caso especial que tendremos ocasin de probar ms adelante y es el delos tipos de datos string, que realmente se almacenan en el montn, pero de caraal usuario y para la facilidad de manejo de pueden manejar como si se ubicaran en

    la pila.

    Relacin de tipos predeterminados en .NET

    El entorno .NET provee de una serie de tipos predeterminados que permiten ladeclaracin de variables y su asignacin directa sin necesidad de instanciar ningnobjeto. Se les denomina tipos predeterminadosy un ejemplo de ellos es int. As,podemos usar estos atajos para simplificar el cdigo. Por ejemplo, las dosdeclaraciones siguientes, aunque similares (puesto que manejan valores del mismotipo), se declaran de forma distinta y existen algunas distinciones en su utilizacin:

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    15/38

    Tipos predeterminados en .NET

    CategoraNombre

    deClase

    DescripcinTipo de datosVisual Basic

    Tipo de datosC#

    Tipo de datosManaged

    Extensions de

    C++

    Tipo dedatos

    JavaScript

    Enteros Byteentero sin signo de8-bits

    Byte byte char byte

    SByte

    entero con signo de8-bits

    No cumple con CLS

    SByte

    Nopredeterminado

    sbyte signed char SByte

    Int16entero con signo de16-bits

    Short short short short

    Int32 entero con signo de32-bits Integer int int o long int

    Int64entero con signo de64-bits.

    Long long __int64 long

    UInt16

    entero sin signo de16-bits.

    No cumple con CLS.

    UInt16

    Nopredeterminado

    ushortunsignedshort

    UInt16

    UInt32

    entero sin signo de

    32-bits.No cumple con CLS.

    UInt32

    Nopredeterminado

    uint

    unsigned int

    -or-

    unsigned long

    UInt32

    UInt64

    entero sin signo de64-bits

    No cumple con CLS.

    UInt64

    Nopredeterminado

    ulongunsigned

    __int64UInt64

    ComaFlotante

    SingleUn nmero en comaflotante de precisinsimple (32-bits)

    Single float float float

    DoubleUn nmero en comaflotante de dobleprecisin (64-bits)

    Double double double double

    Lgicos BooleanUn valor Boolean(trueo false).

    Boolean bool bool bool

    Otros CharUn carcter Unicode(16-bits) .

    Char char wchar_t char

    DecimalUn valor decimal de96-bits.

    Decimal decimal Decimal Decimal

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    16/38

    IntPtr

    entero con signocuyo tamaodepende de laplataformasubyacente (valor

    32- bits enplataformas de 32-bits valor 64-bits enplataformas de 64-bits..

    IntPtr

    Nopredeterminado

    IntPtr

    Nopredeterminado.

    IntPtr

    Nopredeterminado.

    IntPtr

    UIntPtr

    entero sin signo cuyotamao depende dela plataformasubyacente (valor32- bits enplataformas de 32-

    bits valor 64- bits enplataformas de 64-bits.

    No cumple con CLS.

    UIntPtr

    Nopredeterminado

    UIntPtr

    Nopredeterminado

    UIntPtr

    Nopredeterminado

    UIntPtr

    objetos ObjectEl objeto raz de la

    jerarquaObject object Object* Object

    StringCadena inmutable decaracteres Unicode ylongitud fija.

    String string String* String

    Ntese que el tipo de datos string, aparece en el apartado de objetos (ClassObjects), y sin embargo en su utilizacin directa no hay diferencia respecto a lostipos estndar predeterminados que aparecen al comienzo de la tabla. De tal forma,podemos asignar valores a variables de tipo cadena utilizando una sintaxis muysimilar a la utilizada con los enteros. Esto es radicalmente distinto a la utilizacinque se hacia de las cadenas en C/C++ mediante arrays de chars.

    As, operaciones tediosas en esos lenguajes, como la concatenacin de cadenas, oel anlisis de caracteres dentro de las mismas es mucho ms simple. Por ejemplo,la concatenacin se consigue simplemente mediante el siguiente cdigo:

    Asignacin y uso de tipos stringen una concatenacinstring cad = "Esto es una cadena"; //Tipo string

    string cad2 = "Y esto es otra";

    string cad3 = cad + cad2;

    No obstante, seguimos manejando referencias de forma interna (internamente unainstancia de System.Object, se ubica en el montn). Eso significa que la primeravez que asignamos una cadena a otra, los valores apuntan a la misma ubicacin (o

    secuencia de caracteres), pero cuando la segunda variable es reasignada a unaconstante de caracteres, o una expresin que pueda evaluarse como tal, se crea

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    17/38

    una copia independiente en la memoria, de forma que cada variable mantenga suconjunto distinto de datos, como podemos ver en el siguiente ejemplo:

    Asignacin y uso de tipos stringen una concatenacinusing System;

    class EjemploCadena

    {

    public static void Main()

    {

    string s1 = "Una cadena";

    string s2 = s1;

    Console.WriteLine("Cadena 1: {0}", s1); //Imprime "Una cadena"

    Console.WriteLine("Cadena 2: {0}", s2); //Imprime "Una cadena"

    s1 = "Otra cadena";

    Console.WriteLine("Cadena 1: {0}", s1); //Imprime "Otra cadena"

    Console.WriteLine("Cadena 2: {0}", s2); //Imprime "Una cadena"

    }

    }

    Como podemos ver, la primera vez, los valores son idnticos, pero una vez que sevuelve a asignar el valor cada referencia mantiene datos propios. Los literales decadena en C# se deben encerrar siempre entre comillas dobles (lo contrariotendera a ser interpretado como un dato char, produciendo un error decompilacin). El lenguaje define una serie de caracteres que sirven para el formatode cadenas.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    18/38

    Los elementos del lenguaje

    Se deca que los tres componentes funcionales ms importantes de una clase eran,sus campos (que definen su estado), sus mtodos (que definen su funcionalidad)y sus eventos (que establecen la forma de comunicacincon el exterior de laclase). Estos elementos, junto a las palabras reservadas del lenguaje que sirven demodificadores, permiten implementar en una clase las 3 caractersticas de la OOP(Polimorfismo, Encapsulacin y Herencia), enriquecidas al evolucionar loslenguajes, como sucede en C#, mediante aportaciones nuevas, como losindizadores, las propiedades, los atributos o los delegados, y tambin nuevas omodificadas formas de tratar elementos conocidos. Vamos a continuar este repasobsico del lenguaje hablando de los operadores.

    Operadores

    Entendemos por operador un smbolo que indica que debe realizarse una operacinsobre uno o ms argumentos, que reciben el nombr de operandos. A los operadoresque actan sobre un nico argumento, se les llama operadores unarios.

    Categora del Operador OperadoresPrimarios (x), x.y, f(x), a[x], x++, x--, new, typeof, sizeof, checked, uncheckedUnarios +, -, !, ~, ++x, --x, (T)xMultiplicativos *, /, %Aditivos +, -De desplazamiento Relacionales , =, is

    Igualdad = =AND Lgico &XOR Lgico ^OR Lgico |AND Condicional &&OR Condicional ||Condicional ?:Asignacin =, *=, /=, %=, +=, -=, =, &=, ^=, |=

    Tabla 1: Lista de operadores en C# por orden de precedencia.

    Como podemos ver, se dispone de un amplio conjunto de operadores basado en losexistentes para los lenguajes C++/Java. Aunque la mayor parte de ellos siguen lasreglas establecidas para otros lenguajes, conviene establecer algunas de las reglasgenerales ms importantes que se cumplen en su tratamiento e implantacin, queson las siguientes:

    1. La precedencia de los operadores es la que se indica en la tabla adjunta.2. Todos los operadores, excepto el de asignacin (=), se evalan de izquierda

    a derecha. Esto significa que se da propiedad transitiva en los operadores. Osea, que la expresinA+B+C es equivalente a (A+B)+C. Como siempre, se utilizan los parntesis

    para establecer precedencia especfica en cualquier expresin. Ntese,adems, que en C#, se utilizan distintos smbolos para el operador de

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    19/38

    asignacin (=) y el de comparacin (= =), evitando errores deinterpretacin, como sucede en otros lenguajes, al estilo de Visual Basic.

    3. El operador (.) se utiliza para especificar un miembro de una clase oestructura. El operando de la izquierda simboliza la clase y el de la derechael miembro de esa clase. Se eliminan otros operadores presentes en ellenguaje C++, tales como (->,::), para simplificar la sintaxis.

    4. El operador ([]) se utiliza para hacer referencia a los elementos de un array.Todos los arrays en .NET comienzan en 0.

    5. Los operadores (++ y --) se utilizan al estilo de C++, como operadores deautoincremento y autodecremento. Pueden ser utilizados dentro deexpresiones.

    6. new es el operador usado para invocar mtodos constructores a partir dedefiniciones de clases.

    7. typeof es el operador utilizado mediante la librera Reflectionpara obtenerinformacin acerca de un tipo.

    8. sizeofse utiliza para determinar el tamao de un tipo estndar expresadoen bytes. Solo puede ser utilizado con los llamados value types (tipos por

    valor), o miembros de clases, pero no con las propias clases. Adems, slopueden usarse dentro de bloques unsafe (cdigo C++ embebido en unbloque unsafede C#).

    9. checkedy unchecked se utilizan para la gestin de errores, dentro deestructuras try-catch-finally. Lo veremos con ms detalle, en el apartadode tratamiento de errores.

    10.Los operadores de asignacin compuesta se utilizan para simplificarexpresiones en las que un operando aparece en los dos miembros de laasignacin. Por ejemplo, podemos simplificar un contador expresndolocomo x += 1, en lugar de x = x + 1.

    Comentarios

    Los comentarios en C# son uno de los aspectos extendidos del lenguaje, respecto asus predecesores. Aunque los comentarios en lnea se hacen mediante la doblebarra vertical (//), de manera similar a C++: Y los bloques de comentario,mediante la sintaxis consistente en encerrar todo el comentario entre los smbolos(/*y */):

    Comentarios en C#//Esto es un comentario

    System.Console.Readline() //y esto, otro

    /* Esto es un comentario

    segn la segunda sintaxis */

    No obstante, se han aadido posibilidades adicionales de cara a la documentacindel cdigo. Segn esto, el propio IDE de Visual Studio, utiliza tres barras verticales(///), para incluir comentarios que pueden ms tarde usarse en la confeccin de unfichero de texto en sintaxis XML:

    Comentarios en C# para documentacin XML///

    ///Resumen de la descripcin de la clase Test

    ///

    Observe el lector que la informacin aadida se incluye dentro de dos etiquetasXML de nombre (sumario). Posteriormente, una opcin de compilacin(/doc:), permite que se genere un fichero adicional con dicha

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    20/38

    extensin que puede ser visualizado mediante un navegador, u otro programaadecuado. En el caso de que deseemos modificar las plantillas incluidas en el IDEpara la construccin de mdulos de cdigo, se pueden modificar dichas etiquetaspara que tengan el sentido y la estructura que nos interesen, y posteriormente,mediante ficheros de Hojas de Estilo Extendidas (XSL/T), generar directamenteformatos HTML, que puedan convertirse en Ayudas, mediante el editor de Ayudas

    que tambin se incluye en la suitede Visual Studio.

    Observamos aqu algo que se convierte en una constante de todo el entorno dedesarrollo: XML es el estndar actual para la escritura de ficheros de datos, y es elformato que se usa siempre que es posible (veremos esto mismo asociado a losficheros de configuracin externa de una aplicacin, a los datos devueltos por unservidor mediante ADO.NET, y en muchas otras situaciones).

    Identificadores

    Un identificador es una palabra definida por el programador, y distinta de cualquier

    palabra reservada del lenguaje, que se usa para especificar un elemento nicodentro de un programa (clase, variable, mtodo, constante, atributo, etc.).

    Las reglas de los identificadores explicadas en esta seccin se correspondenexactamente con las recomendadas por la norma Unicode3.0, Informe tcnico 15,Anexo 7, con excepcin del carcter de subrayado, que est permitido comocarcter inicial (como era tradicional en el lenguaje de programacin C), loscaracteres de escape Unicode estn permitidos en los identificadores y el carcter"@" est permitido comoprefijopara habilitar el uso de palabras clave comoidentificadores, siempre y cuando no exista otra declaracin idntica sin dichoprefijo (sera interpretado como una declaracin duplicada). Adems, el carcter @,tiene una utilizacin especial como prefijo de cadenas de caracteres, cuando lo que

    se quiere indicar es que la cadena posee delimitadores que deben ser interpretadoscomo literales, como es el caso de la barra separadora de directorios: \).

    Literales

    Entendemos por literal a un conjunto de caracteres alfanumricos que representanlos valores que puede adoptar un tipo bsico del lenguaje. Segn esto, existentantas clases de literales como de tipos en el Common Type System: lgicos,enteros, reales, de caracteres, de cadena, y el literal nulo.

    Algunos ejemplos seran:

    Literales lgicos: Representan a los valores lgicos cierto y falso:

    true, false(con minsculas)

    Literales enteros: Representan nmeros enteros en notacin decimal ohexadecimal:

    0, -3276, 0x1A

    Literales reales: Representan nmeros en formato decimal.

    0.0, -1000.45, 1.23E-9 (notacin cientfica)

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    21/38

    Literales de caracteres: Representan un carcter individual, tpicamenteencerrado entre comillas simples: a. Tambin se utilizan para la representacin de

    secuencias de escape (representaciones alternativas de un carcter basadas en suposicin en una tabla de definiciones estndar: ASCII, Unicode, etc.).

    En C# y en las Extensiones administradas de C++, el carcter de barra invertidahace que el siguiente carcter de la cadena de formato se interprete como unasecuencia de escape. Se utiliza con las secuencias tradicionales para de aplicacinde formato, como "\n" (nueva lnea).

    Una secuencia de escape de caracteres Unicode representa un carcter Unicode. Esimportante tener en cuenta que Las secuencias de escape de caracteres Unicode seprocesan en identificadores, literales de caracteres y literales de cadenasregulares. Un carcter de escape Unicode no se procesa en ninguna otra ubicacin(por ejemplo, para formar un operador, un elemento de puntuacin o una palabraclave).

    La tabla adjunta lista las secuencias de escape Unicode:

    Secuencia de escape Nombre del carcter Codificacin Unicode\' Comilla simple 0x0027\" Comilla doble 0x0022\\ Barra invertida 0x005C\0 Null 0x0000\a Alerta 0x0007\b Retroceso 0x0008\f Avance de pgina 0x000C\n Nueva lnea 0x000A\r Retorno de carro 0x000D\t

    Tabulacin horizontal

    0x0009\v Tabulacin vertical 0x000B

    Tabla 2: secuencias de escape Unicode.

    Literales de cadena: (Siempre entre comillas dobles)

    Cadena, C:\Windows

    El Literal nulo: En C# se representa mediante la palabra reservada null. Se usacomo valor de las variables tipo Object no inicializadas (que contienen unareferencia nula).

    Atributos

    A pesar de que C# es un lenguaje imperativo, sigue las normas de los lenguajes deesta categora, y contiene elementos declarativos. Ya hemos visto que laaccesibilidad de un mtodo de una clase se especifica mediante su declaracincomo public, protected, internal, protected internal oprivate.

    Al objeto de que los programadores pueden definir sus propias clases deinformacin declarativa, C# generaliza esta capacidad, permitiendo anexar dichainformacin a entidades del programa y recuperarla en tiempo de ejecucin. Tal

    informacin declarativa adicional se realiza mediante la definicin y el uso deatributos.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    22/38

    Ms adelante, el programa puede recuperar dicha informacin mediante lacaracterstica Reflection que consiste en la capacidad de un programa de utilizaruna librera de clase base para averiguar lo que necesite acerca de sus propiosMetadatos. Analizaremos ms en profundidad esta caracterstica en artculosposteriores.

    Tambin se utilizan los atributos para definir acciones que se deben de llevar a caboen tiempo de ejecucin, como sucede, por ejemplo, en la tcnica denominadaPlatform Invoke, para declarar una funcin perteneciente a una librera del API deWindows, como si fuera propia y poder utilizarla. El siguiente ejemplo es unamuestra de sta caracterstica:

    Uso del atributo DLLImport en la declaracin de una funcin del API deWindows

    [DllImport("version.dll")]

    public static extern bool GetFileVersionInfo (string sFileName,

    int handle, int size, byte[] infoBuffer);Es notable recalcar, que Platform Invoke es un mecanismo independiente de laplataforma, y por tanto "es el recomendado para las llamadas a funciones propiasdel sistema cuando se trabaja en plataformas no-Windows", tal y como nosrecuerda el director del proyecto Mono(de la iniciativa de software abierto OpenSource), Miguel de Icaza, encargado de la conversin de la plataforma .NET y elcompilador de C#, para Linux, en el artculo publicado al respecto en el primernmero de la revista Dr.Dobbs en castellano.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    23/38

    Formatos de salida

    En C#, se incluye una variada gama de formatos posibles para la representacin devalores numricos y alfanumricos. Al tratarse este de un problema muy tpico paralos programadores, hemos querido hacer especial hincapi en este punto, y detallaren un conjunto de tablas todas estas posibilidades. Podemos dividir estacaracterstica en dos grandes grupos, el de formatos numricos y el de formatos decadenas.

    Cadenas de formato numrico personalizado

    Los caracteres que se pueden utilizar para crear cadenas de formato numricopersonalizado y sus definiciones, se muestran en la tabla siguiente. Tngase encuenta que la Configuracin Regional del Panel de control influye en algunos de losmodelos generados por estos caracteres. Los equipos que emplean referencias

    culturales diferentes mostrarn modelos diferentes. La tabla adjunta, tomada de ladocumentacin oficial del producto, ilustra todas estas posibilidades.

    Tabla para crear cadenas de formato numrico personalizado

    Carcterdeformato

    Nombre Descripcin

    0 Marcador deposicin cero

    Si el valor al que se est dando formato tiene un dgitoen la posicin donde aparece el '0' en la cadena deformato, entonces ese dgito se copia en la cadena desalida. La posicin del '0' que aparece ms a laizquierda antes del separador decimal y la del '0' que

    est ms a la derecha despus del separador decimaldeterminan el intervalo de dgitos que estn siemprepresentes en la cadena de salida.

    # Marcador deposicin dedgito.

    Si el valor al que se est dando formato tiene un dgitoen la posicin donde aparece '#' en la cadena deformato, entonces ese dgito se copia en la cadena desalida. En caso contrario, no se almacena nada en esaposicin de la cadena de salida. Hay que advertir queeste indicador nunca muestra el carcter '0' si ste noes un dgito significativo, incluso si '0' es el nico dgitode la cadena. Slo mostrar el carcter '0' si es undgito significativo del nmero que se muestra.

    . Separadordecimal El primer carcter '.' de la cadena de formato determinala ubicacin del separador decimal en el valor conformato y se omite cualquier carcter '.' adicional. Elcarcter real que se utiliza como separador decimalviene determinado por la propiedadNumberDecimalSeparatordel objeto NumberFormatInfoque controla la aplicacin de formato.

    , Separador demiles y escalanumrica

    El carcter ',' tiene una doble utilidad. En primer lugar,si la cadena de formato contiene un carcter ',' entredos marcadores de posicin de dgitos (0 #) y a laizquierda del separador decimal, si hay, entonces elresultado tendr separadores de miles insertados entrecada grupo de tres dgitos a la izquierda del separadordecimal. El carcter real que se utiliza como separadordecimal en la cadena de salida viene determinado por la

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    24/38

    propiedad NumberGroupSeparator del objetoNumberFormatInfo actual que controla la aplicacin deformato.

    En segundo lugar, si la cadena de formato contiene unoo ms caracteres ',' situados inmediatamente a laizquierda del separador decimal, entonces el nmero sedividir entre el nmero de caracteres ',' multiplicadopor mil antes de que se le d formato. Por ejemplo, lacadena de formato '0,,' presentar una cantidad de 100millones como 100. El uso del carcter ',' para indicar laescala no incluye los separadores de miles en el nmeroal que se ha dado formato. As pues, para indicar laescala de un nmero para un milln e insertarseparadores de miles, hay que utilizar la cadena deformato '#,##0,,'.

    % Marcador deposicin de

    porcentaje.

    La presencia de un carcter '%' en una cadena deformato hace que se multiplique un nmero por 100

    antes de que se le d formato. El smbolo adecuado seinserta en el nmero en la posicin en que aparece '%'en la cadena de formato. El carcter de porcentaje quese utiliza depende de la clase NumberFormatInfo actual.

    E0

    E+0

    E-0

    e0

    e+0

    e-0

    Notacincientfica

    Si alguna de las cadenas 'E', 'E+', 'E-', 'e', 'e+' o 'e-'aparece en la cadena de formato y lleva a continuacinpor lo menos un carcter '0', entonces se le da formatoal nmero mediante notacin cientfica con una 'E' ouna 'e' insertadas entre el nmero y el exponente. Elnmero de caracteres '0' que sigue al indicador denotacin cientfica determina el nmero mnimo dedgitos para el exponente. Los formatos 'E+' y 'e+'

    indican que un carcter de signo (ms o menos) debepreceder siempre al exponente. Los formatos 'E', 'E-','e' o 'e-' indican que un carcter de signo slo debepreceder a exponentes negativos.

    \ Carcter deescape

    En C# y en las Extensiones administradas de C++, elcarcter de barra invertida hace que el siguientecarcter de la cadena de formato se interprete comouna secuencia de escape. Se utiliza con las secuenciastradicionales para de aplicacin de formato, como "\n"(nueva lnea).

    En algunos lenguajes, el carcter de escape debe ir

    precedido por otro carcter de escape cuando se utilizacomo un literal. En caso contrario, el compiladorinterpreta el carcter como una secuencia de escape.Hay que emplear la cadena "\\" para mostrar "\".

    Hay que tener en cuenta que Visual Basic no admite elcarcter de escape; sin embargo ControlCharsproporciona la misma funcionalidad.

    'ABC'

    "ABC"

    Cadena literal Los caracteres situados entre comillas sencillas o doblesse copian literalmente en la cadena de salida y noafectan al proceso de dar formato.

    ; Separador de

    secciones

    El carcter ';' se utiliza para separar secciones para los

    nmeros positivos, negativos y cero de la cadena deformato.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    25/38

    Otros Todos los demscaracteres

    Todos los dems caracteres se copian en la cadena desalida como literales en la posicin en la que aparecen.

    Tabla 1: cadenas de formato

    Un ejemplo de funcionamiento sera como sigue:

    Declaraciones por valorusing System;

    class Class1

    {

    static void Main()

    {

    Console.Write("{0:C} \n", 2,5);

    Console.Write("{0:D5} \n", 25);

    Console.Write("{0:E} \n", 250000);

    Console.Write("{0:F2} \n", 25);

    Console.Write("{0:F0} \n", 25);

    Console.Write("{0:G} \n", 2,5);Console.Write("{0:N} \n", 2500000);

    Console.Write("{0:X} \n", 250);

    Console.Write("{0:X} \n", 0xffff);

    Console.ReadLine();

    }

    }

    //La salida por pantalla es:

    2,00 ?

    00025

    2,500000E+005

    25,0025

    2

    2.500.000,00

    FA

    FFFF

    system.object: un gran tipo

    La raz de todos los tipos de datos en C#, es, como ya hemos apuntado,

    System.Object. Esto, garantiza que cualquier tipo del CTS comparte un conjunto decaractersticas comn. En concreto, existen 4 mtodos pblicos asociados con eltipo base, que son heredados por todos los objetos, tal y como se muestran en latabla siguiente:

    Mtodos pblicos de System.Object

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    26/38

    bool Equals() Compara dos referencias a objetos en tiempo de ejecucin para comprobar si apuntan almismo objeto. Si es as el mtodo devuelve true. En los tipos por valor, se devuelve true silos datos almacenados son idnticos.

    int GetHashCode() Obtiene el cdigo hashde un objeto. Las funciones Hash se usan cuando se desea situardicho cdigo en una tabla hash por razones de rendimiento.

    Type GetType() Se utiliza con mtodos del namespace reflectionpara obtener la informacin del tipo de unobjeto dado.

    string ToString Por defecto, se utiliza para obtener el nombre del objeto. Admite reemplazo (overload) porclases derivadas para devolver cadenas de representacin ms adecuadas a lasnecesidades del usuario.

    Adems de estos mtodos pblicos, System.Objectposee dos mtodos protegidos(protected): Finalize() que es el equivalente al mtodo destructor de otroslenguajes, pero teniendo en cuenta que esa no es la forma que se utiliza en .NET, yMemberwiseClone()que devuelve una copia de un objeto ignorando todas las

    referencias a que ese objeto pudiera apuntar. A este tipo de copia se la llama Copiasuperficialdel objeto.

    Conversin de tipos

    Una de las caractersticas fundamentales del tratamiento de tipos de datos es laconversin entre ellos. En C++, esta operacin recibe el nombre de casting. Unaforma conveniente de abordar el problema es distinguir entre la conversinimplcita(llevada a cabo por el compilador) y la conversin explicita, que debeindicarse de forma expresa en el cdigo fuente. En C#, se sobreentiende que elconjunto de conversiones explcitas incluye al de conversiones implcitas, ms lassiguientes:

    Conversiones explcitas numricas: Son aquellas en las que se indica enel cdigo fuente el tipo de dato a convertir mediante la tcnica del casting,hacia otro tipo numrico, como veremos a continuacin.

    Conversiones explcitas de enumeracin: Desbyte, byte, short,ushort, int, uint, long, ulong, char, float, doubleo decimala cualquiertipo enum as como su opuestos(deenuma los tipos citados), ms todosaquellos de cualquier tipo enuma cualquier otro tipoenum.

    Conversiones explcitas de referencia: en general, aquellas en las queestn implicados tipos por referencia (ver Tabla 1).

    Conversiones explcitas de interfaz: similares a las anteriores, pero enlas que uno de los operandos se refiere a una interfaz, en lugar de a unaclase.

    Conversiones Unboxing. (de las que ya hemos visto un ejemplo) Conversiones explcitas definidas por el usuario: Si el lector harevisado la lista de palabras reservadas del lenguaje, probablemente, hayareparado en la presencia de dos que tienen que ver directamente con eltema que nos ocupa: implicity explicit. Estas definiciones pueden usarseen el cdigo para establecer la forma exacta en que deseamos que se lleve acabo una conversin de un tipo definido por el programador.

    La conversin implcita slo es posible si el tipo convertido es mayor que el original.Veamos en un ejemplo esta situacin:

    Conversiones implicitas y explcitas

    long x = 0;int y = (int) x;

    /* Si no lo indicramos expresamente, el compilador dara un error del

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    27/38

    tipo: no se puede convertir implcitamente el //tipo long a int */

    short z = (short) x;object z = (object) x; //Aqu, el moldeado permite llamar al

    mtodo ToString() sobre el objeto z

    System.Console.WriteLine({0}, z.ToString() + -convertido);Salida:

    1-convertido

    En C#, la palabras reservadas checked(conversin comprobada) y unchecked(conversin no comprobada) pueden usarse para garantizar que la conversin deun tipo ha sido correcta, lo que requiere una expresin extra entre parntesis(moldeado mltiple), o bien para ignorar explcitamente la excepcin que seproducira, por ejemplo, en un caso de desbordamiento. Veamos el siguienteejemplo:

    Conversiones checked y uncheckeddouble x = 1234567.89;

    int y = checked ((int)x); // El valor de y es de 1234567. (Se pierden

    los decimales)

    int z = unchecked (int) (x * x )

    Otros casos de moldeado mltiple son comunes al trabajar con la jerarqua declases de .NET cuando se quieren convertir tipos definidos por el usuario en otros ose utiliza conversin de interfaces. La regla, en este caso, es que siempre existeuna conversin implcita entre un tipo complejo y su tipo base.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    28/38

    El trabajo con clases en C#

    El lector conoce, sin duda los fundamentos de la programacin orientada a objetos,por lo que no creo necesario abundar aqu sobre el tema. S parece adecuado, noobstante, abordar la construccin y estudio de las clases siguiendo tales principiosfundamentales, que podramos dividir conceptualmente en dos puntos de vista: elestructural y el funcional.

    Entendemos, en el primer caso, aquellos elementos que dan a la clase unaarquitectura, y que tradicionalmente, se han subdividido en: campos, mtodos,operadores y eventos. En el caso de C#, ser necesario adems, incluir algunoselementos nuevos que constituyen precisamente las aportaciones ms importantesdel lenguaje, como son las propiedades (properties), los indizadores (indexers) ylos delegados (delegates). Se trata de una divisin meramente conceptual, ya que

    estos elementos se traducen a su vez en caractersticas del funcionamiento de unaclase, y por tanto aportan siempre un componente funcional, a la vez queestructural.

    Campos

    Un campo es una variable miembro de una clase, que sirve para almacenar unvalor. Admiten varios modificadores, que definen el comportamiento del campo entiempo de ejecucin: private, public, protected, internal, static, readonlyyconst. A los cuatro primeros, se les denomina modificadores de acceso.Comentamos a continuacin algunos de sus significados.

    La tabla siguiente recoge los niveles de accesibilidad establecidos en C#, junto consu significado:

    Accesibilidad declaradaSignificado

    publicAcceso no restringido

    protectedAcceso limitado a la clase contenedora o a los tiposderivados de esta clase.

    internalAcceso limitado al proyecto actual.

    protected internalAcceso limitado al proyecto actual o a los tipos derivadosde la clase contenedora.

    privateAcceso limitado al tipo contenedor.

    Private

    La declaracin private es la declaracin predeterminada de un miembro en C#.Significa que dicho miembro slo es visible desde la propia clase y sus clasesanidadas (que no derivadas), pero no desde variables de instancia (desde otros

    objetos que instancien una variable de esa clase). Constituye el pilar fundamental

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    29/38

    del principio de la Encapsulacin, y protege del acceso inadvertido a los miembrosde una clase, permitiendo preservar la lgica interna definida en su creacin.

    Public

    Aunque existe en todos los lenguajes orientados a objetos, su utilizacin se justificararamente, puesto que atenta contra el primer principio de la OOP: laEncapsulacin. Un miembro public es accesible sin restricciones, por lo que no hayningn tipo de control sobre los valores que son asignados y/o devueltos.

    Entre estos dos lmites C# proporciona mtodos mixtos de acceso, permitiendodistintos niveles:

    Protected

    Es idntico a private, a excepcin de que se permite que los miembros de las clasesderivadas tengan acceso al mismo (al igual que las clases anidadas). Se presta bienpara ofrecer funcionalidad a clases derivadas, sin permitir asignacionesinapropiadas, como en el caso de los miembros public. El siguiente cdigo fuenteilustra perfectamente esta situacin:

    Ejemplo de declaraciones tipo Protectedclass A

    {

    protected int x = 123;

    }

    class B : A

    {

    void F(){

    A a = new A();

    B b = new B();

    a.x = 10; // Error

    b.x = 10; // OK

    }

    }

    El fallo se produce debido a que la clase A no deriva de la clase B (sino alcontrario), y el miembro x, est declarado en A, comoprotected.

    Internal

    Es un modificador de acceso para tipos y miembros de tipos. Eso significa que elmodificador es aplicable la declaracin de clases, cuando queremos limitar su uso alproyecto en el que son declaradas. Los miembros internos slo son accesiblesdentro de archivos del mismo ensamblado.

    El MSDN nos recuerda que un uso habitual del acceso de tipo interno se da en eldesarrollo basado en componentes, ya que permite a un grupo de componentescooperar de manera privada sin estar expuesto al resto del cdigo de la aplicacin.Por ejemplo, una estructura para crear interfaces grficas de usuario podraproporcionar clases Controly Formque cooperan mediante miembros con acceso

    de tipo internal. Como estos miembros son internos, no estn expuestos al cdigoque utiliza la estructura.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    30/38

    Protected internal

    Es el nico modificador que admite ms de una palabra reservada. El acceso selimita al proyecto actual o a los tipos derivados de la clase contenedora.

    Static

    Aunque ya nos hemos referido a l en artculos anteriores, recordemos que sirvepara declarar un miembro que pertenece al propio tipo en vez de a un objetoespecfico. El modificadorstaticse puede utilizar con campos, mtodos,propiedades, operadores y constructores, pero no con indizadores, destructores otipos.

    Readonly

    El modificador readonly, indica, obviamente, que un miembro es de slo lectura.

    Se diferencian de las declaraciones constque veremos a continuacin en que nopueden ser calculadas en tiempo de compilacin, generalmente, debido a que seprecisa una instancia de un objeto para hacerlo, y que deben de ser asignadas, obien en su declaracin, o en el mtodo constructor de la clase

    Const

    Se definen como campos cuyo valor puede ser determinado por el compilador entiempo de compilacin y que no se pueden modificar en tiempo de ejecucin (son,de forma implcita, readonly). Son, pues, ms restrictivas que las variablesreadonly, pero pueden definirse tambin a partir de otras constantes (pero novariables aunque stas hayan sido declaradas previamente):

    Ejemplo de constantesconst int x = 1;

    const int y = x + 1;

    int z = 2;

    const w = z + y + 1; //Error: z es una variable

    Propiedades

    Sin duda, una de las novedades del lenguaje C# en comparacin con sus similares(C++, Java) es la presencia de las propiedades, tambin llamadas camposinteligentes, que no son sino mtodos de acceso a los campos de una clase, que seven como campos desde el cliente de esa clase. Se trata de un mecanismo mselegante de acceso al estado[1]de una clase, y una de las aportaciones que ellenguaje C# realiza a la mejora de las tcnicas de encapsulacin en los lenguajesOOP

    Las propiedades siguen la notacin tpica de C# para las estructuras de control,disponiendo de 2 modificadores de acceso: Get para la lectura y Set para laasignacin de valores al campo (escritura). El ejemplo siguiente declara unapropiedad Nombre de tipo lectura/escritura y otra propiedad FechaDeAlta de slolectura, que son accedidas posteriormente. Un intento de escribir en la propiedadfechaAlta, de slo lectura, genera un error en tiempo de compilacin:

    http://www.algoritmodigital.com/articulos/078/a078mpm1.asphttp://www.algoritmodigital.com/articulos/078/a078mpm1.asp
  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    31/38

    Ejemplo de clase con propiedadesusing System;

    class ClaseConPropiedades {

    string nombre;

    System.DateTime fechaAlta;

    public string Nombre

    {get { return nombre; }

    set {nombre = value; }

    }

    public DateTime FechaAlta

    {

    get { return fechaAlta; }

    }

    public ClaseConPropiedades(string nombre) //El constructor

    inicializa

    // fechaAlta

    {

    fechaAlta = System.DateTime.Now;

    this.nombre = nombre;}

    static void Main()

    {

    ClaseConPropiedades ccp = new

    ClaseConPropiedades("Posadas");

    Console.WriteLine("El cliente {0} se dio de alta

    en {1}",

    ccp.Nombre, ccp.FechaAlta);

    ccp.FechaAlta = new DateTime(2000, 1, 1, 0, 0, 0);

    //Error

    }

    }

    Mtodos

    Los mtodos de una clase constituyen su componente funcional, siendo aquello quelas dota de un comportamiento. Siguiendo las definiciones formales que aporta elMSDN diremos que un mtodo es un miembro que implementa un clculo o unaaccin que pueden ser realizados por un objeto o una clase. Los mtodos tienenuna lista de parmetros formales (que puede estar vaca), un valor devuelto (salvoque el tipo de valor devuelto del mtodo sea void), y son estticos o no estticos.El acceso a los mtodos estticos se obtiene a travs de la clase. El acceso a losmtodos no estticos, tambin denominados mtodos de instancias, se obtiene a

    travs de instancias de la clase.

    Mtodos constructores

    Recordemos que un mtodo constructor es aquel que se llama siempre que se creauna instancia de una clase. Debe de tener el mismo nombre de la clase, peroadmite diferentes signaturas, dependiendo de los distintos conjuntos de parmetrosque queramos pasar al constructor. En C# existen 3 tipos de constructores: deinstancia, privatey static.

    Un constructor de instancia se utiliza para crear e inicializar instancias, y es generalmente- el constructor predeterminado. La sintaxis completa de unconstructor de este tipo es:

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    32/38

    [atributos] [modificadores] identificador ([lista-de-parmetros-formales])[inicializador]

    { cuerpo-del-constructor }

    donde los tres parmetros ms significativos son:

    Los modificadores permitidos, que pueden ser extern cualquiera de los 4modificadores de acceso

    identificador, que es el nombre de la clase, e inicializador que es una llamada opcional a la clase base (mediante

    :base()) o una referencia a la propia clase, expresada mediantethis(), en caso de que deseemos llamar a otro constructor de lamisma clase, antes de ejecutar el cuerpo del constructor que hace lallamada.

    Dando por sentado que la sintaxis de instanciacin de objetos en C# es:

    = new (argumentos del constructor),

    debemos tener en cuenta que en un mtodo constructor se cumplen siempre lossiguientes supuestos:

    Un mtodo constructor siempre tiene el mismo nombre de la clase a la quepertenece.

    Un mtodo constructor no devuelve ningn tipo de dato Un mtodo constructor admite los modificadores: public, protected,

    internal, private, extern Un mtodo constructor admite atributos. Se dice que la lista de parmetros formales opcional de un constructor deinstancia est sujeta a las mismas reglas que la lista de parmetros formales

    de un mtodo. Dicha lista de parmetros constituye la firma del mtodo y seencarga de discriminar la llamada correspondiente, cuando el constructorest sobrecargado.

    Todo mtodo constructor (excepto System.Object) efecta una llamadaimplcita previa a la clase base del constructor, inmediatamente antes de laejecucin de la primera lnea del constructor. Se conoce estas llamadascomo inicializadores de constructor (Constructor Initializers).

    o Estos inicializadores de constructor, si son explcitos (si se indicancomo tales en el cdigo fuente), pueden presentarse en dos formas,dependiendo de la palabra reservada que usemos en la llamada: base

    o this. Si utilizamos baseestaremos llamando al constructor de laclase base de la que hereda nuestra propia clase.

    Si usamos this, podemos efectuar una llamada interna desdeun constructor a otro constructor dentro de la clase.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    33/38

    Veamos un ejemplo de esta situacin:

    Ejemplo de llamadas a constructoresusing System;

    class A

    {

    public A(){

    Console.WriteLine("A");

    }

    public A(int x)

    {

    Console.WriteLine("A = {0}", x);

    }

    }

    class B : A

    {

    public B(int x)

    {Console.WriteLine("B = {0}", x);

    }

    }

    class Pruebas

    {

    public static void Main()

    {

    B b = new B(3);

    }

    }

    Los constructoresprivateson un tipo especial de constructor de instancias que noes accesible desde fuera de la clase. Suelen tener el cuerpo vaco, y no es posiblecrear una instancia de una clase con un constructorprivate. Los constructores

    privateson tiles para evitar la creacin de una clase cuando no hay campos omtodos de instancia (son todosstaticcomo, por ejemplo, la clase Math), ocuando se llama a un mtodo para obtener una instancia de una clase.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    34/38

    Ejemplo de Constructor privatepublic class ConstructorPrivate

    {

    private ConstructorPrivate() {} // Cuerpo vaco y miembros

    estticos

    public static int contador;

    public static int IncrementarContador (){

    return ++contador;

    }

    }

    class Pruebas

    {

    static void Main()

    {

    // La llamada siguiente a ConstructorPrivate(comentada) genera

    un error

    // por que no es accesible

    // ConstructorPrivate cs = new ConstructorPrivate(); // ErrorConstructorPrivate.contador = 100;

    ConstructorPrivate.IncrementarContador ();

    Console.WriteLine("Valor: {0}", ConstructorPrivate.contador);

    }

    }

    --------------------

    Salida en ejecucin:

    --------------------

    Valor: 101

    Los constructoresstaticson un tipo especial de constructor que se utiliza parainicializar una clase (no para crear una instancia de ella). El MSDN nos recuerdaque se llama automticamente para inicializar la clase antes de crear la primerainstancia o de hacer referencia a cualquier miembro esttico". Se declara de lasiguiente forma:

    [atributos] static identificador ( ) { cuerpo-del-constructor }

    Tienen las siguientes caractersticas especiales:

    Un constructorstaticno permite modificadores de acceso ni tiene parmetros.

    Es llamado automticamente para inicializar la clase antes de crear la

    primera instancia o de hacer referencia a cualquier miembro esttico. El constructorstaticno puede ser llamado directamente. El usuario no puede controlar cuando se ejecuta el constructorstaticen el

    programa. Los constructoresstaticse utilizan normalmente cuando la clase hace uso

    de un archivo de registro y el constructor escribe entradas en dicho archivo

    Un ejemplo de su uso sera el siguiente:

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    35/38

    Ejemplo de Constructor staticusing System;

    class A

    {

    // Constructor esttico

    static A ()

    {Console.WriteLine("Llamado el constructor esttico");

    }

    public static void F()

    {

    Console.WriteLine("Llamado F().");

    }

    }

    class MainClass

    {

    static void Main()

    {A.F();

    }

    }

    Con ello se consigue forzar la ejecucin del constructor, sea cual sea el miembro dela clase que se llame.

    Mtodos destructores y el Garbage Collector

    En C#, y, a diferencia de la mayora de los lenguajes que soportan algn tipo deorientacin a objetos, los mtodos destructores no debieran ser codificadosexplcitamente, salvo cuando el tipo encapsule recursos no administrados comoventanas, archivos y conexiones de red. Esto es debido a que la recoleccin debasura (la destruccin de un objeto y posterior reorganizacin de la memoriaocupada por l) es realizada automticamente por el Garbage Collector, que esparte vital del entorno de ejecucin de .NET.

    Eso significa, que, aunque exista un mtodo para forzar la llamada al destructor deun tipo (que recibe el nombre de Finalize()) su llamada expresa slo tiene sentidocuando los recursos externos utilizados por el tipo son de peso, o tienen algunacaracterstica especial que les hace susceptibles de una destruccin explcita. En sulugar, los lenguajes del .NET Framework prefieren invocar a un mtodopredeterminado Dispose(), que indica al GC que el objeto en cuestin puede serdestruido y el espacio en memoria ocupado por l, reutilizado, en cuanto suprogramacin predeterminada lo aconseje. Otra razn en contra de la utilizacinexplcita de un mtodo Finalize() es su penalizacin en el rendimiento.

    La sintaxis de un destructor es similar a la de su constructor opuesto:

    [atributos] ~ identificador ( ) { cuerpo-del-destructor }

    El editor de Visual Studio .NET se encarga de situar los mtodos adecuados definalizacin, por lo que no vamos a hacer ms hincapi en este punto.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    36/38

    Modificadores de mtodos

    Son palabras reservadas que califican el comportamiento de un mtodo tanto desdeun punto de vista funcional como de arquitectura. Los principales modificadores demtodos aparecen explicados brevemente en la siguiente tabla.

    Modificador Descripcin

    Static

    El mtodo pertenece al propio tipo (clase) en lugar de aun objeto especfico. No pueden llamarse desde unavariable de instancia.

    Abstract

    El mtodo es un miembro de una clase abstracta. (Si laclase no se declarara como abstracta, esta opcin no estdisponible). No est permitido heredar de un tipoabstracto. Su funcin se limita a la definicin de

    jerarquas de clases.

    Virtual

    La implementacin del mtodo puede cambiarsemediante un miembro de reemplazo (override) de unaclase derivada. Pueden llamarse igual que los mtodosestndar.

    Extern

    Slo se establece su declaracin formal. Laimplementacin es externa. Se usa principalmente paradeclarar funciones de una librera externa a .NETFramework.

    OverrideProporciona una nueva implementacin de un miembrovirtual heredado de una clase base.

    New

    Oculta explcitamente un miembro heredado de una clasebase. Se diferencia de overrideen que la ocultacinimpide la llamada al mismo mtodo en las clasesantecesoras.

    Modificadores Especiales

    Abstract

    Aplicable a una clase y tambin a un mtodo cuya clasehaya sido declarada de igual forma, permite definir

    jerarquas de clases, sin proporcionar implementacionesde los mtodos.

    SealedAplicable exclusivamente a las clases, establece que laclase no se puede heredar, solo se permite lainstanciacin de objetos de la clase.

    Hay que tener en cuenta que algunos modificadores se pueden combinar, perootros son mutuamente excluyentes. Por ejemplo, se pueden establecercombinaciones como extern static, new virtual, y override abstract.

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    37/38

    Sobrecarga de Operadores (Operator Overloading)

    Hemos visto el funcionamiento de la sobrecarga aplicada a los mtodos, pero stano es la nica forma de sobrecarga que permite el lenguaje C#: tambin podemosestablecer cmo deseamos que sea el comportamiento de nuestros propios tipos

    cuando les aplicamos los operadores arimticos clsicos, como +, -, *, etc, y engeneracualquier operador.

    Como se ha hablado mucho en pro y en contra del uso de la sobrecarga deoperadores en los lenguajes de programacin, me gustaria citar una opinin a laque me adhiero, y que puede leerse en [Gunnerson 2000]: "Slo se deberasobrecargar un operador si as se obtiene un cdigo ms claro. Y observe que eltexto dice ms claro, no ms corto". O como recomienda la propia documentacindel MSDN: "La norma para saber cundo sobrecargar es muy simple. Si el usuarioesperara poder realizar esa operacin, se debera sobrecargar

    Operadores sobrecargables en C#

    Operadores Unarios +, -, !, ~, ++, --, true, false

    Operadores Binarios+, -, *, /, %, &, |, ^, , ==, !=, >, =,

  • 5/23/2018 Introducci n Al Lenguaje C# EIDOS

    38/38

    Ejemplo de Sobrecarga// Ejemplo sobrecarga con nmeros complejos

    using System;

    public struct Complejo

    {

    public int real;public int imaginaria;

    public Complejo(int real, int imaginaria)

    {

    this.real = real;

    this.imaginary = imaginaria;

    }

    // Declarar el operador de sobrecarga (+), los tipos

    // que se pueden agregar (dos objetos Complejo), y el

    // tipo de valor devuelto (Complejo):

    public static Complejo operator +(Complejo c1, Complejo c2)

    {return new Complejo(c1.real + c2.real, c1.imaginaria + c2.imaginaria);

    }

    // Reemplazar el mtodo ToString para mostrar adecuadamente nmero

    complejo

    public override string ToString()

    {

    return(String.Format("{0} + {1}i", real, imaginaria));

    }

    public static void Main()

    {

    Complejo num1 = new Complejo(2,3);

    Complejo num2 = new Complejo(3,4);

    // Agregar dos objetos Complejo (num1 y num2) mediante el operador ms

    sobrecargado

    Complejo sum = num1 + num2;

    // Imprimir los nmeros y la suma usando el mtodo reemplazado

    ToString:

    Console.WriteLine("Primer nmero complejo: {0}",num1);

    Console.WriteLine("Segundo nmero complejo: {0}",num2);

    Console.WriteLine("Suma de los dos nmeros: {0}",sum);

    }

    }

    No obstante, conviene recordar lo dicho al principio, la sobrecarga debe desopesarse adecuadamente, para evitar lo que algunos llaman "una solucin enbusca de un problema", o sea, utilizar una caracterstica a toda costa, tenga o nosentido en la solucin que intentamos construir.