You are on page 1of 43

NDICE

1.- INTRODUCCIN A C#..............................................................................................................................2 2.- DESARROLLO DE APLICACIONES DE CONSOLA..........................................................................4 2.1 ESCRITURA Y COMPILACIN DE UNA APLICACIN BSICA.....................................................................................4 2.2 ESPACIOS DE NOMBRES....................................................................................................................................7 2.3 APLICACIONES CON ARGUMENTOS.....................................................................................................................8 2.4 TIPOS BSICOS ..............................................................................................................................................9 2.5 INSTRUCCIONES CONDICIONALES ......................................................................................................................9 2.6 INSTRUCCIONES ITERATIVAS...........................................................................................................................11 3.- DESARROLLO DE APLICACIONES DE VENTANAS.....................................................................17 3.1 INTRODUCCIN A VISUAL STUDIO .NET........................................................................................................17 3.2 DISEO DE LA INTERFAZ................................................................................................................................20 3.3 DISEO DE LOS MENS..................................................................................................................................22 3.4 ASOCIACIN DE CDIGO A EVENTOS................................................................................................................24 3.5 ASOCIACIN DE CDIGO A EVENTOS EN VISUAL STUDIO.NET..........................................................................26 4.- DESARROLLO DE SERVICIOS WEB..................................................................................................33 4.1 INTRODUCCIN A LOS SERVICIOS WEB............................................................................................................33 4.2 ESCRITURA DE UN SERVICIO WEB...................................................................................................................33 4.3 PGINA DE PRUEBA DE UN SERVICIO WEB.......................................................................................................35 4.4 ACCESO A UN SERVICIO WEB MEDIANTE SOAP.............................................................................................36 4.5 MANTENIMIENTO DEL ESTADO........................................................................................................................37 4.6 SERVICIOS WEB CON VISUAL STUDIO.NET...................................................................................................40 5.- DOCUMENTACIN DE REFERENCIA...............................................................................................43

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

1.- Introduccin a C#
C# (pronunciado en ingls C Sharp y en espaol C Almohadilla) es el nuevo lenguaje diseado por Microsoft para su plataforma .NET. En concreto, ha sido diseado por Scott Wiltamuth y Anders Hejlsberg, ste ltimo tambin conocido por haber sido el diseador del lenguaje Turbo Pascal y la herramienta RAD Delphi. Aunque en realidad es posible escribir cdigo para la plataforma .NET en muchos otros lenguajes, como Visual Basic.NET o JScript.Net, C# es el nico que ha sido diseado especficamente para ser utilizado en esta plataforma, por lo que programarla usando C# es mucho ms sencillo e intuitivo que hacerlo con cualquiera de los otros lenguajes. Por esta razn, Microsoft suele referirse a C# como el lenguaje nativo de .NET, y de hecho, gran parte de la librera de clases base de .NET ha sido escrito en este lenguaje. C# es un lenguaje orientado a objetos sencillo, moderno, amigable, intuitivo y fcilmente legible que ha sido diseado por Microsoft con el ambicioso objetivo de recoger las mejores caractersticas de muchos otros lenguajes, fundamentalmente Visual Basic, Java y C++, y combinarlas en uno slo en el que se unan la alta productividad y facilidad de aprendizaje de Visual Basic con la potencia de C++. Aunque con la beta actualmente disponible del lenguaje no se consiguen prestaciones en velocidad tan altas como usando el C++ tradicional, Microsoft asegura que en futuras versiones se ir aumentando la eficiencia del lenguaje, gracias fundamentalmente a la posibilidad de generar dinmicamente cdigo optimizado para aprovechar las caractersticas de la mquina sobre la que se ejecute el programa. Quizs el ms directo competidor de C# es Java, lenguaje con el que guarda un enorme parecido en su sintaxis y caractersticas. En este aspecto, es importante sealar que C# incorpora muchos elementos de los que Java carece (sistema de tipos homogneo, propiedades, indexadores, tablas multidimensionales, operadores redefinibles , etc.) y que segn los benchmarks realizados la velocidad de ejecucin del cdigo escrito en C# es ligeramente superior a su respectiva versin en Java1 A continuacin se recoge de manera resumida las principales caractersticas de C#. No se preocupe si no entiende algunas de ellas, ya que no es indispensable hacerlo para seguir adecuadamente el resto del contenido del taller. Slo se comentan ahora para que los programadores ms experimentados puedan obtener una visin general del lenguaje:

Dispone de todas las caractersticas propias de cualquier lenguaje orientado a objetos: encapsulacin, herencia y polimorfismo. Ofrece un modelo de programacin orientada a objetos homogneo, en el que todo el cdigo se escribe dentro de clases y todos los tipos de datos, incluso los bsicos, son clases que heredan de System.Object (por lo que los mtodos definidos en sta son comunes a todos los tipos del lenguaje)

Los benchmarks han sido realizados usando la beta 1 del .NET SDK y el JDK 1.3. En breve estarn disponibles en el Rincn en espaol de C# (http://tdg.lsi.us.es/~csharp) Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 2

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Permite definir estructuras, que son clases un tanto especiales: sus objetos se almacenan en pila, por lo que se trabaja con ellos directamente y no referencias al montculo, lo que permite accederlos ms rpido. Sin embargo, esta mayor eficiencia en sus accesos tiene tambin sus inconvenientes, fundamentalmente que el tiempo necesario para pasarlas como parmetros a mtodos es mayor (hay que copiar su valor completo y no slo una referencia) y no admiten herencia (aunque s implementacin de interfaces) Es un lenguaje fuertemente tipado, lo que significa se controla que todas las conversiones entre tipos se realicen de forma compatible, lo que asegura que nunca se acceda fuera del espacio de memoria ocupado por un objeto. As se evitan frecuentes errores de programacin y se consigue que los programas no puedan poner en peligro la integridad de otras aplicaciones. Tiene a su disposicin un recolector de basura que libera al programador de la tarea de tener que eliminar las referencias a objetos que dejen de ser tiles, encargndose de ello ste y evitndose as que se agote la memoria porque al programador olvide liberar objetos intiles o que se produzcan errores porque el programador libere reas de memoria ya liberadas y reasignadas. Incluye soporte nativo para eventos y delegados. Los delegados son similares a los punteros a funciones de otros lenguajes como C++ aunque ms cercanos a la orientacin a objetos, y los eventos son mecanismos mediante los cuales los objetos pueden notificar de la ocurrencia de sucesos. Los eventos suelen usarse en combinacin con los delegados para el diseo de interfaces grficas de usuario, con lo que se proporciona al programador un mecanismo cmodo para escribir cdigos de respuesta a los diferentes eventos que puedan surgir a lo largo de la ejecucin de la aplicacin. (pulsacin de un botn, modificacin de un texto, etc.) Incorpora propiedades, que son un mecanismo que permite el acceso controlado a miembros de una clase tal y como si de campos pblicos se tratasen. Gracias a ellas se evita la prdida de legibilidad que en otros lenguajes causa la utilizacin de mtodos Set() y Get() pero se mantienen todas las ventajas de un acceso controlado por estos proporcionada. Permite la definicin del significado de los operadores bsicos del lenguaje (+, -, *, &, ==, etc.) para nuestros propios tipos de datos, lo que facilita enormemente tanto la legibilidad de las aplicaciones como el esfuerzo necesario para escribirlas. Es ms, se puede incluso definir el significado del operador [] en cualquier clase, lo que permite acceder a sus objetos tal y como si fuesen tablas. A la definicin de ste ltimo operador se le denomina indizador, y es especialmente til a la hora de escribir o trabajar con colecciones de objetos. Admite unos elementos llamados atributos que no son miembros de las clases sino informacin sobre stas que podemos incluir en su declaracin. Por ejemplo, indican si un miembro de una clase ha de aparecer en la ventana de propiedades de Visual Studio.NET, cules son los valores admitidos para cada miembro en sta, etc.

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 3

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

2.- Desarrollo de aplicaciones de consola


2.1 Escritura y compilacin de una aplicacin bsica Como primer contacto con C#, nada mejor que escribir el tpico programa de iniciacin Hola Mundo. Este programa lo nico que hace al ejecutarse es mostrar por pantalla el mensaje Hola Mundo, y su cdigo es: // HolaMundo1.cs: Ejemplo tpico class HolaMundo1 { public static void Main() { System.Console.WriteLine(Hola Mundo!); } } Si almacenamos este cdigo en un fichero de texto plano de nombre HolaMundo.cs podemos compilarlo abriendo una ventana de consola (MS-DOS) y, tras colocarnos en el directorio donde hayamos almacenado el fichero, ejecutando:
csc HolaMundo1.cs

csc es el nombre del compilador de C#, y la orden anterior simplemente indica que deseamos compilar el fichero de cdigo fuente HolaMundo.cs, y tras ejecutarla el compilador generar un fichero de nombre HolaMundo.exe que contendr el ejecutable de nuestra sencilla aplicacin de ejemplo. Para ejecutarlo basta escribir:
HolaMundo1

El resultado que veremos por la pantalla ser:


Hola Mundo!

Una vez que ya sabemos cmo compilar y ejecutar aplicaciones escritas en C#, es el momento de analizar detenidamente el significado del cdigo anterior: 1: 2: 3: 4: 5: 6: 7: class HolaMundo1 { public static void Main() { System.Console.WriteLine(Hola Mundo!); } }

Ntese que se ha eliminado la lnea // HolaMundo.cs: Ejemplo tpico que apareca en la versin original del cdigo. Esto se debe a que es slo un comentario que se introduce para facilitar la legibilidad del cdigo a los lectores humanos pero que el compilador ignora completamente, por lo que no la incluiremos en el presente anlisis. Cabe sealar que en C# se considera comentario a todo aquel texto comprendido entre los

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 4

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

caracteres // y el final de la lnea donde aparecen y a todo texto comprendido entre los caracteres /* y */ Como en la introduccin se coment, todo el cdigo escrito en C# se ha de escribir dentro de una clase. As, lo que en la lnea 1: se dice es que lo a que continuacin se incluir es la definicin de una clase (class) a la que le daremos el nombre de HolaMundo1, estando la definicin de la misma comprendida entre la primera llave que aparezca (lnea 2:) y su correspondiente llave de cierre (lnea 7:) Lo que dentro de la definicin de la clase se dice (lnea 3:) es que va a tener un mtodo de nombre Main cuyo cdigo es el indicado entre la prxima llave de apertura (lnea 4:) y su respectiva llave de cierre (lnea 6:) Un mtodo no es ms que un conjunto de instrucciones a las que se les asocia un nombre, de modo que si posteriormente se desea ejecutarlas basta referenciarlas por su nombre en vez de tener que reescribirlas. La partcula que antecede al nombre del mtodo indica cul es el tipo de valor que se devuelve tras la ejecucin del mtodo, y en este caso es void que significa que no se devuelve nada. Por su parte, los parntesis que se colocado tras el nombre del mtodo indican cules son los parmetros ste toma. stos parmetros permiten variar el resultado de la ejecucin del mtodo en cada llamada al mismo, segn los valores que para ellos se especifiquen. Como en este caso los parntesis estn vacos, nuestro mtodo no toma parmetros de ningn tipo. Las palabras public y static que anteceden a la declaracin del tipo de valor devuelto son modificadores opcionales del significado de la declaracin de mtodo. public indica que el mtodo es pblico; es decir, que puede llamrsele desde cdigo escrito dentro cualquier otra clase. En caso de no incluirse este modificador se habra considerado que el mtodo es privado (equivalente a haber usado la partcula private), lo que significa que slo sera correcto llamarle desde dentro de la misma clase en que se declara. Por su parte, static indica que es un mtodo esttico; es decir, asociado a la clase dentro de la que se define y no a los objetos que se creen a partir de la misma, por lo que para acceder a l se usar la sintaxis nombreClase.NombreMtodo(parmetros) en nuestro caso HolaMundo1.Main()- y no objeto.NombreMtodo(parmetros) como corresponde a los mtodos no estticos. El nombre, modificadores, tipos de parmetros y tipo de valor devuelto que se han dado al mtodo Main() del ejemplo no son arbitrarios, sino que se corresponden con una de las cuatro posibles formas de definir el punto de entrada de nuestra aplicacin. Este punto de entrada es sencillamente el mtodo a partir del cual se comenzar a ejecutar el cdigo de nuestra aplicacin, y su declaracin ha de ser de una de estas cuatro formas posibles: public public public public static static static static int Main() void Main() void Main(String[] args) int Main(String[] args)

El parmetro que puede tomar el mtodo Main() almacena la lista de argumentos con los que se llam a la aplicacin; y como se ve, en caso de que no vayamos a utilizarla no es necesario especificarla en la declaracin de Main(). El tipo de este parmetro es

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 5

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

String[], que significa que es una tabla de cadenas de texto (objetos String); y su nombre, que es el que habr de usarse dentro del cdigo del mtodo Main() para hacerle referencia, puede ser cualquiera (en el ejemplo es args) Por otro lado, la primera y ltima forma de uso del mtodo Main() muestran que ste no tiene porque no devolver ningn valor, sino que puede devolver uno de tipo int. Dicho valor sera interpretado como cdigo de retorno de la aplicacin, que suele usarse para indicar si la aplicacin a terminado con xito (generalmente valor 0) o no (otros valores segn la causa de la terminacin anormal) Un int no es ms que un tipo de datos capaz de almacenar valor enteros comprendidos entre 2.1471483.648 y 2.1471483.647. Finalmente, la nica lnea que nos queda por estudiar de nuestro sencillo programa de ejemplo es precisamente el cdigo a ejecutar; es decir, el cdigo de su mtodo Main() Recordemos que este cdigo era: 5: System.Console.WriteLine(Hola Mundo!);

Esta instruccin lo nico que hace es ejecutar el mtodo WriteLine() de la clase Console sta clase viene predefinida en la librera de clases de .NET, y WriteLine() es un mtodo de clase (static) definido dentro de ella (al igual que nuestro Main() lo est en la clase HolaMundo1) cuyo cdigo lo que hace es imprimir en el dispositivo de salida estndar de nuestra mquina (por defecto la ventana de consola) la cadena de texto que le pasemos como parmetro. Una cadena de texto es cualquier secuencia de caracteres encerrada entre comillas dobles (...), aunque dichas comillas no forman parte de la cadena como puede observarse viendo que al ejecutar el ejemplo no se muestran en pantalla. Antes de continuar es importante resaltar algunos aspectos: 1) C# es un lenguaje sensible a las maysculas, los que significa que no da igual la capitalizacin con la que se debe escribir cada identificador. Es decir, no es lo mismo escribir Console que COnsole o que CONSOLE, y en caso de que lo hagamos de una de las dos ltimas formas el compilador producir un error indicando que no conoce ninguna clase con ese nombre. Un error comn entre programadores acostumbrados a Java es llamar al punto de entrada del programa main() en vez de Main() 2) Todo el cdigo escrito en un fichero de cdigo fuente en C# es autocontenido. Es decir, no son necesarios ni ficheros de cabecera ni ficheros IDL ni ningn otro tipo de fichero adicional aparte del propio fichero de cdigo fuente. 3) Por defecto, el compilador slo busca definiciones de clases predefinidas en el fichero mscorlib.dll, y si vamos a usar clases definidas en otro fichero hemos de indicrselo mediante la opcin /r del compilador. Por ejemplo, un error frecuente entre principiantes es no saber cmo compilar una aplicacin de ventanas, pues hay que indicar en qu ficheros se encuentran las clases predefinidas necesarias as:
csc /t:winexe /r:System.Winforms.dll;System.dll;Microsoft.Win32.Interop.dll Fuente.cs

Ntese que tambin es necesario usar la opcin /t: para indicar que deseamos crear un ejecutable de ventanas, pues por defecto se crean ejecutables de consola.

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 6

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

2.2 Espacios de nombres Un espacio de nombres es una forma de organizar las clases definidas en la librera de .NET en grupos de clases relacionadas entre s. Por ejemplo, dentro del espacio de nombres System usando en el ejemplo HolaMundo estn incluidas todas las clases ms frecuentemente usadas en cualquier aplicacin .NET. Dado que puede ser tedioso tener que preceder todas nuestras referencias a clases con el nombre del espacio de nombres en que estn definidas, en C# tambin se da la posibilidad de hacer: using System; class HolaMundo2 { public static void Main() { Console.WriteLine(Hola Mundo!); } } Las sentencias using siempre han de incluirse en el fichero fuente antes de la declaracin de cualquier clase y permite indicar cules son los espacios de nombres que se usaran implcitamente. En nuestro ejemplo, gracias al uso esta sentencia no es necesario preceder la referencia a la clase Console con el nombre del espacio de nombres en que est definida, sino que el compilador automticamente intentar encontrarla buscndola en el espacio de nombres System. Los espacios de nombres tambin son tiles para evitar conflictos en caso de que se quiera usar clases de igual nombre pero procedentes de distintos fabricantes, pues las diferenciaramos por su espacio de nombres. Para esto, es necesario que no coincidan los nombres stos espacios, y una buena forma de hacerlo es dndoles el nombre de la empresa que desarroll la clase, o el nombre del dominio de Internet de sta, etc. Para indicar que una clase forma parte de un espacio de nombres basta incluir su definicin dentro de la definicin de un espacio de nombres. Por ejemplo, si queremos definir nuestra clase de ejemplo anterior dentro de un espacio de nombres llamado Pruebas bastara aadir estas lneas: using System; namespace Pruebas { class HolaMundo3 { public static void Main() { Console.WriteLine(Hola Mundo!); } } }

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 7

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

2.3 Aplicaciones con argumentos Antes se coment que es posible declarar el mtodo Main() de modo que tome un parmetro de tipo String[] que contenga los argumentos con los que se llam a la aplicacin. Es decir, de una de estas dos formas: public static void Main(String[] args) public static int Main(String[] args) String[] indica que el parmetro Main() es una tabla de cadenas. Como en la mayora de lenguajes de programacin, una tabla no es ms que una conjunto de valores ordenados y de tamao fijo. Los corchetes [] en la declaracin del parmetro indican que ste es una tabla, y String indica que es una tabla de cadenas. Es importante resaltar el hecho de que aunque una tabla siempre tiene un tamao fijo, ste tamao no forma parte de la declaracin de la misma. Esto permite que una misma variable de tipo tabla pueda almacenar tablas de diferentes tamaos, aunque el tamao de la tabla almacenada en cada instante no pueda modificarse. Los elementos de la tabla de cadenas que puede tomar como parmetro el mtodo Main() son cada uno de los argumentos con los que se llam al programa. En C# las tablas se indexan desde 0, lo que significa que su primer argumento se almacena en la posicin 0, el segundo en la posicin 1, etc. Esto es importante tenerlo presente a la hora de acceder a cada elemento de una tabla, para lo que se usa la notacin tabla[posicinElemento] como muestra la siguiente variante de la clase HolaMundo using System; class HolaMundo4 { public static void Main(String[] args) { Console.WriteLine(Hola {0}!, args[0]); } } Es importante notar la forma especial en que se ha realizado la llamada al mtodo WriteLine() En este caso, la cadena a imprimir contiene una secuencia de caracteres de la forma {nmero} que indica que se ha de mostrar en su lugar el valor del argumento nmero+2 de WriteLine() As, en nuestro ejemplo {0} indica que se ha de mostrar el valor del segundo argumento; es decir, el de args[0], que es el primer argumento con que se llam a HolaMundo4 (las tablas se indizan empezando por 0) Ahora cuando ejecutemos el programa hemos de pasarle un argumento y en funcin del valor que ste tome se mostrar un mensaje de bienvenida personalizado. Por ejemplo, si ejecutamos el programa as:
HolaMundo4 Jos

Se nos mostrar el siguiente mensaje de saludo:


Hola Jos!

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 8

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

2.4 Tipos bsicos Ahora que ya sabemos cul es la estructura bsica de un programa en C#, es el momento ms adecuado para empezar a conocer cules son los tipos de datos bsicos de los que el lenguaje dispone. Estos se resumen en la siguiente tabla:
Tipo sbyte byte short ushort int uint long ulong float double decimal boolean char string object Descripcin Bytes con signo Bytes sin signo Enteros cortos con signo Enteros cortos sin signo Enteros normales Enteros normales sin signo Rango -128 - 127 0 - 255 -32.768 - 32.767 0 - 65.535 -2.147.483.648 - 2.147.483.647 0 - 4.294.967.295 -9.223.372.036.854.775.808 Enteros largos 64 9.223.372.036.854.775.807 Enteros largos sin signo 64 0 - 18.446.744.073.709.551.615 Reales con 7 dgitos de precisin 32 1,510-45 - 3,41038 Reales con 15-16 dgitos de precisin 64 5,010-324 - 1,710308 Reales con 28-29 dgitos de precisin 128 1,010-28 - 7,91028 Valores lgicos 32 true, false Caracteres Unicode 16 Unicode 0 Unicode 65535 Cadenas de caracteres var Permitido por memoria Cualquier objeto var Depende del objeto Bi ts 8 8 16 16 32 32 Alias SByte Byte Int16 UInt16 Int32 UInt32 Int64 Uint64 Float Double Decimal Boolean Char String Object

En C# los tipos bsicos son tipos del mismo nivel que cualquier otro tipo del lenguaje. Es decir, heredan de System.Object y pueden ser tratados como objetos de la misma por cualquier rutina que espere un System.Object, lo que cual es muy til para el diseo de rutinas genricas, que admitan parmetros de cualquier tipo. En realidad todos los tipos bsicos de C# son simples alias de tipos del espacio de nombres System, como se recoge en la ltima columna de la tabla. Por ejemplo, sbyte es alias de System.Sbyte y da igual usar una forma del mismo u otra. 2.5 Instrucciones condicionales C# ofrece una serie de instrucciones que permiten ejecutar bloques de cdigo slo si se da una determinada condicin. Estas son:
A)

Intruccin If Como la mayora de los lenguajes de programacin, C# incluye la instruccin condicional if, cuya forma de uso es: if (condicin) intruccionesIf else intruccionesElse

El significado de esta instruccin es el siguiente: se evala la condicin indicada, y en caso de ser cierta se ejecutan las instruccionesIf; mientras que si no lo es se ejecutan las instruccionesElse La rama else es opcional, y si se omite y la condicin es falsa se seguira ejecutando a partir de la siguiente instruccin al if. Si las intruccionesIf o las instruccionesElse constan de ms de una instruccin es necesario encerrar el conjunto de instrucciones de las que constan entre llaves ({...})

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 9

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Un ejemplo de aplicacin de esta instruccin es esta variante del HolaMundo: using System; class HolaMundo5 { public static void Main(String[] args) { if (args.Length > 0) Console.WriteLine(Hola {0}!, args[0]); else Console.WriteLine(Hola mundo!); } } En este caso, si ejecutamos el programa sin indicar ningn argumento al lanzarlo veremos que el mensaje que se imprime es Hola Mundo!, mientras que si lo ejecutamos indicando algn argumento se mostrar un mensaje de bienvenida personalizado (del mismo tipo que en el HolaMundo2) Ntese que para saber si se han pasado argumentos en la llamada al programa y tomar una u otra decisin segn el caso, lo que se hace en la condicin del if es comprobar si la longitud de la tabla de argumentos es superior a 0. Para conocer esta longitud se utiliza la propiedad Length que toda tabla tiene definida. Recurdese que el tamao de una tabla es fijo, por lo que esta propiedad es de slo lectura y no es vlido intentar escribir en ella (como por ejemplo, haciendo args.Length = 2)
B)

Instruccin Switch Para aquellos casos en los haya que ejecutar unos u otros bloques de instrucciones segn el valor de una determinada expresin C# proporciona la instruccin condicional switch, cuya forma de uso es: switch(condicin) { case caso1: instrucciones1: break; case caso2: instrucciones2: break;
...

default: instruccionesDefecto; break; } El significado de esta instruccin es el siguiente: se evala la condicin, y si su valor coincide con el de caso1, se ejecutan las instruciones1; si coincide con el de caso2 se ejecutan las instrucciones2; y as para cada caso mientras no se encuentra alguno que coincida con el valor resultante de la evaluacin. La rama default es opcional, y en caso de agotarse todos los casos y no encontrarse coincidencia, entonces se pasara a ejecutar las intruccionesDefault en caso de que dicha rama apareciese; y si no apareciese, se pasara directamente a ejecutar la instruccin siguiente al switch En realidad, la rama default, si se usa, no tiene porqu aparecer la ltima, aunque se recomienda que lo haga porque ello facilita la legibilidad del cdigo.

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 10

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Un ejemplo de uso de esta instruccin es el siguiente: using System; class HolaMundo6 { public static void Main(String[] args) { if (args.Length > 0) switch(args[0]) { case Jos: Console.WriteLine(Hola Jos. Buenos das); break; case Paco: Console.WriteLine(Hola Paco. Me alegro de verte); break; default: Console.WriteLine(Hola {0}, args[0]); } else Console.WriteLine(Hola Mundo); } } Ahora, nuestro programa reconoce a algunas personas y les saluda de forma especial. Ntese que al final de cada grupo de instrucciones se ha de incluir una instruccin break que indique el final de la lista de instrucciones asociadas a esa rama del switch En realidad, esta instruccin puede ser sustituida por una instruccin goto usada de la forma goto casoi (o goto default) que indique qu otras ramas del switch han de ejecutarse tras llegar a ella. Adems, en la ltima rama del switch no tiene porqu aparecer obligatoriamente ninguna de estas dos sentencias. Para los programadores habituados a lenguajes como C++ es importante resaltarles el hecho de que, a diferencia de dicho lenguaje, C# obliga a incluir una sentencia break o una sentencia goto al final de cada rama del switch, con la idea de evitar errores muy comunes en ste lenguaje, donde no es forzoso hacerlo. 2.6 Instrucciones iterativas C# ofrece un buen nmero de instrucciones que permiten la ejecucin de bloques de cdigos repetidas veces. A continuacin se comentan las principales: Instruccin While Es la instruccin iterativa ms comn en los lenguajes de programacin, y en C# se usa de la siguiente forma: while (condicin) instrucciones El significado de esta instruccin es el siguiente: se evala la condicin, y en

A)

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 11

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

caso de ser cierta se ejecutan las instrucciones. Tras ejecutarlas, se repite el proceso de evaluar la condicin y ejecutar las instrucciones en caso de seguir siendo cierta. Este proceso se repite continuamente hasta que la condicin deje de verificarse. Si las instrucciones constan de ms de una instruccin es necesario encerrarlas entre llaves, del mismo modo que se coment para el caso del if Un ejemplo de aplicacin de esta sentencia es: using System; class HolaMundo7 { public static void Main(String[] args) { int actual = 0; if (args.Length > 0) while (actual < args.Length) { Console.WriteLine(Hola args[actual]); actual = actual + 1; } else Console.WriteLine(Hola mundo!); } } En este caso, si se indica ms de un argumento en la llamada a nuestro programa se mostrar por pantalla un mensaje de saludo para cada uno de ellos. Puede observarse que la primera lnea del mtodo Main() no contiene ahora una instruccin, sino que contiene una declaracin de una variable de tipo int, nombre actual y valor inicial 0 que usaremos en la sentencia iterativa para saber cul es la posicin del argumento a mostrar en cada ejecucin de la misma. El valor de esta variable se ir aumentando en una unidad, para as asegurar que siempre mantiene el valor adecuado para ir mostrando cada uno de los argumentos de llamada y para asegurar que la instruccin while termine de ejecutarse alguna vez, lo cual ocurrir cuando se hallan mostrado todos los argumentos. Es importante sealar que C# no proporciona ningn valor inicial a las variables locales de los mtodos, por lo que es tarea del programador proporcionrselos antes de ser ledos. En cualquier caso, si el compilador detecta que en el cdigo hay alguna posibilidad de que se lea algn parmetro no inicializado informar al programador de ello dando error. La idea detrs de todo esto es conseguir evitar errores comunes y difciles de detectar que se dan en otros lenguajes cuando se olvida inicializar un parmetro y su valor por defecto no es el esperado.

{0}!,

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 12

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

B) Instruccin Do...while Es una variante del while que se usa as: do instrucciones while (condicin); En este caso, el significado de la instruccin es ahora el siguiente: se ejecutan las instrucciones (que en caso de ser varias habrn de ir encerradas entre llaves), y tras ello se evala la condicin. Si el resultado de evaluarla es cierto se vuelve a repetir el proceso, mientras que si no lo es se contina ejecutando a partir de la instruccin siguiente al do ... while Es importante resaltar que en esta instruccin es obligatorio incluir el punto y coma (;) al final del parntesis de cierre de la condicin, ya es un error frecuente entre novatos olvidar incluirlos. Como se ve, do ... while especialmente til para aquellos casos en los que hay que asegurar que las instrucciones en l contenidas se ejecuten al menos una vez, an cuando la condicin sea falsa desde el principio. Un ejemplo de su uso es este cdigo: using System; class HolaMundo8 { public static void Main() { String ledo; do { Console.WriteLine(Clave: ); ledo = Console.ReadLine(); } while (ledo != Jos); Console.WriteLine(Hola Jos); } } Al ejecutarse la aplicacin puede observarse que lo que se hace es preguntar al usuario una clave, de modo que mientras no se introduzca la clave correcta (que es Jos), no se continuar con la ejecucin de la aplicacin; y una vez que se introduzca correctamente se dar un mensaje de bienvenida al usuario. Aparte de la instruccin do ... while, en este ejemplo se ha introducido un nuevo elemento en el ejemplo: una llamada al mtodo ReadLine() de la clase Console Este mtodo detiene la ejecucin de la aplicacin y la deja en espera de que el usuario introduzca una cadena de caracteres y pulse la tecla ENTER, cadena que es devuelta por el mtodo ReadLine() y que en la aplicacin se guarda en la variable de tipo cadena llamada ledo para comprobar posteriormente, en la condicin del do ... while, si coincide con la clave esperada (Jos)

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 13

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

B)

Instruccin For Es otra variante del while que permite compactar el cdigo de este tipo de bloques. Su forma de uso es: for (inicializacin; condicin; incremento) instrucciones

El significado de esta instruccin es el siguiente2: se realizan las inicializaciones de variables indicadas en inicializacin y luego se evala la condicin; si es cierta, se ejecutan las instrucciones indicadas (entre llaves si son varias) Tras ello se ejecutan las operaciones de incremento (o decremento) indicadas y se reevala la condicin. Mientras sta sea cierta se ir repitiendo el proceso de ejecucin de instrucciones, incremento de variables y reevaluacin de la condicin hasta que deje de serlo. En caso de que se desee inicializar o declarar varias variables en el campo de inicializacin o de que se realizar varias operaciones incremento/decremento en el campo decremento habra que separarlas mediante comas (,) Como se ve, la instruccin for recoge de una forma muy compacta el uso principal de la instruccin while normal, siendo un ejemplo de su uso: using System; class HolaMundo9 { public static void Main(String[] args) { if (args.Length > 0) for (int actual = 0; actual < args.Length; actual++) Console.WriteLine(Hola {0}!, args[actual]); else Console.WriteLine(Hola mundo!); } } El funcionamiento de este ejemplo es exactamente el mismo que el del HolaMundo5, slo que en este caso se ha aprovechado la eficacia de la instruccin for para hacer reducir mucho ms el tamao del cdigo. Si acaso, cabra sealar la utilizacin del operador ++ en el campo de incremento, cuyo significado es sumar 1 a la variable sobre la que se aplica. Simtricamente, tambin est definido el operador --, cuyo significado es restar 1 a la variable sobre la que es aplicado. Instruccin Foreach Esta instruccin es la novedad ms importante introducida en el juego de instrucciones de C# respecto a Java y C++, sus ms directos competidores. Se utiliza as: foreach (tipoElemento elemento in coleccin)
2

C)

En realidad, los campos de inicializacin e incremento pueden contener cualquier tipo de instruccin, aunque no suele ser habituar usarlos en un sentido diferentes al descrito. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 14

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

instrucciones Esta instruccin se utiliza para recorrer colecciones de elementos (por ejemplo, tablas), y su significado es muy sencillo: se ejecutan las intrucciones indicadas (estarn encerradas entre parntesis en caso de ser varias) para cada uno de los elementos de la coleccin que se especifica. El siguiente ejemplo muestra cmo se utiliza esta instruccin: using System; class HolaMundo10 { public static void Main(String[] args) { if (args.Length > 0) foreach(String arg in args) Console.WriteLine(Hola {0}!, arg); else Console.WriteLine(Hola mundo!); } } El significado de este ejemplo es el mismo que el del HolaMundo5, aunque como se ve, el uso de foreach simplifica mucho la escritura del mismo, an ms que el uso del for que se vio en el ejemplo previo. Es importante resaltar dos cosas sobre el foreach:
a)

El elemento indicado va variando en cada ejecucin de las instrucciones, de modo que en cada ejecucin se corresponde con uno de los elementos de la coleccin indicada. Sin embargo, hay que tener en cuenta que este elemento (arg en el ejemplo) es de slo lectura, por lo que no puede usarse para modificar los valores de la coleccin escribiendo en l. Para los programadores ms avanzados, puede ser interesante comentar que la instruccin foreach puede usarse para recorrer cualquier objeto que sea una coleccin, entendindose como tal cualquier objeto de una clase que implementa la interfaz IEnumerable Esta interfaz consta de un nico mtodo getEnumerator(), que ha de devolver un objeto que implemente la interfaz IEnumerator. Esta interfaz define las operaciones necesarias para recorrer los elementos de la coleccin, y consta de los siguientes mtodos: void Reset() Reinicia el enumerador devolvindolo a su estado inicial. bool MoveNext() Avanza el enumerador pasndose a considerar el elemento siguiente al actual como el nuevo elemento actual. El valor devuelto indica si se ha alcanzado el final de la coleccin. Current Propiedad de slo lectura que devuelve el elemento actual de la coleccin.

b)

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 15

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 16

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

3.- Desarrollo de aplicaciones de ventanas


3.1 Introduccin a Visual Studio .NET Aunque en principio sera posible desarrollar una aplicacin de ventanas de forma parecida a como hemos estado trabajando hasta ahora; es decir, con un simple editor de texto y utilizando las clases de los espacios de nombres adecuados (principalmente System.WinForms), esto no es lo que en la prctica se suele hacer, ya que ello implicara invertir mucho tiempo en la escritura del cdigo encargado de generar la interfaz de nuestra aplicacin, tiempo que podramos estar aprovechando para centrarnos en resolver los problemas relativos a su lgica y no a su aspecto. Por esta razn, vamos a utilizar la herramienta Visual Studio .NET de Microsoft. Visual Studio.Net permite disear la interfaz de la aplicacin de manera visual, sin ms que arrastrar con el ratn los elementos que necesitemos (botones, lista de seleccin, etc.) sobre las posiciones adecuadas en la ventana de nuestra aplicacin. Tambin incluye otras facilidades para el desarrollo, como una ventana de propiedades desde la que se puede modificar los valores de las propiedades de cada objeto sin tener que escribir cdigo, un depurador de cdigo grfico, un editor de cdigos inteligente que puede detectar nuestros errores de sintaxis instantneamente, etc. Al arrancar Visual Studio.Net (por defecto en Inicio -> Programas -> Microsoft Visual Studio .NET 7.0 -> Microsoft Visual Studio .NET) obtendremos una pantalla como la siguiente:

[Imagen 1. Pantalla inicial de Visual Studio.NET]

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 17

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Lo primero que hemos de hacer es crear un nuevo proyecto donde almacenar los archivos de la aplicacin. Para ello pulsamos File -> New -> Project y obtendremos una ventana desde la que podremos seleccionar tanto el lenguaje con el que vamos a trabajar como el tipo de proyecto que vamos a desarrollar, el nombre del mismo y el directorio base en el que se almacenarn los archivos del proyecto. As, con las opciones que nosotros seleccionaremos el aspecto final de esta ventana ser el siguiente:

[Imagen 2. Ventana de seleccin de tipo de proyecto]

Como se ve, nosotros hemos seleccionado en la ventana Project Types que vamos a realizar un proyecto escrito en C# (opcin Visual C# Projects), en la ventana Templates que vamos a desarrollar una aplicacin de venantas (opcin Windows Application), en el cuadro de texto Name que vamos a darle el nombre EditorEjemplo a nuestro proyecto, y en el cuadro de texto Location que el directorio base donde instalaremos el proyecto ser c:\C# Ntese que debajo Location aparece un mensaje que nos informa cual ser el directorio donde finalmente se almacenarn los archivos de nuestro proyecto, y como se ve, este directorio es el resultado de concatenar el nombre de nuestro proyecto con la ruta del directorio base que hayamos especificado. Una vez configuradas todas estas opciones, slo queda pulsar el botn OK para que se cree toda la infraestructura adecuada para que podamos empezar a trabajar en nuestro proyecto. La ventana que tras ello se obtiene tiene un aspecto similar al siguiente:

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 18

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

[Imagen 3: Ventana principal de diseo de Visual Studio.NET]

Si alguna de las ventanas indicadas no nos apareciese al iniciar el proyecto, siempre podemos obtenerlas nosotros mismo pulsando sobre los botones situados en la zona superior derecha de la ventana principal de Visual Studio, junto al botn >> Como se puede ver en el dibujo, se distingue tres partes muy importantes en nuestra rea de trabajo: A) La ventana de diseo (central), donde iremos colocando los elementos que formarn parte de la interfaz de nuestra aplicacin y desde la que podemos modificar el cdigo de estos con slo hacer doble click con el ratn sobre ellos. Hay que tener en cuenta que los puntos que aparecen dentro de esta ventana no aparecern en la versin final de la misma, sino que slo se incluyen durante el diseo para facilitar la colocacin de controles sobre ella. De todos modos, si nos molestan podemos desactivarlos mediante Options -> .NET Framework Designer -> ShowGrid La ventana de herramientas (toolbox) donde se recogen los objetos ms comunes que se utilizan a la hora de crear aplicaciones de ventanas. Estos objetos, a los que llamaremos controles, se pueden ir colocando sobre la ventana de diseo sin ms que ir seleccionndolo en la barra de herramientas y arrastrndolos sobre la posicin deseada de la ventana de diseo. La ventana de propiedades (properties), desde donde aparecern las propiedades del objeto que en cada momento haya seleccionado haciendo click sobre l con el ratn. A travs de esta ventana podemos obtener una ayuda rpida

B)

C)

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 19

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

sobre sus propiedades y modificarlas con simples pulsaciones de ratn. Por defecto las propiedades aparecen ordenadas en ella por categoras, apareciendo juntas las relacionadas entre s; sin embargo, podemos ordenarlas alfabticamente pulsando el segundo botn situado en la zona superior de esta ventana (empezado a contar por la izquierda) Haciendo doble click sobre el ttulo de cada una de las dos ltimas ventanas anteriores veremos que aparece un nuevo botn junto a la tpica cruz de cierre de ventana. Este botn nos permitir ocultar estas ventanas en la barra derecha que hay en la ventana principal de Visual Studio. De este modo, se consigue que mientras no nos hagan falta las tendremos ocultas y nuestro rea de trabajo ser mayor, mientras que en el momento que nos sean necesarias, las recuperaremos rpidamente sin ni siquiera tener que hacer un click (basta llevar el ratn sobre ellas) 3.2 Diseo de la interfaz Ahora que ya estamos familiarizados con el entorno con el que vamos a trabajar, podemos empezar a disear la interfaz de nuestra aplicacin. Para ello, de la barra de herramientas iremos seleccionando los controles que necesitemos y los iremos arrastrando sobre la ventana de diseo (ver Imagen 4). A medida que los vayamos usando se explicarn a fondo estos controles, y por el momento slo diremos que son: + Un RichTextBox, que ser el rea sobre el que mostrar el texto el editor. + Un MainMenu, que contendr el men principal de nuestra aplicacin + Un OpenFileDialog, un SaveFileDialog, un FontDialog y un PrintDialog, que se corresponden respectivamente con las ventanas estndar utilizadas en Windows para la apertura y cierre de ficheros, seleccin de fuente e impresin. + Un PrintDocument, que ser el objeto que utilicemos para imprimir el texto de nuestro editor y que tomar como informacin los datos que recoja el PrintDialog previamente introducido.

[Imagen 4: Ventana de diseo con los controles necesarios para el editor]

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 20

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Como podr notar, no todos los controles que arrastremos sobre la ventana de diseo se mostrarn sobre sta, sino que algunos lo harn en un rea en blanco situado debajo de ella. Esto se debe a que son controles que, o no tienen una componente visual, o no merece la pena mostrarla en la zona de diseo. Si tras arrastrar un control ste no tiene el tamao que a nos interesa, podemos modificar este tamao tirando de l mediante los cuadrados que aparecen en sus extremos (igual que en cualquier programa de tratamiento de imgenes) Ntese como a medida que vaya modificando el tamao o posicin de un control se irn actualizando automticamente los valores de las propiedades correspondientes a su alto (propiedad Height), ancho (Width), posicin en el eje OX de su esquina superior izquierda (Left) y posicin en OY de su esquina superior izquierda (Top) Todos los controles que hemos creado cuentan con una serie de valores por defecto para sus propiedades, como se puede observar echndoles un vistazo en la ventana de propiedades. Muchos de estos valores son los ms utilizados generalmente y nos vienen bien; sin embargo, hay otros que no nos interesan tal y como estn por lo que tendremos que cambiarlos (por ejemplo, el texto por defecto de nuestro editor de texto no debera ser richTextBox1) Para ello, iremos seleccionando cada uno de los objetos de nuestra aplicacin y modificando los valores de sus propiedades en la ventana de propiedades como se indica: 1.) Al RichTextBox le cambiaremos el texto por defecto dejndoselo en blanco, para lo que seleccionaremos su propiedad Text y borraremos su valor. A continuacin, le vamos a modificar el nombre con el que lo identificaremos desde nuestro cdigo por uno ms espaol, para lo que cambiaremos el contenido de su propiedad3 (Name) por rtbTexto. Tras esto, le cambiamos el valor de su propiedad Anchor de manera que todos los rectngulos que aparecen en la ventana asociada a la misma, que aparecer al pulsar sobre la fecha junto a ella incluida, queden marcados. Esta propiedad indica respecto a qu lados de su ventana contenedora se anclar el control, y seleccionar todos los rectngulos como se ha indicado indica que deseamos que sean todos, con lo que siempre que se redimensione la ventana nuestro control se ajustar automticamente al nuevo tamao que se le d. Finalmente, vamos a cambiar el valor de la propiedad Font, que indica el tipo de fuente que se usar el control para mostrar su texto, por otra fuente que puede ser ms bonita: la Arial de tamao 10. Para ello, podemos teclear manualmente Arial 10 pt como valor de esa propiedad o, lo que es ms cmodo, pulsar el botn con puntos suspensivos que aparece a su lado para seleccionar grficamente de la forma en que acostumbra a hacer en Windows. 2.) Al OpenFileDialog le cambiaremos el ttulo que se mostrar en la ventana de seleccin de archivo a abrir por un ms intuitivo Seleccione el archivo a abrir, para lo que cambiaremos el valor de su propiedad Title por dicho texto. Al igual que en el caso del RichTextBox, tambin es conveniente que le cambiemos su identificador por uno en castellano: dlAbrirArchivo
3

Ntese que (Name) aparece entre parntesis ya que en realidad no es una propiedad del objeto, sino el nombre del objeto. Sin embargo, por comodidad se ha optado por incluirlo en la ventana de propiedades. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 21

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Por ltimo, vamos modificar el valor de su propiedad Filter Esta propiedad indica cules son los archivos que la ventana nos dejar seleccionar. El valor de esta propiedad ha de ser una cadena de texto de la forma descripcinArchivo1| filtroArchivo1|descripcinArchivo2|filtro2... Nosotros le daremos el valor Archivos de texto|*.txt|Todos los archivos |*.* De este modo, nuestra ventana en primer lugar slo nos dejar seleccionar archivos de extensin .txt, pues el tipo de archivo indicado en primer lugar; y en caso de que el usuario quiera seleccionar otro siempre podr hacerlo modificando la lista desplegable incluida en la ventana de seleccin de archivo gracias a que como segundo tipo de archivo admitido permitimos cualquier archivo (*.*) 3.) Al SaveFileDialog le hacemos cambios muy similares caso anterior. Ahora cambiamos el Title por Seleccione el archivo donde guardar, el (Name) por dlGuardarArchivo y el Filter por Archivos de texto |*.txt|Todos los archivos|*.* 4.) Al FontDialog le cambiaremos el nombre por dlFuente, le daremos el valor true a su propiedad ShowColor para que nos permita seleccionar tambin nuevos colores para la fuente de nuestro texto y le cambiaremos el valor de la fuente mostrada por defecto por Arial 10 pt, para que se corresponda con el valor de nuestro texto por defecto. 5.) Al PrintDocument le cambiaremos su nombre por pdImpresor y al PrintDialog se lo cambiaremos por dlImprimir Adems, en ste ltimo modificaremos su propiedad Document por pdImpresor, para as indicarle que el objeto PrintDocument cuyas propiedades ha de modificar a partir de la informacin que recoja del usuario es pdImpresor 6.) Por ltimo, a la ventana principal del editor le cambiaremos el texto de su barra de ttulo modificando su propiedad Texto por EditorEjemplo 3.3 Diseo de los mens Para terminar con el diseo la interfaz de nuestra aplicacin nos queda por disear nicamente el men principal. De las propiedades del objeto MainMenu slo hemos de cambiar su nombre por menu, siendo lo verdaderamente interesante el diseo de los submens que en el se contendrn, lo cual se hace de forma muy sencilla y vistosa sin ms que ir rellenando los recuadros Type Here adecuados con los nombres de los submens que deseemos ir creando hasta obtener la siguiente estructura: Archivo Nuevo Abrir... Reabrir Guardar Guardar como... -------------------Imprimir -------------------Salir Fuente Crditos

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 22

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

La siguiente imagen muestra grficamente el proceso de relleno de recuadros Type Here antes comentado:

[Imagen 5: Diseo visual de mens en Visual Studio.NET]

A cada submen le daremos un nombre igual al texto que mostrar aunque precedido de la cadena menu (por ejemplo, menuArchivo, menuGuardarComo...) La nica excepcin a este caso sern las barras separadoras, que se incluyen escribiendo en el Type Here correspondiente al lugar donde se desee que aparezcan y que no usaremos para nada aparte de para organizar un poco mejor el contenido de nuestros mens, por lo que no tiene mucho sentido que le demos un nombre fcil de recordar. Cabe destacar algunos aspectos: + A cada men le podemos asociar una combinacin de teclas para acceder rpidamente al mismo. Para ello, hemos de seleccionar dicha combinacin como valor de la casilla correspondiente a la propiedad ShortCut en su ventana de propiedades. + En el texto que muestran los mens (y otros controles como los botones) le podemos incluir un carcter & antes de cualquier letra que ser interpretado como carcter a usar para acceder al mismo mediante la combinacin Alt+tecla Adems, el carcter que haya a la derecha de este & aparecer subrayado para indicar que es el usado para acceder rpidamente al control con dicha combinacin4.

Si se incluyen ms de un & los siguientes al primero son ignorados. Si se desea que & forme parte del texto del control habr que incluir dos & seguidos (&&) Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 23

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

+ Podemos indicar que un submen es el que se activar por defecto cuando hagamos doble click sobre el nombre del men padre que lo contiene. Para ello, hemos de dar el valor true a la propiedad DefaultItem del mismo. Este tipo de submens se caracterizan porque su texto aparece en negrita5. + Por defecto todos los submens aparecen activados; es decir, de modo que puedan ser seleccionados. Sin embargo, en el caso del submen Reabrir no nos interesa que esto sea posible hasta que se haya abierto algn fichero, por lo que hemos de modificar su propiedad Enabled y darle el valor false inicialmente. 3.4 Asociacin de cdigo a eventos Windows es un sistema guiado por eventos, y cualquier aplicacin grfica escrita para Windows consiste bsicamente en escribir cdigo de respuesta a eventos. Por ejemplo, cuando el usuario pulsa un botn se lanza un evento con el que se indica que dicho botn ha sido pulsado, y es el programador el que ha de determinar qu accin se ha de realizar en respuesta a dicha pulsacin. En C# para escribir este cdigo de respuesta, en la clase de cada control se define una serie de miembros denominados eventos a los que les podemos asociar una o ms funciones a ejecutar en caso de que se produzca el evento apropiado. Por ejemplo, la clase de los submens (MenuItem) tiene un evento Click que se declarara as en la definicin de la clase: class MenuItem: Menu { // ... (Otras definiciones) public event EventHandler Click; // ... (Otras definiciones) } Ntese que tras el nombre de la clase MenuItem se ha colocado el nombre de otra clase (Menu) separado por dos puntos. Esto significa que la clase MenuItem que estamos declarando deriva de la clase Menu. Es decir, bsicamente esto significa que incluye todas las definiciones de mtodos, propiedades y dems miembros de la clase Menu ms los que definamos en ella; y que si definimos miembros de igual signatura que miembros definidos en Menu las nuevas definiciones de estos sustituirn a las heredadas de Menu. Ntese que tambin la clase principal de nuestra aplicacin deriva de clase Form, que incluye definiciones para el comportamiento bsico de una ventana. La definicin de evento del ejemplo anterior significa que Click es un evento al que le podemos asociar como cdigo respuesta funciones cuya signatura (definicin de valor de retorno, nombre y parmetros de la funcin) sea compatible con la indicada por el delegado EventHandler Un delegado podemos verlos como una declaracin de valor de retorno y parmetros de funcin a la que se le asocia un nombre. Por ejemplo, en el caso concreto de EventHandler, ste delegado est definido de la siguiente forma:
5

Si se pone a true dos o ms submens de un mismo men padre slo se activar con el doble click el primero. Sin embargo, ambos aparecern en negrita. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 24

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

public delegate void EventHandler(object emisor, EventArgs e) Por consiguiente, al evento Click le podremos asociar cualquier nmero de funciones que tomen un primer parmetro de entrada de tipo object, un segundo de tipo EventArgs y que no devuelva ningn valor de retorno (void) En concreto, el primer parmetro representa al objeto que a provocado el evento (en nuestro caso el submen pulsado); mientras que el segundo est destinado a contener informacin variada sobre el evento que se ha producido que a nosotros no nos va a hacer falta. Nosotros podemos escribir el cdigo de estas funciones de respuesta sin preocuparnos de cmo se generan estos objetos que son pasados a nuestra funcin, ya que de ello se encarga el sistema en tiempo de ejecucin de .NET6 y podemos estar totalmente seguros de que siempre estarn construidos correctamente. El siguiente ejemplo muestra cmo podramos asociar cdigo de respuesta a la pulsacin de un botn de nombre miMenu: // ... miMenu.Click += new EventHandler(miCdigoRespuesta); // ... Este cdigo de respuesta estara escrito en una funcin como la siguiente: public void miCdigoRespuesta(object o, EventArgs e) { MessageBox.Show(Pulsado miMenu); } La funcin Show() de la clase MessageBox es muy utilizada en aplicaciones de ventanas, y lo que hace es mostrar por pantalla una pequea ventana informativa con el texto indicado y un botn con el texto Aceptar que permite cerrarla. Por consiguiente, lo que hemos hecho con nuestro cdigo es que cada vez que se pulse el men identificado por miMenu se mostrar una ventana informando que se ha pulsado dicho botn. Ntese que para asociar un cdigo de respuesta a un evento se utiliza el operador +=. Este operador puede usarse tantas veces como se desee sobre un mismo evento, con lo se asociaran diversos cdigos de respuesta al mismo, que se ejecutaran uno detrs tras otro en caso de producirse el evento. Tambin podemos eliminar de un evento cdigos de respuesta ya asociados. Para ello se usa el operador -=, y un ejemplo de cmo quitar el cdigo asociado al evento en el ejemplo anterior es: miMenu.Click -= new EventHandler(miCdigoRespuesta); A partir de esta instruccin, cada vez que se pulsase miMenu no se realizar ninguna accin (a no ser que hayan asociado otros cdigos de respuesta al evento Click)

Tambin conocido como Common Language Runtime CLR Pgina 25

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

3.5 Asociacin de cdigo a eventos en Visual Studio.NET Aunque la forma anteriormente comentada para asociar cdigos de respuesta a los eventos es la que realmente se usa, Visual Studio nos permite asociar los cdigos de respuesta ms comunes a los eventos de una forma mucho ms sencilla. Con tan slo hacer doble click sobre el control ya estaremos en condiciones de empezar a escribir el cdigo de respuesta a su evento ms comn (por ejemplo, en el caso de un men o botn sera el cdigo de respuesta a su evento Click), pues ya se encarga Visual Studio de declarar automticamente la funcin de respuesta al evento y asociarla (con +=) al evento apropiado. Este ser el mtodo que usaremos en nuestro editor de texto para asociar cdigo de respuesta, y a continuacin se describe cmo escribir este cdigo para cada uno de los controles de nuestra aplicacin para conseguir la funcionalidad deseada en la misma: 1. menuNuevo: Cuando se pulse el botn nuevo se ha de eliminar cualquier texto que hubiese en la caja de texto (rtbTexto) del editor. Esto es tan sencillo como hacer que el valor de su propiedad Text pase a ser una cadena vaca (), y para conseguirlo simplemente hacemos doble click sobre la opcin del men apropiada y rellenamos el cdigo de respuesta al evento con el siguiente contenido: protected void menuNuevo_Click System.EventArgs e) { rtbTexto.Text=""; this.Text ="EditorEjemplo"; menuReabrir.Enabled = false; } (object sender,

Ntese que tambin realizamos otras acciones en el cdigo del mtodo. stas consisten en cambiar el ttulo de la ventana principal por EditorEjemplo, ya que en este ttulo almacenaremos informacin sobre el nombre del fichero abierto en cada momento pero al crear uno nuevo no tiene nombre, y desactivar el submen Reabrir, ya que no tiene sentido reabrir ningn archivo porque estamos creando uno nuevo. Es sealable el uso de la palabra reservada this para hacer referencia al objeto al que pertenece el mtodo que estamos escribiendo. Recordemos que los cdigos de respuesta los estamos escribiendo dentro de la de la clase que representa la ventana de la aplicacin (que deriva de Form), por lo que this hace referencia a la ventana nuestro editor y Text es la propiedad de la ventana que almacena su ttulo. Tambin puede destacarse el hecho de que Visual Studio aade el modificador de visibilidad protected a la declaracin de cualquier cdigo de respuesta. Este modificador indica que dicho cdigo slo puede ser llamado desde la clase dentro de la que el mtodo se ha definido o desde subclases de la misma.

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 26

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

2. menuAbrir En este caso hay que mostrar al usuario el fdAbrirArchivo para recoger informacin sobre el nombre del archivo a abrir para, tras ello, abrirlo y guardar como contenido de la caja de texto del editor la informacin en este almacenada. Esto lo hacemos con un el siguiente cdigo de respuesta (recordemos que para escribirlo basta hacer doble click con el ratn sobre el submen de ttulo Abrir... y Visual Studio se encargar de generar automticamente el esqueleto del mismo): protected void menuAbrir_Click (object sender, System.EventArgs e) { if (dlAbrirArchivo.ShowDialog() == DialogResult.OK) { rtbTexto.LoadFile(dlAbrirArchivo.FileName, RichTextBoxStreamType.PlainText); this.Text = "["+dlAbrirArchivo.FileName + "] EditorEjemplo"; menuReabrir.Enabled = true; } } En este cdigo lo que se hace es llamar al mtodo ShowDialog() de nuestro dlAbrirArchivo para que se muestre la tpica ventana con la que en Windows pide al usuario de las aplicaciones que seleccione un fichero a abrir. Este mtodo puede devolvernos los valores OK Cancel del tipo enumerado DialogResult segn si el usuario ha pulsado el botn Ok el botn Cancelar de dicha ventana. Un tipo enumerado o enumeracin es un tipo para el que indicamos explcitamente cules son los valores que puede tomar. Por ejemplo, un tipo enumerado de nombre Colores que slo pueda tomar los valores Rojo, Verde o Azul se definira as: enum Colores {Rojo, Verde, Azul}; Slo en caso de que se pulse Ok ser cuando cargaremos el fichero de texto seleccionado, por lo que hemos de comprobar en la condicin del if que estemos en ese caso. Una vez que el usuario ha seleccionado un archivo almacenamos su contenido en la caja de texto llamando al mtodo LoadFile() de sta. Este mtodo toma dos parmetros: el primero contiene el nombre del fichero a abrir, que recuperamos a travs de la propiedad FileName del dlAbrirArchivo; mientras que el segundo indica cul es el formato en que se encuentra almacenada la informacin de dicho tipo, donde nosotros indicamos que vamos a cargar un fichero en formato de texto plano7 usando el valor PlainText de la enumeracin RichTextBoxStreamType. Tngase en cuenta que un objeto de clase RichTextBox tambin es capaz de almacenar texto en formato RTF8 (valor RichText de la enumeracin RichTextBoxStreamType)

7 8

Este formato consiste en almacenar en el fichero slo los caracteres que componen el texto a mostrar. Este formato consiste en almacenar en el fichero tambin informacin que indiquen caractersticas de formato del texto, mrgenes, etc. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 27

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Tras cargar el contenido del fichero de texto en nuestra caja de texto, slo queda modificar el ttulo de la ventana de propiedades para que contenga el nombre del fichero abierto entre corchetes (ntese el uso de + como operador de concatenacin de cadenas) y, dado que ahora s tenemos un fichero abierto, activar la posibilidad de reabrirlo. 3. MenuReabrir El funcionamiento de este men es muy similar al anterior, slo que ahora no hemos de preguntar al usuario cul es el fichero a abrir sino que podemos obtenerlo a partir del nombre del ltimo fichero abierto. Por ello, su cdigo de respuesta es: protected void menuReabrir_Click (object sender, System.EventArgs e) { String nombreFichero = this.Text.Substring(1, this.Text.LastIndexOf("]") - 1); rtbTexto.LoadFile(nombreFichero, RichTextBoxStreamType.PlainText); } El cdigo de este mtodo es mucho ms sencillo que en el caso anterior, ya que ahora no hemos de actualizar la barra de ttulo con el nombre del fichero abierto porque era el que ya haba; y no hemos de activar el men Reabrir porque ya estaba activado (de hecho, es el botn pulsado) Para obtener el nombre del fichero hemos usado el mtodo Substring() definido para cualquier cadena (clase String) que devuelve la subcadena comprendida entre el elemento cuyo ndice coincide con el valor de su primer parmetro y cuya longitud es la indicada en el segundo. Como el primer elemento de la barra de ttulo siempre ser un corchete ya que lo que se indica en ella es el nombre del fichero abierto, nos saltaremos el primer elemento del texto del ttulo y obtendremos la subcadena que comienza en el ndice 1 (las cadenas se indexan desde 0 en C#) Para obtener la longitud de la subcadena a obtener usamos el mtodo LastIndexOf() de la clase String que devuelve el valor del ndice de la ltima aparicin de la subcadena que se le pasa como parmetro. 4. menuGuardar Al pulsar este submen hemos de guardar el contenido del texto que se est editando dentro del fichero que se est editando, de modo que todos los cambios hechos en la caja de texto se hagan permanentes en el fichero. Para ello, hemos de comprobar si el fichero que estamos escribiendo es un fichero nuevo o no, ya que en el primer caso habra que solicitar al usuario un nombre de fichero donde guardar esta informacin y en el segundo caso no. Esto lo hacemos as: protected void menuGuardar_Click (object sender, System.EventArgs e) { String nombreFichero; if (this.Text == "EditorEjemplo")

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 28

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

menuGuardarComo.PerformClick(); else { nombreFichero this.Text.LastIndexOf("]") - 1); = this.Text.Substring(1, rtbTexto.SaveFile(nombreFichero, RichTextBoxStreamType.PlainText); } } Vase pues, que lo que se hace para detectar si el fichero es nuevo consiste en comprobar si el texto de la barra de ttulo de la ventana del editor coincide con el valor de sta por defecto, caso en que ello querra decir que s es nuevo y, por consiguiente, habra que solicitar el nombre del fichero donde guardar; es decir, estaramos en un caso equivalente al de haber pulsado el submen Guardar como, por lo que lo que haremos ser simular que este se ha pulsado llamando al mtodo PerformClick() del mismo. En caso de que el fichero no sea nuevo, obtendremos su nombre de forma similar a como se hizo en el cdigo de respuesta a la pulsacin de menuReabrir y guardaremos el contenido de la caja de texto en dicho fichero llamando al mtodo SaveFile() de la caja de texto. Este mtodo funciona de forma recproca al LoadFile() ya visto, slo que en este caso en vez de cargar el texto del fichero en la caja de texto lo que se hace es cargar el contenido de la caja de texto en el fichero. 5. menuGuardarComo Cuando se selecciona este botn hay que mostrar al usuario una de las tpicas ventanas de Windows en las que se solicita un nombre de fichero donde guardar informacin. Slo en caso de que se haya seleccionado un nombre de fichero en esta ventana y se haya pulsado su botn OK se guardar el contenido de la caja de texto de nuestro editor en el archivo indicado. Para hacer esto se ejecuta el siguiente cdigo: protected void menuGuardarComo_Click (object sender, System.EventArgs e) { if (dlGuardarArchivo.ShowDialog() == DialogResult.OK) { rtbTexto.SaveFile(dlGuardarArchivo.FileName,RichTextBoxStre amType.PlainText); this.Text = "["+dlGuardarArchivo.FileName + "] EditorEjemplo"; menuReabrir.Enabled = true; } } Del cdigo puede deducirse fcilmente que lo nico que se hace es llamar al mtodo ShowDialog() del dlGuardarArchivo para que muestre la ventana antes comentada, comprobar que se pulse el botn OK de la misma viendo si el valor de retorno de este mtodo es el valor OK de la enumeracin DialogResult y, en ese caso, guardar el texto contenido en rtbTexto en el fichero indicado llamando al mtodo SaveFile() de
Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 29

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

dicho objeto RichTextBox. Finalmente, se cambia el ttulo de la barra de la ventana del editor para actualizar la informacin de la misma sobre el nombre del fichero que se est editando y se habilita el submen Reabrir dando el valor true a su propiedad Enabled, ya que ahora s se tiene un nombre de fichero para reabrir. 6. menuImprimir El cdigo de respuesta a la pulsacin de este submen es muy sencillo. Slo hemos de mostrar la ventana tpica que en Windows se utiliza para recoger informacin sobre los detalles de la impresin y, en caso de que el usuario pulse el botn OK de la misma, llamar al mtodo Print() del objeto pdImpresor para imprimir la pgina segn la configuracin recogida. Recurdese que el objeto dlImprimir est conectado al objeto pdImpridor a travs de su propiedad Document, y sta ser la conexin que se usar para comunicar al pdImpresor cul es la configuracin de impresin recogida. El cdigo de respuesta a este evento es, por tanto, tan simple como: protected void menuImprimir_Click (object System.EventArgs e) { if (dlImprimir.ShowDialog() == DialogResult.OK) pdImpresor.Print(); } sender,

La llamada a Print() inicia la ejecucin del proceso de impresin, aunque nosotros hemos de indicar cmo se realizar la impresin definiendo el cuerpo del cdigo de respuesta al evento PrintPage del pdImpridor que es lanzado al llamar a Print() Como definicin de este cdigo se usar: protected void pdImpresor_PrintPage (object sender, System.Drawing.Printing.PrintPageEventA rgs e) { String texto = rtbTexto.Text; Font fuente = rtbTexto.Font; SolidBrush color = new SolidBrush(rtbTexto.ForeColor); RectangleF rea = new RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height); e.Graphics.DrawString(texto, fuente, color, rea); } Para ir dibujando el contenido a imprimir sobre el papel se utiliza el mtodo DrawString() del objeto obtenido a travs de la propiedad Graphics del argumento de tipo PrintPageEventArgs con el que se llam a ste mtodo. DrawString() imprime la cadena que se le pasa como parmetro usando la fuente y el color indicados dentro del rea del papel que se le especifica en su ltimo parmetro. Para especificar el texto y el

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 30

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

color se usan directamente los valores almacenados en las propiedades Text y Font de nuestro rtbTexto, mientras que para especificar el color a usar es necesario generar un SolidBrush a partir del color almacenado en la propiedad ForeColor de dicha caja de texto, ya que esto es lo que DrawString() espera. Finalmente, para especificar el rea de impresin se ha optado por utilizar un objeto RectangleF que almacena informacin sobre el rectngulo correspondiente a los mrgenes a usar (posicin en OX de su esquina superior izquierda, posicin en OY, ancho y alto) Los valores pasados a ste objeto en su constructor son los que se obtienen por defecto a travs de la propiedad MarginBounds del objeto PrintPageEventArgs pasado como argumento al mtodo. 7. menuSalir Cuando se pulse el botn Salir lo que hay que hacer es, como su propio nombre indica, abortar la ejecucin del editor. Esto se hace con una nica instruccin: llamando al mtodo Close() de la ventana principal del editor para cerrarla. Es decir, as: protected void menuSalir_Click (object sender, System.EventArgs e) { this.Close(); } 8. menuFuente Al activarse este submen se mostrar al usuario una ventana estndar de Windows donde podr seleccionar las caractersticas de la fuente que desea utilizar para mostrar el texto en el editor. Por tanto, lo nico que se ha de hacer es mostrar al usuario esta ventana cuando pulse el submen y, en caso de que seleccione OK en la misma, modificar las caractersticas de la fuente utilizada por las nuevas que haya seleccionado. Esto se hace con el siguiente cdigo protected void menuFuente_Click (object sender, System.EventArgs e) { if (dlFuente.ShowDialog() == DialogResult.OK) { rtbTexto.Font = dlFuente.Font; // Cambiamos fuente rtbTexto.ForeColor = dlFuente.Color; // Cambiamos color } } Como es deduce, la ventana de seleccin de fuente almacena en su propiedad Font la fuente elegida y en Color el color seleccionado para la misma. 9. menuCrditos Al seleccionarse este submen simplemente mostraremos un mensaje con informacin sobre la aplicacin. Para ello vamos a usar el mtodo Show() de la clase

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 31

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

MessageBox que, como ya vimos anteriormente, lo que hace es mostrar una pequea ventana con el texto que se le indique como parmetro. De este modo nos queda: protected void menuCrditos_Click (object System.EventArgs e) { MessageBox.Show("Autor: Jos Antonio Gonzlez Seco", "Crditos de EditorEjemplo v1.0"); } sender,

En este caso hemos usado una variante del mtodo Show() diferente a la vista anteriormente en la que como segundo parmetro pasamos la cadena de texto que ser utilizada como ttulo de la ventana a mostrar. Una vez escrito todo los cdigos de respuesta indicados, nuestra aplicacin ya estar lista para funcionar. Podemos probarla seleccionando en el men principal de Visual Studio Debug -> Start, siendo el aspecto de la misma durante su ejecucin:

[Imagen 6: La aplicacin EditorEjemplo en funcionamiento]

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 32

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

4.- Desarrollo de servicios Web


4.1 Introduccin a los servicios Web Bsicamente un servicio Web es un clase que se publica en un servidor Web con soporte para ASP.NET (actualmente el nico disponible es el Internet Information Server 5.0 de Microsoft tras ser actualizado con el .NET SDK) y a cuyos mtodos es posible llamar remotamente. Estas clases pueden escribirse en la mayora de los lenguajes de los lenguajes adaptados a .NET, como Visual Basic.NET, Jscript.NET y C#, pero nosotros nos centraremos en el desarrollo de servicios Web usando el ltimo. Para acceder a un servicio Web se pueden utilizar varios protocolos Web estndar, como HTTP GET HTTP POST, aunque el especficamente diseado para ello por Microsoft es el Protocolo de Acceso a Objetos Simple (Simple Access Protocol o SOAP), que se basa en la utilizacin del protocolo HTTP para el transporte de mensajes y el lenguaje XML para la escritura del cuerpo de estos mensajes, y que ha sido enviado al W3C por Microsoft en mayo de 2000 para su estandarizacin. Una de las grandes ventajas de los servicios Web es que pueden ser accedidos desde cualquier aplicacin que sea capaz de generar mensajes e interpretar mensajes escritos en SOAP, an cuando sta no est diseada para la plataforma .NET Es ms, los aplicaciones que consuman estos servicios no necesitan conocer ni cul es la plataforma ni cul es el modelo de objetos ni cul es el lenguaje utilizado para implementar estos servicios. Otra gran ventaja es que son tremendamente sencillos de escribir, pues como veremos a continuacin basta hacer unos retoques mnimos al cdigo de una clase cualquiera para convertirla en un servicio Web que podr ser accedido remotamente; por no mencionar la enorme facilidad y transparencia con la que aquellos clientes del servicio escritos bajo .NET pueden acceder al mismo, gracias a las utilidades generadoras de proxys que Microsoft proporciona. 4.2 Escritura de un servicio Web Para ver lo fcil que es escribir un servicio Web, en primer lugar vamos a escribir una sencilla clase en C# que simplemente consta de un nico mtodo que nos devuelve la fecha actual. Ms adelante veremos cmo es trivial la conversin de la misma en servicio Web. El cdigo de nuestra clase es: using System; class ServicioFecha { public String Fecha (bool detalles) { if (detalles) return DateTime.Now.ToLongDateString(); else return DateTime.Now.ToShortDateString(); } }
Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 33

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Como se ve, los objetos de esta clase constan de slo un mtodo propio: el mtodo Fecha(), que devuelve la fecha actual incluyendo informacin detallada (da de la semana, nmero de mes, da del mes y ao con cuatro dgitos) o no (sin da de la semana y slo dos dgitos para el ao) segn indique su parmetro Para conocer cul es la fecha actual se utiliza la propiedad Now de la clase DateTime9, que devuelve un objeto DateTime que contiene informacin sobre la misma; y para acceder obtener las cadenas de texto que contienen la informacin detallada y no detallada sobre la fecha se usan, respectivamente, los mtodos ToLongDateString() y ToShortDateString() de la misma. Para convertir esta clase en un servicio Web slo hemos de hacerla heredar de la clase System.Web.Services, colocar el atributo [WebMethod] antes de la declaracin de cada uno de los mtodos de la clase que deseemos que sean accesibles remotamente e incluir una directiva WebService que indique al motor de ASP.NET (que es quien se encargar de gestionar el acceso al servicio Web) de cul es el lenguaje en que est escrito el servicio Web y cul es la clase que se expondr como servicio Web Adems de estos cambios en el cdigo del fichero fuente, tambin hemos de cambiar su extensin por .asmx y colocarlo en algn directorio virtual del Internet Information Server para que as las aplicaciones cliente puedan acceder a l. Con todo ello, el cdigo anterior quedar as: // Fichero: ServicioFecha.asmx <% @ WebService Language=C# Class=ServicioFecha %> using System; using System.Web.Services; class ServicioFecha: WebService // Derivamos de WebService { [WebMethod] public String Fecha (bool detalles) { if (detalles) return DateTime.Now.ToLongDateString(); else return DateTime.Now.ToShortDateString(); } } De este cdigo hay que comentar varias cosas: + La directiva WebService ha de incluirse antes que cualquier otro cdigo en el fichero .asmx + Es posible almacenar el cdigo ya compilado en un fichero .dll10 separado del .asmx. Este cdigo se almacenara en el subdirectorio /bin del directorio virtual de
9

En realidad DateTime es una estructura y no una clase. Sin embargo, a efectos prcticos en esta introduccin a los servicios Web en C# ello es indiferente. 10 Para compilar en formato .dll se ha de especificar la opcin /t:library al llamar al compilador. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 34

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

nuestra aplicacin y para referenciarlo desde la etiqueta WebService del .asmx se usara el atributo Codebehind de sta del siguiente modo: <% @ WebService Language=C# Codebehind=ServicioFecha Class=ServicioFecha %> + No hay que confundir el concepto de atributo en C# con los atributos de las etiqueta ASP.NET Un ejemplo de lo primero es el atributo [WebMethod] ya visto, y en general estos atributos sirven para indicar informacin sobre la clase o miembro al que preceden ([WebMethod] indica que el mtodo al que precede es accesible remotamente); mientras que ejemplos de atributos de etiquetas ASP.NET son los atributos Language y Codebehind tambin ya comentados, siendo la utilidad de este tipo de atributos indicar informacin sobre la etiqueta a la que acompaan. 4.3 Pgina de prueba de un servicio Web Al abrir con Internet Explorer una pgina .asmx alojada en un servidor Web con soporte ASP.NET se obtiene una pgina con informacin sobre el los servicios en esta almacenados. Por ejemplo, si situamos nuestro anterior ejemplo en el directorio raz de la jerarqua virtual de IIS, al teclear en la barra de direcciones de Internet Explorer http://localhost/ServicioFecha.asmx se obtiene:

[Imagen 7: Pgina de pruebas del servicio Web ServicioFecha]

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 35

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Vase que esta pgina contiene informacin incluye datos sobre cul es el servicio Web ofrecido, cules son los mtodos que se ofrecen y cul es la signatura de estos. Adems, la pgina tambin incluye formularios desde los que podemos hacer llamadas de prueba a los mtodos del servicio Web. Es importante sealar que para que la pgina de prueba se obtenga hay que acceder al fichero .asmx a travs de IIS; es decir, de modo que se haga que este se active y procese la peticin. Por eso, para acceder a ella no basta hacer doble click sobre su icono en la ventana de exploracin de discos de Windows, sino que hay utilizar un direccin como la arriba indicada (URL) 4.4 Acceso a un servicio Web mediante SOAP Ya se ha comentado que SOAP es el protocolo basado en HTTP y XML que Microsoft ha desarrollado para el acceso a los servicios Web. Aunque podramos comunicarnos directamente con un servicio Web enviando mensajes escritos en el formato de este protocolo e interpretando sus repuestas, lo cierto es que ello sera bastante incmodo, por lo que Microsoft proporciona un mecanismo mucho ms sencillo y transparente basado en el uso de proxies. Un proxy es una clase que ofrece la misma interfaz que el servicio Web al que se pretende acceder pero que esta almacenada en la mquina local y no contiene la verdadera implementacin de los mtodos ofrecidos por el servicio, sino que en su lugar contiene cdigo encargado de redirigir las llamadas que hagamos a sus mtodos al verdadero servicio Web. Gracias a los proxies, conseguimos comunicarnos con el servicio remoto como si de una clase normal escrita en C# se tratase, y es el proxy el encargado de intercambiar los menajes SOAP necesarios para la comunicacin remota. Para generar automticamente el proxy es necesario contar con una especificacin del servicio (mtodos ofrecidos, signatura de estos, protocolos soportados, etc.) que sea fcil de interpretar por una mquina. Para ello se utiliza un fichero XML escrito en el llamado Lenguaje Descriptor del Servicio Web (Web Service Descriptor Language o WSDL) Para obtener este fichero slo hay que acceder al servicio Web concatenado la cadena ?WSDL al final del mismo. As, siguiendo con nuestro ejemplo la cadena sera http://localhost/ServicioFecha.asmx?WSDL Gracias a este tipo de ficheros, podemos generar el proxy de manera automtica utilizando la utilidad wsdl.exe incluida en el .NET SDK. Esta utilidad se usara as para generar un proxy para nuestro ejemplo anterior:
wsdl http://localhost/ServicioFecha.asmx

El proxy generado tendr el mismo nombre que el fichero .asmx a partir del que se genera pero extensin .cs Es posible cambiar este nombre si as se desea indicando uno nuevo mediante la opcin /out: de webserviceutil A partir del proxy la escritura de una aplicacin que haga uso del servicio es trivial. Slo hay que utilizar el proxy como si de la clase remota se tratase. Por ejemplo:

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 36

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

using System; class ClienteFecha { public static void Main() { ServicioFecha s = new ServicioFecha(); Console.WriteLine(Fecha s.Fecha(false)); Console.WriteLine(Fecha s.Fecha(true)); } } De este cdigo es fcil deducir que lo que se hace es crear un objeto de la clase remota ServicioFecha y mostrar dos mensajes de texto, uno para probar el funcionamiento de cada una de las formas de llamar al mtodo Fecha(). Ntese la absoluta transparencia de ste cdigo respecto a la ubicacin real de la clase remota. Para compilar este cliente hay que tener en cuenta que en la clase proxy se utilizan elementos definidos en otras libreras, por lo que hay que referenciarlas con:
csc ClienteFecha.cs ServicioFecha.cs

actual: actual detallada:

{0}, {0},

As obtendremos un ClienteFecha.exe El resultado de ejecutarlo es:


Fecha actual: 07/11/2000 Fecha actual detallada: Tuesday, July 11, 2000

4.5 Mantenimiento del estado Por defecto un servicio Web carece de estado, ya que por cada llamada a un mtodo de un servicio se crea una nuevo objeto de la clase a la que se hace la peticin; objeto que la atiende y es destruido tras ello. Por consiguiente, no se guarda informacin sobre llamadas previas y por tanto los objetos de un servicio Web escrito as no son verdaderos objetos, ya que lo que el realmente el cliente hace son llamadas sueltas que no tienen relacin entre s. Para conseguir almacenar informacin sobre llamadas previas, la clase WebService de la que todo servicio Web hereda proporciona unos objetos llamados Application y Session, de clase HttpApplicationState y HttpSessionState respectivamente, que actan como depsitos de informacin sobre llamadas previas. El primero de estos objetos permite almacenar informacin que ser compartida por todas las aplicaciones clientes del servicio, mientras que la informacin almacenada en el segundo slo es compartida entre sucesivas llamadas de un mismo cliente A continuacin se muestra una modificacin del ejemplo anterior en la que se utilizan los dos objetos antes comentados para guardar informacin sobre cuntos clientes han accedido al mtodo Fecha() del servicio. Adems, se proporcionan un mtodo
Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 37

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Accesos() mediante el cual los clientes pueden consultar el nmero total de accesos que ha tenido la aplicacin y un mtodo AccesosMos() mediante el cual los clientes pueden consultar cuntos accesos ellos mismos han realizado: <% @ WebService Language="C#" Class="ServicioFechaEstado" %> using System; using System.Web.Services; class ServicioFechaEstado:WebService { [WebMethod(EnableSession=true)] public String Fecha(bool detallada) { if (Application["Accesos"] == null) Application["Accesos"] = 1; else Application["Accesos"] = ((int) Application["Accesos"]) + 1; if (Session["Accesos"] == null) Session["Accesos"] = 1; else Session["Accesos"] = ((int) Session["Accesos"]) + 1; if (detallada) return DateTime.Now.ToLongDateString(); else return DateTime.Now.ToShortDateString(); } [WebMethod] public int Accesos() { if (Application["Accesos"] == null) return 0; else return ((int) Application["Accesos"]); } [WebMethod(EnableSession=true)] public int AccesosMos() { if (Session["Accesos"] == null) return 0; else return ((int) Session["Accesos"]); } }
Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 38

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

De este cdigo cabe destacar los siguientes aspectos: + Para acceder a la informacin almacenada en los objetos Application y Session basta indicar entre corchetes el nombre con el que identificaremos la informacin que pretendemos usar (se usa pues una sintaxis similar a la de las tablas. A sta se le llama indizador en C#) Estos objetos devuelven elementos de tipo object, y para convertirlos a int usamos el operador de conversin implcita (int) Adems en el caso de que la informacin que se pretende obtener no haya sido an introducida devuelven null, lo que controlamos mediante las condiciones de los if. + Es necesario modificar la forma en la que usamos el atributo [WebMethod] dndole el valor true a la propiedad EnableSession en todos aquellos mtodos que utilicen el objeto Session para as habilitar el uso de ste. Una vez modificado el .asmx slo queda modificar el cliente que hemos estado usando para probar el servicio para que haga uso de sus nuevas caractersticas: using System; using System.Net; class ClienteFechaEstado { public static void Main() { ServicioFechaEstado s = new ServicioFechaEstado(); s.CookieContainer = new CookieContainer(); Console.WriteLine("Accesos Totales : {0} ({1} mos)", s.Accesos(), s.AccesosMos()); Console.WriteLine("Fecha actual: {0}", s.Fecha(false)); Console.WriteLine("Fecha actual detallada: {0}", s.Fecha(true)); Console.WriteLine("Accesos Totales : {0} ({1} mos)", s.Accesos(), s.AccesosMos()); } } Ntese que para conseguir el mantenimiento de sesin ha sido necesario inicializar la propiedad CookieContainer del servicio web con un objeto System.Net.CookieContainer que servir de almacn donde guardar la informacin necesaria para el mantenimiento de estado. Sin embargo, de cmo se gestiona este objeto internamente y cmo se guarda en l dicha informacin es algo de lo que el programador no ha de preocuparse, pues es un proceso completamente transparente a l y puede usar el servicio web como si de cualquier objeto se tratase. As, si ejecutamos este cliente por primera vez obtendremos:
Accesos totales: 0 (0 mos) Fecha actual: 07/11/2000 Fecha actual detallada: Tuesday, July 11, 2000 Accesos totales: 2 (2 mos)

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 39

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Y si lo volvemos a ejecutar de nuevo obtendremos:


Accesos totales: 2 (0 mos) Fecha actual: 07/11/2000 Fecha actual detallada: Tuesday, July 11, 2000 Accesos totales: 4 (2 mos)

Vase en los resultados de la ejecucin del cliente cmo la informacin almacenada en el objeto Session no es compartida entre sucesivas llamadas al cliente mientras que la almacenada en el objeto Application s11 4.6 Servicios Web con Visual Studio.NET Visual Studio permite escribir y utilizar los servicios Web de una forma mucho ms cmoda que utilizando directamente el compilador en lnea de comandos csc.exe como se ha hecho en los ejemplo previos. A continuacin veremos como escribir y utilizar el servicio Web de ejemplo anterior usando esta herramienta. Para escribir un servicio Web hemos de arrancar Visual Studio.NET y crear un proyecto de aplicacin de consola con:
-

Project Types = Visual C# Projects Templates = Web Service Name = ServicioFechaVS Location = http://josan/

El valor dado a Location es el nombre del servidor donde se instalar el servicio Web. Dejaremos este campo con su valor por defecto, que coincide con el nombre la mquina donde se est ejecutando Visual Studio (http://josan). Si nos interesa instalarlo en otra mquina slo tendramos que cambiar este valor por el nombre de sta Con los datos anteriores se crear en el servidor Web de la mquina indicada un directorio virtual con el nombre hayamos dado al proyecto en el que se depositaran los archivos del proyecto. Entre estos archivos, hay que resaltar que Visual Studio sigue la aproximacin, ya comentada, de separar el cdigo del servicio de su fichero .asmx Una vez que se cree el proyecto, Visual Studio nos ofrecer un pantalla en blanco donde podramos ir colocando todos los controles que necesitemos12 Nosotros haremos doble click sobre la misma y pasaremos directamente a editar el cdigo fuente del servicio Web. Como se ver entonces, Visual Studio ya ha generado un esqueleto para el mismo que incluye la directiva WebService con los valores de sus atributos perfectamente configurados para funcionar con nuestra aplicacin e incluso, dentro de un comentario, habr colocado cdigo de ejemplo de cmo escribir un servicio Web. Gracias a toda esta infraestructura generada automticamente, nosotros slo tenemos que copiar los mtodos antes escritos para ServicioFecha en esta ventana de cdigo y todo estar listo para funcionar.
11 12

Se supone que no hay ms clientes accediendo simultneamente al servicio Web Aunque no tiene mucho sentido colocar controles con parte visual, ya que un servicio Web no tiene componente visible, sino que es slo lgica. Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es) Pgina 40

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Una vez escrito el servicio Web, podemos pulsar CTRL+F5 para probar nuestro servicio Web. Con ello conseguiremos que Visual Studio abra una ventana de Internet Explorer que nos mostrar la pgina de prueba del servicio. Tras esto slo queda escribir el cliente que acceder al mismo. Para ello de nuevo optaremos por realizar la aplicacin cliente de consola ya creada pero con las pequeas modificaciones derivadas de que ahora la clase remota se llama WebService1 y de que Visual Studio evita tener que generar a mano el proxy para acceder a la misma. Para crear una aplicacin de consola seleccionamos File -> New -> Project en el men principal de Visual Studio y configuramos la ventana que aparece con:
-

Project Types = Visual C# Projects Templates = Console Application Name = ClienteFechaVS Location = c:\C#

Una vez hecho esto, pulsando el botn OK se crear nuestro proyecto y podremos empezar a escribir su cdigo en un fichero Class1.cs Para cambiar el nombre de ste podemos abrir el Explorador de Solucin (View -> Solution Explorer) y hacer click con el botn derecho del ratn sobre el mismo para renombrarlo; y para cambiar el de la clase creada por defecto (Class1) hacemos lo mismo en la Vista de Clase (View -> Class View). Nosotros optaremos por cambiar ambos nombres por ClienteFechaVS El cdigo ClienteFechaVS ser el mismo que el del ClienteFecha ya escrito, por lo que podemos cortarlo de ste y pegarlo sobre el Main() de ClienteFechaVS. Hecho esto slo nos queda aadir la referencia al servicio Web necesaria para que se pueda compilar correctamente el cdigo del cliente. Esto se hace seleccionando Project -> Add Web Reference en el men principal de Visual Studio y escribiendo el la barra de direcciones de la ventana que aparecer (Address) la ruta del servicio Web a referenciar, en nuestro caso http://localhost/ServicioFechaVS/ServicioFechaVS.asmx Ntese que hay que incluir en la ruta el subdirectorio ServicioFechaVS, ya que es all donde Visual Studio coloc el servicio Web cuando se cre, que no es necesario concatenar el ?WSDL al final de la misma, y que con slo pulsar el botn OK de esta ventana se aade al proyecto la referencia adecuada para poder acceder desde el mismo al servicio ServicioFechaVS, sin que sea necesario que nosotros usemos alguna utilidad que genere el proxy. Slo falta comentar que hay que aadir un using localhost; al comienzo del cdigo fuente, ya que por defecto todas las referencias a servicios Web se importan organizndolas dentro de espacios de nombres llamados igual que el servidor donde estn alojados los servicios. Si nos interesase modificar esto siempre podremos hacerlo a travs del Explorador de Solucin, seleccionando la carpeta Web References del mismo y cambiando el nombre localhost que tiene un icono con la bola del mundo al lado por el nombre deseado.

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 41

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 42

Taller de C#: El nuevo lenguaje de Internet

Jos Antonio Gonzlez Seco

5.- Documentacin de referencia


1.

Gua de referencia del lenguaje C#: (http://www.msdn.microsoft.com/net/ecma)

Documento con la especificacin del lenguaje C# enviado por Microsoft al ECMA para su estandarizacin.
2. Compilador de C# (incluido en el .NET SDK): (http://www.msdn.microsoft.com/code/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml) 3.

Versin beta de Visual Studio .NET: (http://msdn.microsoft.com/vstudio/nextgen/beta.asp)

Es necesario disponer de subscripcin MSDN Universal para descargarlo o pedirlo por correo a Microsoft (slo se pagan gastos de envo)
4.

Portal de C# en espaol: (http://tdg.lsi.us.es/~csharp)

El Rincn en espaol de C# es el primer portal en Internet dedicado a C# escrito en castellano. Ha sido desarrollado por profesores de la Facultad de Informtica y Estadstica de Sevilla y contiene abundante informacin sobre el lenguaje, incluyendo un seminario on-line sobre C#, un FAQ sobre el lenguaje, aplicaciones de ejemplo y una lista de distribucin de correo con muchos subscriptores.
5.

Portal sobre .NET de Microsoft: (http://www.msdn.microsoft.net)

Sitio Web de Microsoft dedicado al desarrollo sobre su nueva plataforma .NET, e incluye mucha informacin, novedades, software y artculos tcnicos sobre la misma. La mayora de la informacin est escrita con ejemplos en C#.
6.

Especificacin del protocolo SOAP v1.1: (http://www.msdn.microsoft.com/xml/general/soapspec.asp)

Dado que este protocolo se basa en HTTP y XML, puede ser interesante tambin consultar las especificaciones de HTTP v1.1 (http://www.ietf.org/rfc/rfc2616.txt) y XML v1.0 (http://www.w3.org/TR/REC-xml) 7. Artculos destacados sobre servicios Web: Web Services: Building Reusable Web Components with SOAP and ASP.NET (http://www.msdn.microsoft.com/msdnmag/issues/01/02/webcomp/print.asp) de David S. Platt Web Services in ASP.NET (http://www.msdn.microsoft.com/voices/asp02222001.asp) de Rob Howard
8.

Bibliografa (puede conseguirla a travs de http://www.amazon.com) Inside C# de Tom Archer. Editorial Microsoft A programmers introduction to C# de Eric Gunnerson. Editorial Apress C# Essentials de Beb Albahari, Peter Drayton y Brand Merril. Editorial OReilly

Jornadas de Informtica Imagintica 2001(http://imaginatica.us.es)

Pgina 43

You might also like