Sie sind auf Seite 1von 45

Escuela Tcnica N 37 D.E.

11 Hogar Naval Stella Maris


LABORATORIO I - El lenguaje de programacin C# - MODULO I

Introduccin a Microsoft.NET

Microsoft.NET

Microsoft.NET es el conjunto de nuevas tecnologas en las que Microsoft ha estado trabajando durante
los ltimos aos con el objetivo de obtener una plataforma sencilla y potente para distribuir el software
en forma de servicios que puedan ser suministrados remotamente y que puedan comunicarse y
combinarse unos con otros de manera totalmente independiente de la plataforma, lenguaje de
programacin y modelo de componentes con los que hayan sido desarrollados. sta es la llamada
plataforma .NET, y a los servicios antes comentados se les denomina servicios Web.

Para crear aplicaciones para la plataforma .NET, tanto servicios Web como aplicaciones tradicionales
(aplicaciones de consola, aplicaciones de ventanas, servicios de Windows NT, etc.), Microsoft ha
publicado el denominado kit de desarrollo de software conocido como .NET Framework SDK, que
incluye las herramientas necesarias tanto para su desarrollo como para su distribucin y ejecucin y
Visual Studio.NET, que permite hacer todo la anterior desde una interfaz visual basada en ventanas

El concepto de Microsoft.NET tambin incluye al conjunto de nuevas aplicaciones que Microsoft y


terceros han (o estn) desarrollando para ser utilizadas en la plataforma .NET. Entre ellas podemos
destacar aplicaciones desarrolladas por Microsoft tales como Windows.NET, Hailstorm, Visual
Studio.NET, MSN.NET, Office.NET, y los nuevos servidores para empresas de Microsoft (SQL
Server.NET, Exchange.NET, etc.)

Common Language Runtime (CLR)

El Common Language Runtime (CLR) es el ncleo de la plataforma .NET. Es el motor encargado de


gestionar la ejecucin de las aplicaciones para ella desarrolladas y a las que ofrece numerosos
servicios que simplifican su desarrollo y favorecen su fiabilidad y seguridad. Las principales
caractersticas y servicios que ofrece el CLR son:

Modelo de programacin consistente: A todos los servicios y facilidades ofrecidos por el CLR
se accede de la misma forma: a travs de un modelo de programacin orientado a objetos. Esto
es una diferencia importante respecto al modo de acceso a los servicios ofrecidos por los
algunos sistemas operativos actuales (por ejemplo, los de la familia Windows), en los que a
algunos servicios se les accede a travs de llamadas a funciones globales definidas en DLLs y a
otros a travs de objetos (objetos COM en el caso de la familia Windows)

Modelo de programacin sencillo: Con el CLR desaparecen muchos elementos complejos


incluidos en los sistemas operativos actuales (registro de Windows, GUIDs, HRESULTS,
IUnknown, etc.) El CLR no es que abstraiga al programador de estos conceptos, sino que son
conceptos que no existen en la plataforma .NET

La plataforma .NET las versiones nuevas de las DLLs pueden coexistir con las viejas, de modo
que las aplicaciones diseadas para ejecutarse usando las viejas podrn seguir usndolas tras
instalacin de las nuevas. Esto, obviamente, simplifica mucho la instalacin y desinstalacin de
software.

Ejecucin multiplataforma: El CLR acta como una mquina virtual, encargndose de


ejecutar las aplicaciones diseadas para la plataforma .NET. Es decir, cualquier plataforma para
la que exista una versin del CLR podr ejecutar cualquier aplicacin .NET. Microsoft ha
desarrollado versiones del CLR para la mayora de las versiones de Windows: Windows 95,
Windows 98, Windows ME, Windows NT 4.0, Windows 2000, Windows XP y Windows CE (que
puede ser usado en CPUs que no sean de la familia x86) Por otro lado Microsoft ha firmado un
acuerdo con Corel para portar el CLR a Linux y tambin hay terceros que estn desarrollando de
manera independiente versiones de libre distribucin del CLR para Linux. Asimismo, dado que la

Profesores Adriana Gil, Pablo Linares, Jorge Romero 1 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

arquitectura del CLR est totalmente abierta, es posible que en el futuro se diseen versiones
del mismo para otros sistemas operativos.

Integracin de lenguajes: Desde cualquier lenguaje para el que exista un compilador que
genere cdigo para la plataforma .NET es posible utilizar cdigo generado para la misma usando
cualquier otro lenguaje tal y como si de cdigo escrito usando el primero se tratase. Microsoft
ha desarrollado un compilador de C# que genera cdigo de este tipo, as como versiones de sus
compiladores de Visual Basic (Visual Basic.NET) y C++ (C++ con extensiones gestionadas) que
tambin lo generan y una versin del intrprete de JScript (JScript.NET) que puede
interpretarlo. La integracin de lenguajes esta que es posible escribir una clase en C# que
herede de otra escrita en Visual Basic.NET que, a su vez, herede de otra escrita en C++ con
extensiones gestionadas.

Gestin de memoria: El CLR incluye un recolector de basura que evita que el programador
tenga que tener en cuenta cundo ha de destruir los objetos que dejen de serle tiles. Este
recolector es una aplicacin que se activa cuando se quiere crear algn objeto nuevo y se
detecta que no queda memoria libre para hacerlo, caso en que el recolector recorre la memoria
dinmica asociada a la aplicacin, detecta qu objetos hay en ella que no puedan ser accedidos
por el cdigo de la aplicacin, y los elimina para limpiar la memoria de objetos basura y
permitir la creacin de otros nuevos. Gracias a este recolector se evitan errores de
programacin muy comunes como intentos de borrado de objetos ya borrados, agotamiento de
memoria por olvido de eliminacin de objetos intiles o solicitud de acceso a miembros de
objetos ya destruidos.

Seguridad de tipos: El CLR facilita la deteccin de errores de programacin difciles de


localizar comprobando que toda conversin de tipos que se realice durante la ejecucin de una
aplicacin .NET se haga de modo que los tipos origen y destino sean compatibles.

Aislamiento de procesos: El CLR asegura que desde cdigo perteneciente a un determinado


proceso no se pueda acceder a cdigo o datos pertenecientes a otro, lo que evita errores de
programacin muy frecuentes e impide que unos procesos puedan atacar a otros. Esto se
consigue gracias al sistema de seguridad de tipos antes comentado, pues evita que se pueda
convertir un objeto a un tipo de mayor tamao que el suyo propio, ya que al tratarlo como un
objeto de mayor tamao podra accederse a espacios en memoria ajenos a l que podran
pertenecer a otro proceso. Tambin se consigue gracias a que no se permite acceder a
posiciones arbitrarias de memoria.

Tratamiento de excepciones: En el CLR todos los errores que se puedan producir durante la
ejecucin de una aplicacin se propagan de igual manera: mediante excepciones. Esto es muy
diferente a como se vena haciendo en los sistemas Windows hasta la aparicin de la plataforma
.NET, donde ciertos errores se transmitan mediante cdigos de error en formato Win32, otros
mediante HRESULTs y otros mediante excepciones.

El CLR permite que excepciones lanzadas desde cdigo para .NET escrito en un cierto lenguaje
se puedan capturar en cdigo escrito usando otro lenguaje, e incluye mecanismos de
depuracin que pueden saltar desde cdigo escrito para .NET en un determinado lenguaje a
cdigo escrito en cualquier otro. Por ejemplo, se puede recorrer la pila de llamadas de una
excepcin aunque sta incluya mtodos definidos en otros mdulos usando otros lenguajes.

Interoperabilidad con cdigo antiguo: El CLR incorpora los mecanismos necesarios para
poder acceder desde cdigo escrito para la plataforma .NET a cdigo escrito previamente a la
aparicin de la misma y, por tanto, no preparado para ser ejecutando dentro de ella. Estos
mecanismos permiten tanto el acceso a objetos COM como el acceso a funciones sueltas de
DLLs preexistentes (como la API Win32)

Profesores Adriana Gil, Pablo Linares, Jorge Romero 2 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Como se puede deducir de las caractersticas comentadas, el CLR lo que hace es gestionar la ejecucin
de las aplicaciones diseadas para la plataforma .NET. Por esta razn, al cdigo de estas aplicaciones
se le suele llamar cdigo gestionado, y al cdigo no escrito para ser ejecutado directamente en la
plataforma .NET se le suele llamar cdigo no gestionado.

Microsoft Intermediate Language (MSIL)

Todos los compiladores que generan cdigo para la plataforma .NET no generan cdigo mquina para
CPUs x86 ni para ningn otro tipo de CPU concreta, sino que generan cdigo escrito en el lenguaje
intermedio conocido como Microsoft Intermediate Lenguage (MSIL) El CLR da a las aplicaciones las
sensacin de que se estn ejecutando sobre una mquina virtual, y precisamente MSIL es el cdigo
mquina de esa mquina virtual. Es decir, MSIL es el nico cdigo que es capaz de interpretar el CLR,
y por tanto cuando se dice que un compilador genera cdigo para la plataforma .NET lo que se est
diciendo es que genera MSIL.

MSIL ha sido creado por Microsoft tras consultar a numerosos especialistas en la escritura de
compiladores y lenguajes tanto del mundo acadmico como empresarial. Es un lenguaje de un nivel de
abstraccin mucho ms alto que el de la mayora de los cdigos mquina de las CPUs existentes, e
incluye instrucciones que permiten trabajar directamente con objetos (crearlos, destruirlos,
inicializarlos, llamar a mtodos virtuales, etc.), tablas y excepciones (lanzarlas, capturarlas y tratarlas)

Ya se coment que el compilador de C# compila directamente el cdigo fuente a MSIL, que Microsoft
ha desarrollado nuevas versiones de sus lenguajes Visual Basic (Visual Basic.NET) y C++ (C++ con
extensiones gestionadas) cuyos compiladores generan MSIL, y que ha desarrollado un intrprete de
JScript (JScript.NET) que genera cdigo MSIL. Pues bien, tambin hay numerosos terceros que han
anunciado estar realizando versiones para la plataforma .NET de otros lenguajes como APL, CAML,
Cobol, Eiffel, Fortran, Haskell, Java (J#), Mercury, ML, Mondrian, Oberon, Oz, Pascal, Perl, Python,
RPG, Scheme y Smalltalk.

La principal ventaja del MSIL es que facilita la ejecucin multiplataforma y la integracin entre
lenguajes al ser independiente de la CPU y proporcionar un formato comn para el cdigo mquina
generado por todos los compiladores que generen cdigo para .NET. Sin embargo, dado que las CPUs
no pueden ejecutar directamente MSIL, antes de ejecutarlo habr que convertirlo al cdigo nativo de la
CPU sobre la que se vaya a ejecutar. De esto se encarga un componente del CLR conocido como
compilador JIT (Just-In-Time).

La Librera de Clase Base (BCL) es una librera incluida en el .NET Framework formada por cientos de
tipos de datos que permiten acceder a los servicios ofrecidos por el CLR y a las funcionalidades ms
frecuentemente usadas a la hora de escribir programas. Adems, a partir de estas clases prefabricadas
el programador puede crear nuevas clases que mediante herencia extiendan su funcionalidad y se
integren a la perfeccin con el resto de clases de la BCL. Por ejemplo, implementando ciertos interfaces
podemos crear nuevos tipos de colecciones que sern tratadas exactamente igual que cualquiera de las
colecciones incluidas en la BCL.

Esta librera est escrita en MSIL, por lo que puede usarse desde cualquier lenguaje cuyo compilador
genere MSIL. A travs de las clases suministradas en ella es posible desarrollar cualquier tipo de
aplicacin, desde las tradicionales aplicaciones de ventanas, consola o servicio de Windows NT hasta
los novedosos servicios Web y pginas ASP.NET. Es tal la riqueza de servicios que ofrece que puede
crearse lenguajes que carezcan de librera de clases propia y slo usen la BCL -como C#.

Dado la amplitud de la BCL, ha sido necesario organizar las clases en ella incluida en espacios de
nombres que agrupen clases con funcionalidades similares. Por ejemplo, los espacios de nombres ms
usados son:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 3 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Espacio de nombres Utilidad de los tipos de datos que contiene


System Tipos muy frecuentemente usados, como los los
tipos bsicos, tablas, excepciones, fechas, nmeros
aleatorios, recolector de basura, entrada/salida en
consola, etc.
System.Collections Colecciones de datos de uso comn como pilas,
colas, listas, diccionarios, etc.
System.Data Manipulacin de bases de datos. Forman la
denominada arquitectura ADO.NET.
System.IO Manipulacin de ficheros y otros flujos de datos.
System.Net Realizacin de comunicaciones en red.
System.Reflection Acceso a los metadatos que acompaan a los
mdulos de cdigo.
System.Runtime.Remoting Acceso a objetos remotos.
System.Security Acceso a la poltica de seguridad en que se basa el
CLR.
System.Threading Manipulacin de hilos.
System.Web.UI.WebControls Creacin de interfaces de usuario basadas en
ventanas para aplicaciones Web.
System.Winforms Creacin de interfaces de usuario basadas en
ventanas para aplicaciones estndar.
System.XML Acceso a datos en formato XML.

Introduccin a C#

Origen y necesidad de un nuevo lenguaje

C# es el nuevo lenguaje de propsito general diseado por Microsoft para su plataforma .NET. Sus
principales creadores son Scott Wiltamuth y Anders Hejlsberg, ste ltimo tambin conocido por haber
sido el diseador del lenguaje Turbo Pascal y la herramienta RAD Delphi.

Aunque es posible escribir cdigo para la plataforma .NET en muchos otros lenguajes, C# es el nico
que ha sido diseado especficamente para ser utilizado en ella, por lo que programarla usando C# es
mucho ms sencillo e intuitivo que hacerlo con cualquiera de los otros lenguajes ya que C# carece de
elementos heredados innecesarios en .NET. Por esta razn, se suele decir que C# es el lenguaje
nativo de .NET

La sintaxis y estructuracin de C# es muy similar a la C++, ya que la intencin de Microsoft con C# es


facilitar la migracin de cdigos escritos en estos lenguajes a C# y facilitar su aprendizaje a los
desarrolladores habituados a ellos. Sin embargo, su sencillez y el alto nivel de productividad son
equiparables a los de Visual Basic.

Un lenguaje que hubiese sido ideal utilizar para estos menesteres es Java, pero debido a problemas
con la empresa creadora del mismo -Sun-, Microsoft ha tenido que desarrollar un nuevo lenguaje que
aadiese a las ya probadas virtudes de Java las modificaciones que Microsoft tena pensado aadirle
para mejorarlo an ms y hacerlo un lenguaje orientado al desarrollo de componentes.

En resumen, C# es un lenguaje de programacin que toma las mejores caractersticas de lenguajes


preexistentes como Visual Basic, Java o C++ y las combina en uno solo. El hecho de ser relativamente
reciente no implica que sea inmaduro, pues Microsoft ha escrito la mayor parte de la BCL usndolo, por
lo que su compilador es el ms depurado y optimizado de los incluidos en el .NET Framework SDK

Profesores Adriana Gil, Pablo Linares, Jorge Romero 4 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Caractersticas de C#

Con la idea de que los programadores ms experimentados puedan obtener una visin general del
lenguaje, a continuacin se recoge de manera resumida las principales caractersticas de C# Alguna de
las caractersticas aqu sealadas no son exactamente propias del lenguaje sino de la plataforma .NET
en general. Sin embargo, tambin se comentan aqu tambin en tanto que tienen repercusin directa
en el lenguaje, aunque se indicar explcitamente cules son este tipo de caractersticas cada vez que
se toquen:

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

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


adicionales al propio fuente tales como ficheros de cabecera o ficheros IDL

o El tamao de los tipos de datos bsicos es fijo e independiente del compilador, sistema
operativo o mquina para quienes se compile (no como en C++), lo que facilita la
portabilidad del cdigo.

o No se incluyen elementos poco tiles de lenguajes como C++ tales como macros,
herencia mltiple o la necesidad de un operador diferente del punto (.) acceder a
miembros de espacios de nombres (::)

Modernidad: C# incorpora en el propio lenguaje elementos que a lo largo de los aos ha ido
demostrndose son muy tiles para el desarrollo de aplicaciones y que en otros lenguajes como
Java o C++ hay que simular, como un tipo bsico decimal que permita realizar operaciones de
alta precisin con reales de 128 bits (muy til en el mundo financiero), la inclusin de una
instruccin foreach que permita recorrer colecciones con facilidad y es ampliable a tipos
definidos por el usuario, la inclusin de un tipo bsico string para representar cadenas o la
distincin de un tipo bool especfico para representar valores lgicos.

Orientacin a objetos: Como todo lenguaje de programacin de propsito general actual,


C# es un lenguaje orientado a objetos, aunque eso es ms bien una caracterstica del CTS que
de C#. Una diferencia de este enfoque orientado a objetos respecto al de otros lenguajes como
C++ es que el de C# es ms puro en tanto que no admiten ni funciones ni variables globales
sino que todo el cdigo y datos han de definirse dentro de definiciones de tipos de datos, lo que
reduce problemas por conflictos de nombres y facilita la legibilidad del cdigo.

C# soporta todas las caractersticas propias del paradigma de programacin orientada a


objetos: encapsulacin, herencia y polimorfismo.

En lo referente a la encapsulacin es importante sealar que aparte de los tpicos


modificadores public, private y protected, C# aade un cuarto modificador llamado internal,
que puede combinarse con protected e indica que al elemento a cuya definicin precede slo
puede accederse desde su mismo ensamblado.

Respecto a la herencia -a diferencia de C++ y al igual que Java- C# slo admite herencia
simple de clases ya que la mltiple provoca ms quebraderos de cabeza que facilidades y en la
mayora de los casos su utilidad puede ser simulada con facilidad mediante herencia mltiple de
interfaces. De todos modos, esto vuelve a ser ms bien una caracterstica propia del CTS que de
C#.

Por otro lado y a diferencia de Java, en C# se ha optado por hacer que todos los mtodos
sean por defecto sellados y que los redefinibles hayan de marcarse con el modificador
virtual (como en C++), lo que permite evitar errores derivados de redefiniciones accidentales.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 5 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Adems, un efecto secundario de esto es que las llamadas a los mtodos sern ms
eficientes por defecto al no tenerse que buscar en la tabla de funciones virtuales la
implementacin de los mismos a la que se ha de llamar. Otro efecto secundario es que permite
que las llamadas a los mtodos virtuales se puedan hacer ms eficientemente al contribuir a
que el tamao de dicha tabla se reduzca.

Gestin automtica de memoria: Como ya se coment, todo lenguaje de .NET tiene a su


disposicin el recolector de basura del CLR. Esto tiene el efecto en el lenguaje de que no es
necesario incluir instrucciones de destruccin de objetos. Sin embargo, dado que la destruccin
de los objetos a travs del recolector de basura es indeterminista y slo se realiza cuando ste
se active ya sea por falta de memoria, finalizacin de la aplicacin o solicitud explcita en el
fuente-, C# tambin proporciona un mecanismo de liberacin de recursos determinista a travs
de la instruccin using.

Versionable: C# incluye una poltica de versionado que permite crear nuevas versiones de
tipos sin temor a que la introduccin de nuevos miembros provoquen errores difciles de
detectar en tipos hijos previamente desarrollados y ya extendidos con miembros de igual
nombre a los recin introducidos.

Si una clase introduce un nuevo mtodo cuyas redefiniciones deban seguir la regla de llamar a
la versin de su padre en algn punto de su cdigo, difcilmente seguiran esta regla miembros
de su misma signatura definidos en clases hijas previamente a la definicin del mismo en la
clase padre; o si introduce un nuevo campo con el mismo nombre que algn mtodo de una
clase hija, la clase hija dejar de funcionar. Para evitar que esto ocurra, en C# se toman dos
medidas:

o Se obliga a que toda redefinicin deba incluir el modificador override, con lo que la
versin de la clase hija nunca sera considerada como una redefinicin de la versin de
miembro en la clase padre ya que no incluira override. Para evitar que por accidente
un programador incluya este modificador, slo se permite incluirlo en miembros que
tengan la misma signatura que miembros marcados como redefinibles mediante el
modificador virtual. As adems se evita el error tan frecuente en Java de creerse haber
redefinido un miembro, pues si el miembro con override no existe en la clase padre se
producir un error de compilacin.

o Si no se considera redefinicin, entonces se considera que lo que se desea es ocultar el


mtodo de la clase padre, de modo que para la clase hija sea como si nunca hubiese
existido. El compilador avisar de esta decisin a travs de un mensaje de aviso que
puede suprimirse incluyendo el modificador new en la definicin del miembro en la
clase hija para as indicarle explcitamente la intencin de ocultacin.

Eficiente: En principio, en C# todo el cdigo incluye numerosas restricciones para asegurar su


seguridad y no permite el uso de punteros. Sin embargo, y a diferencia de Java, en C# es
posible saltarse dichas restricciones manipulando objetos a travs de punteros. Para ello basta
marcar regiones de cdigo como inseguras (modificador unsafe) y podrn usarse en ellas
punteros de forma similar a cmo se hace en C++, lo que puede resultar vital para situaciones
donde se necesite una eficiencia y velocidad procesamiento muy grandes.

Compatible: Para facilitar la migracin de programadores, C# no slo mantiene una sintaxis


muy similar a C, C++ o Java que permite incluir directamente en cdigo escrito en C#
fragmentos de cdigo escrito en estos lenguajes, sino que el CLR tambin ofrece, a travs de
los llamados Platform Invocation Services (PInvoke), la posibilidad de acceder a cdigo
nativo escrito como funciones sueltas no orientadas a objetos tales como las DLLs de la API
Win32. Ntese que la capacidad de usar punteros en cdigo inseguro permite que se pueda
acceder con facilidad a este tipo de funciones, ya que stas muchas veces esperan recibir o
devuelven punteros.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 6 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Tambin es posible acceder desde cdigo escrito en C# a objetos COM. Para facilitar esto, el
.NET Framework SDK incluye una herramientas llamadas tlbimp y regasm mediante las que es
posible generar automticamente clases proxy que permitan, respectivamente, usar objetos
COM desde .NET como si de objetos .NET se tratase y registrar objetos .NET para su uso desde
COM.

Finalmente, tambin se da la posibilidad de usar controles ActiveX desde cdigo .NET y


viceversa. Para lo primero se utiliza la utilidad aximp, mientras que para lo segundo se usa la
ya mencionada regasm.

Aplicaciones

Aplicacin bsica Hola Mundo!

Bsicamente una aplicacin en C# puede verse como un conjunto de uno o ms ficheros de cdigo
fuente con las instrucciones necesarias para que la aplicacin funcione como se desea y que son
pasados al compilador para que genere un ejecutable. Cada uno de estos ficheros no es ms que un
fichero de texto plano escrito usando caracteres Unicode y siguiendo la sintaxis propia de C#.

Como primer contacto con el lenguaje, nada mejor que el tpico programa de iniciacin Hola Mundo!
que lo nico que hace al ejecutarse es mostrar por pantalla el mensaje Hola Mundo! Su cdigo es:

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

Todo el cdigo escrito en C# se ha de escribir dentro de una definicin de clase, y lo que en la lnea 1:
se dice es que se va a definir una clase (class) de nombre HolaMundo1 cuya definicin estar
comprendida entre la llave de apertura de la lnea 2: y su correspondiente llave de cierre en la lnea
lnea 7:

Dentro de la definicin de la clase (lnea 3:) se define un mtodo de nombre Main cuyo cdigo es el
indicado entre la llave de apertura de la lnea 4: y su respectiva llave de cierre (lnea 6:) Un mtodo no
es ms que un conjunto de instrucciones a las que se les asocia un nombre, de modo que para
posteriormente ejecutarlas baste 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, y
como en este caso estn vacos ello significa que el mtodo no toma parmetros. Los parmetros de
un mtodo permiten variar el resultado de su ejecucin segn los valores que se les d en cada
llamada.

La palabra static que antecede a la declaracin del tipo de valor devuelto es un modificador del
significado de la declaracin de mtodo que indica que el mtodo est asociado a la clase dentro de la
que se define y no a los objetos que se creen a partir de ella. Main() es lo que es denomina el punto
de entrada de la aplicacin, que no es ms que el mtodo por el que comenzar su ejecucin.
Necesita del modificador static para evitar que para llamarlo haya que crear algn objeto de la clase
donde se haya definido.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 7 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Finalmente, la lnea 5: contiene la instruccin con el cdigo a ejecutar, que lo que se hace es solicitar
la ejecucin del mtodo WriteLine() de la clase Console definida en el espacio de nombres System
pasndole como parmetro la cadena de texto con el contenido Hola Mundo! Ntese que las cadenas
de textos son secuencias de caracteres delimitadas por comillas dobles aunque dichas comillas no
forman parte de la cadena. Por su parte, un espacio de nombres puede considerarse que es algo
similar para las clases a lo que un directorio es para los ficheros; es decir, es una forma de agruparlas.

El mtodo WriteLine() se usar muy a menudo en los prximos temas, por lo que es conveniente
sealar ahora que una forma de llamarlo que se utilizar en repetidas ocasiones consiste en pasarle un
nmero indefinido de otros parmetros de cualquier tipo e incluir en el primero subcadenas de la
forma {i}. Con ello se consigue que se muestre por la ventana de consola la cadena que se le pasa
como primer parmetro pero sustituyndole las subcadenas {i} por el valor convertido en cadena de
texto del parmetro que ocupe la posicin i+2 en la llamada a WriteLine(). Por ejemplo, la siguiente
instruccin mostrara Tengo 5 aos por pantalla si x valiese 5:

Console.WriteLine(Tengo {0} aos, x);

Para indicar cmo convertir cada objeto en un cadena de texto basta redefinir su mtodo ToString().

Antes de seguir es importante resaltar que C# es sensible a las maysculas, los que significa que no da
igual la capitalizacin con la que se escriban los identificadores. Es decir, no es lo mismo escribir
Console que COnsole o CONSOLE, y si se hace de alguna de las dos ltimas formas el compilador
producir un error debido a que en el espacio de nombres System no existe ninguna clase con dichos
nombres. En este sentido, cabe sealar que un error comn entre programadores acostumbrados a
Java es llamar al punto de entrada main en vez de Main, lo que provoca un error al compilar
ejecutables en tanto que el compilador no detectar ninguna definicin de punto de entrada.

Puntos de entrada

Ya se ha dicho que el punto de entrada de una aplicacin es un mtodo de nombre Main que
contendr el cdigo por donde se ha de iniciar la ejecucin de la misma. Hasta ahora slo se ha visto
una versin de Main() que no toma parmetros y tiene como tipo de retorno void, pero en realidad
todas sus posibles versiones son:

static void Main()


static int Main()
static int Main(string[] args)
static void Main(string[] args)

Compilacin en lnea de comandos

Una vez escrito el cdigo anterior con algn editor de textos como el Bloc de Notas de Windows- y
almacenado en formato de texto plano en un fichero HolaMundo.cs, para compilarlo basta abrir una
ventana de consola (MS-DOS en Windows), colocarse en el directorio donde se encuentre y pasrselo
como parmetro al compilador as:

csc HolaMundo.cs

csc.exe es el compilador de C# incluido en el .NET Framework SDK para Windows de Microsoft, y es


posible llamarlo desde cualquier directorio en tanto que al instalarlo se aade una referencia al mismo
en el path. Si utiliza otros compiladores de C# puede que varie la forma en que se realice la
compilacin, por lo que lo que aqu se explica en principio slo podra ser vlido para el compilador de
Microsoft para Windows.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 8 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Tras la compilacin se obtendra un ejecutable llamado HolaMundo.exe cuya ejecucin producira la


siguiente salida por la ventana de consola:

Hola Mundo!

Compilacin con Visual Studio.NET

Para compilar una aplicacin en Visual Studio.NET primero hay que incluirla dentro de algn proyecto.
Para ello basta pulsar el botn New Project en la pgina de inicio que se muestra nada ms arrancar
dicha herramienta, tras lo que se obtendr una pantalla con el aspecto mostrado en la siguiente figura.
En el recuadro de la ventana mostrada etiquetado como Project Types se ha de seleccionar el tipo de
proyecto a crear. Obviamente, si se va a trabajar en C# la opcin que habr que escoger en la misma
ser siempre Visual C# Projects.

En el recuadro Templates se ha de seleccionar la plantilla correspondiente al subtipo de proyecto


dentro del tipo indicado en Project Types que se va a realizar. Para realizar un ejecutable de consola,
como es nuestro caso, hay que seleccionar el icono etiquetado como Console Application. Si se quisiese
realizar una librera habra que seleccionar Class Library, y si se quieres realizar un ejecutable de
ventanas habra que seleccionar Windows Application. Ntese que no se ofrece ninguna plantilla para
realizar mdulos, lo que se debe a que desde Visual Studio.NET no pueden crearse.
Por ltimo, en el recuadro de texto Name se ha de escribir el nombre a dar al proyecto y en Location
el del directorio base asociado al mismo. Ntese que bajo de Location aparecer un mensaje
informando sobre cual ser el directorio donde finalmente se almacenarn los archivos del proyecto,
que ser el resultante de concatenar la ruta especificada para el directorio base y el nombre del
proyecto.

Ventana de creacin de nuevo proyecto en Visual Studio.NET

Una vez configuradas todas estas opciones, al pulsar botn OK Visual Studio crear toda la
infraestructura adecuada para empezar a trabajar cmodamente en el proyecto. Como puede
apreciarse en la figura de abajo, esta infraestructura consistir en la generacin de una fuente que
servir de plantilla para la realizacin de proyectos del tipo elegido (en nuestro caso, aplicaciones de
consola en C#):

Profesores Adriana Gil, Pablo Linares, Jorge Romero 9 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Plantilla para aplicaciones de consola generada por Visual Studio.NET

DECLARACIN DE VARIABLES

Una variable es un espacio asignado en la memoria RAM que se puede utilizar en el cdigo. En C#
todas las variables deben ser obligatoriamente declaradas y tener un tipo (recordar que es un lenguaje
fuertemente tipado, a esto es que dicha clasificacin est referida), pero no es necesario declarar todas
las variables al inicio del programa.
No se puede asignar un valor a una variable sin definirla, pues eso causar un error. Las variables son
usadas en situaciones en las que se necesita almacenar en la memoria.
La sintaxis de la declaracin es la siguiente:

<tipo> <nombre variable>[=<valor>];

A continuacin se enumeran o muestran algunos ejemplos de declaraciones de variables:

int x;
string nombre;
long largo;

O tambin podemos declarar asignando un valor inicial:

int x=10;
string nombre=Jose ;
char letra=A ;

Los tipos de datos posibles de definicin son los que se pueden observar a continuacin el grfico:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 10 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Es importante destacar que el C# es Case Sensitive a diferencia por ejemplo de cualquier versin de
Visual Basic u otros lenguajes, esto quiere decir que si definimos como en el siguiente ejemplo:

string apellido=Alumnos;
string Apellido=alumnos ;

Tenemos dos variables distintas (apellido y Apellido) ya que para C# es diferente la mayscula de la
minscula.

Ingreso de datos

A continuacin equivalencias para el ingreso e visualizacin en lenguaje C#.

int a,c=20;
float b;
string apellido;
char opc;

Console.Clear();

//ingreso
a = int.Parse(Console.ReadLine()); //scanf("%d",&a);
b = float.Parse(Console.ReadLine()); //scanf("%f",&a);
apellido = Console.ReadLine(); //scanf("%s",&apellido);
opc = char.Parse(Console.ReadLine()); //scanf(%c,&opc);

//mostrar las variables ingresadas


Console.WriteLine("{0},{1},{2},{3},{4}",a,b,apellido,c,opc);

Profesores Adriana Gil, Pablo Linares, Jorge Romero 11 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

ESTRUCTURAS DE CONTROL

Las estructuras de control son aquellas que permiten manejar el flujo o hilo del cdigo, es decir que
con ellas podemos hacer que el mismo sea salteado, repetido, invocado, etc.
Dentro de las estructuras de control podemos encontrar:

Condicionales: Son aquellas que de acuerdo a la evaluacin de una condicin en verdadero o


falso, se sigue por un camino de ejecucin o por otro.
De Iteracin o ccilicas: Las iteraciones permiten la ejecucin reiterada de un conjunto de
instrucciones que se encuentre dentro de la estructura de control.

Estructuras if y switch:

Dichas estructuras evalan una condicin (de uno o ms operadores) y la reduce a una mera expresin
booleana, es decir True o False (Cierto o Falso). Dependiendo de ello se ejecutaran o no un bloque de
instrucciones.

Sintaxis de if:

if (expresion)
{
Instrucciones a ejecutar si la
condicin fue verdadera
}
else
{
Instrucciones a ejecutar si la
condicin fue falsa
}

Sintaxis de switch:

switch( expresin )
{
case constante1:
instrucciones;
break;
[case constante2:
instrucciones;
break;]
...
[default:
instrucciones;]
}

En ambos casos la expresin debe ser tal que tenga el tipo boolean. Notar que en el caso de las
opciones del switch, es necesario especificar el break para que no ejecute las dems opciones.

Estructuras for, foreach y while:

Las estructuras de ciclos son utilizadas con el objeto de repetir una porcin de cdigo tantas veces
como sea necesario, de acuerdo a parmetros especficos o condicionales.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 12 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Sintaxis de for:

for (inicializacin; condicin; iteracin)


{
instrucciones;
[break;]
}

Inicializacin: se entiende como la asignacin a la variable sobre la que se contabiliza la


cantidad de iteraciones. Esta variable puede definirse fuera del ciclo, pero antes de la
ocurrencia del mismo, o dentro de la inicializacin misma, como una variable.

Condicin: Es una expresin booleana donde se verifica el valor de la variable sobre la que se
itera.

Iteracin: Especifica la modalidad de variacin de la variable, es decir el incremento o


decremento.

La instruccin break permite detener el ciclo en cualquier momento, por lo que, al se deber utilizar
condicionalmente para evitar que el ciclo se corte tan pronto como se llegue a la misma.

Por ejemplo una iteracin de 100 veces sera la siguiente:

for (int i = 0; i < 100; i++ )


{
//instrucciones;
}

Sintaxis de foreach:

La estructura foreach es una iteracin muy til dado que se utiliza para recorrer elementos de tipo
coleccin. Una coleccin es un elemento que posee subelementos que lo conforman. El ejemplo mas
claro es el del vector o arreglo (se vern ms adelante), pero es muy interesante apreciar que un
string esta conformado por elementos de tipo char, con lo que si quiseramos recorrer un string
elemento por elemento podramos utilizar perfectamente esta estructura.

foreach (object var in collection_to_loop)


{
//instrucciones
}

object: Indica el tipo de dato que poseer el parmetro var, as en el caso de recorrer un
string, el elemento mnimo que compone este tipo de dato es el char.

var: Es una expresin de tipo variable donde se asignara el subelemento actual de la coleccin.

collection_to_loop: Especifica el elemento a recorrer por foreach.

Por ejemplo el siguiente foreach recorre un string, char a char y se visualizar cada elemento en cada
iteracin (primero A, luego d, luego r y as sucesivamente):

string Nombre=jorge;
foreach (char Letra in Nombre)
{
Console.Writeln({0},Letra);
}

Profesores Adriana Gil, Pablo Linares, Jorge Romero 13 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Sintaxis de while:

Se utiliza para repetir una porcin de cdigo mientras que la condicin sea evaluada como True
(Cierta). La instruccin break permite detener el ciclo en cualquier momento, por lo que, al se deber
utilizar condicionalmente para evitar que el ciclo se corte tan pronto como se llegue a la misma.

while(condicin) do
{ {
instrucciones; instrucciones;
[break;] [break;]
} }
while(condicin);

Donde la condicin es una expresin booleana. Las condiciones pueden ser simples o compuestas,
estas ltimas son aquellas que poseen ms de una condicin que interactan entre si por medio de
operadores de tipo lgico, en la siguiente figura podemos apreciar la sintaxis de los mismos:

OPERADOR TIPO

&& OPERADOR LGICO Y

|| OPERADOR LGICO O

! NEGACIN LGICA

== IGUAL

!= DISTINTO

Una posibilidad importante del ide, y que es muy til, es la de presionar dos veces seguidas
la tecla tab (doble tab) luego de escribir la palabra clave de cada estructura, con lo que el
ide pegar automticamente la sintaxis de cada una de ellas con el fin que luego la
paramtricemos segn se necesite; por ejemplo al escribir for y realizar la citada pulsacin
de las teclas se escribir automticamente lo siguiente:

for (int i = 0; i < length; i++)


{

con lo que solo nos queda reemplazar las caractersticas resaltadas.

Manejo de Cadenas.

primeramente debemos indicar que el c# (como as tambin lo hace su pariente c++) trata a las
cadenas como una coleccin de caracteres. se dice coleccin cuando un objeto, en este caso un string,
se compone de varios elementos. en el caso de los tipos string, los elementos que lo componen son los
tipo char.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 14 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

ejemplo:
string dato = "curso c#";
console.writeline("{0}", dato[1]);
console.readkey();

// muestra el char: u

mtodo ToString(): Se utiliza el mtodo tostring() para la conversin de un dato al formato string,
tal como se realiz el ejemplo previo.
sintaxis:
<dato>.ToString([parmetros]);

los parmetros que utilizaremos (no son los nicos) permiten formatear el contenido de los datos
segn podemos ver a continuacin.
ejemplos:
int a = 15;
char b = 'b';
string ac = a.tostring();
string bc = b.tostring();
string ac2 = a.tostring("00.000");

se definen las variables a y b, con formatos int y char respectivamente y se convierten luego a tipo
string mediante el mtodo en las variables ac, bc y ac2.
a continuacin detallo los resultados de las conversiones:
ac -> 15
bc -> b
ac2 -> 15,000

importante: el contenido char se especifica entre comillas simples (por ejemplo b), mientras que el
contenido de un string se especifica entre comillas (por ejemplo laboratorio).

mtodos ToUpper() y ToLower(): Se utiliza el mtodo toupper() para la conversin de caracteres


minsculas hacia maysculas en un formato string, mientras que tolower() funciona de modo
contrario.
sintaxis:
<cadena>.ToUpper();
<cadena>.ToLower();

ejemplo:
string nombre="curso c#";
nombre=nombre.ToUpper(); // transform a CURSO C#
Console.WriteLine("{0}", nombre);
nombre = nombre.ToLower(); // transform a curso c# nuevamente
Console.WriteLine("{0}", nombre);
Console.ReadKey(); //pausa

Profesores Adriana Gil, Pablo Linares, Jorge Romero 15 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Mtodos Trim(), TrimEnd() y TrimStart(): Se utilizan para eliminar espacios de un string; trim()
borra todos los espacios al principio y al final de la cadena, trimend() los de la derecha o ltimos y por
ltimo trimstart() elimina todos los espacios por izquierda o al comienzo de la cadena.
es importante aclarar que ninguno de estos mtodos elimina todos los espacios de una cadena, sino
que siempre afecta a los del principio y/o los del final.
sintaxis:
<cadena>.Trim();
<cadena>.TrimEnd();
<cadena>.TrimStart();

ejemplo:
string nombre=" laboratorio ";
nombre=nombre.TrimEnd(); // transformo a laboratorio
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa
mtodo Substring(): Este mtodo permite la extraccin en formato string de uno o mas chars
contenidos, dentro de un string, segn se especifique.
sintaxis:
<cadena>.Substring(<parmetros>)
ejemplo:
string nombre="curso c#";
nombre = nombre.Substring(3, 2); // lo que extrae "so"
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

Mtodos IndexOf() y LastIndexOf(): Se utilizan para buscar una cadena de caracteres dentro de
otra, brindando como resultado la posicin de comienzo de la cadena encontrada, si en cambio el
resultado de la bsqueda no fuera exitoso, devuelve el valor -1. la diferencia entre ambas es
simplemente que indexof() comienza desde la izquierda, mientras que lastindexof() lo hace desde el
final de la cadena.
sintaxis:
<cadena>.IndexOf(<parmetros>)
<cadena>.LastIndexOf(<parmetros>)
ejemplo:

string nombre="curso c#";


nombre = nombre.IndexOf("c#").ToString(); // muestra un [6]
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

string nombre="curso c#";


nombre = nombre.LastIndexOf('#',(nombre.Length)-1).ToString();
// muestra un [7]
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

Profesores Adriana Gil, Pablo Linares, Jorge Romero 16 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Mtodo Contains(): El mtodo contains devuelve un tipo bool, que indica si una cadena especificada
se encuentra dentro de otra.
ejemplo:
string nombre = "curso c#";
nombre=nombre.Contains("ur").ToString();
// se muestra true por pantalla al encontrarlo
Console.WriteLine("[{0}]", nombre);
nombre = nombre.Contains("t").ToString();
// se muestra false por pantalla al no encontrarlo
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

Mtodo Replace(): Se utiliza para reemplazar una cadena con otra, o un char por otro char. devuelve
como resultado la cadena con los reemplazos efectuados.
sintaxis:
<cadena>.Replace(<parmetros>)
ejemplo:
string nombre = "curso c#";
nombre = nombre.Replace('c', 's');
Console.WriteLine("[{0}]", nombre); //muestra [surso s#]
nombre = nombre.Replace("ur", "a");
Console.WriteLine("[{0}]", nombre); //saso s#
Console.ReadKey(); //pausa

Mtodo Remove(): Se utiliza para eliminar caracteres de un string. devuelve como resultado la
cadena sin los caracteres que se eliminan.
sintaxis:
<cadena>.Remove(<parmetros>)
ejemplo:
string nombre = "curso c#";
nombre = nombre.Remove(3); // se asigna a nombre la cadena cur
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

string nombre = "curso c#";


nombre = nombre.Remove(3,2); // se asigna a nombre la cadena cur c# Console.WriteLine("[{0}]",
nombre);
Console.ReadKey(); //pausa

Mtodo Insert(): Inserta en un string otra cadena de caracteres a partir de una posicin especificada.
este mtodo no posee sobrecarga.
sintaxis:
<cadena>.Insert(<int inicio>,<string cadena>)

Profesores Adriana Gil, Pablo Linares, Jorge Romero 17 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

ejemplo:
string nombre = "curso c#";
nombre = nombre.Insert(0, "laboratorio");
nombre = nombre.Insert(11, " ");
// se asigna a nombre la cadena laboratorio curso c#
Console.WriteLine("[{0}]", nombre);
Console.ReadKey(); //pausa

Mtodo Split(): Genera una colleccin de strings a partir de separar un string en trminos, utilizando
como elemento que separa, los datos pasados por parmetro.
sintaxis:
<cadena>.Split(<parmetros>)
Ejemplo:
string nombre = "curso c#";
string[] vectorCadena;
vectorCadena = nombre.Split(' ');
//se asigno a la posicion [0]"curso" y [1]"c#"
foreach (string palabra in vectorCadena)
{
Console.WriteLine("{0}", palabra);
}
Console.ReadKey();

Mtodo string.Compare: Se utiliza con el fin de comparar cadenas e indicar cual de ellas es tomada
como la mayor de acuerdo a su contenido, de acuerdo al valor ascii que los caracteres posean.
sintaxis:
string.Compare(parmetros>)

sintaxis parmetros:

opcin 1: <string a>,<string b>: indica un 1, si el dato a es mayor que el dato b, si devuelve
un 0 (cero) es por que los datos son iguales, y en cambio si el resultado fuera -1 estar
indicando que b es mayor que a.

existen mas opciones.

ejemplo:
string nombre1 = "curso c#";
string nombre2 = "curso c#";
if (string.Compare(nombre1,nombre2)==0)
Console.WriteLine("Iguales");
else
Console.WriteLine("Distintos");
Console.ReadKey(); //pausa

Profesores Adriana Gil, Pablo Linares, Jorge Romero 18 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Definicin y usos de arrays

Los arrays son espacios de memoria en los que podemos guardar informacin. Esto suena igual que la
definicin de variables, pero a diferencia de ellas en los arrays podemos guardar informacin en
posiciones distintas, por lo que en lugar de tener un solo dato a la vez, como es el caso de las
variables, podremos almacenar varios datos dentro del mismo nombre asignado al array.

El acceso a los datos viene dado por ndices, los cuales son valores que apuntan a una celda en
particular de ese tipo de entidades de memoria.

Existe una diferencia dada por las dimensiones que puede tener un array, por lo tanto hablaremos de
vectores cuando nos estemos refiriendo a los arrays unidimensionales, mientras que las matrices
refieren a los arrays multidimensionales.

En los vectores, la informacin se dispone a manera de un listado, mientras que en las matrices la
informacin se almacena en forma de tabla, es decir que las celdas se referencian mediante filas,
columnas y, tal vez, profundidad (en las matrices tridimensionales).

Definiendo vectores y matrices

Para la declaracin de los arrays se debern tener en cuenta algunas consideraciones que se detallan a
continuacin:

1 caso: Se conoce el contenido del array, que se carga cuando este se inicializa:

No ser necesario entonces definir el tamao del array, ya que C# tomar automticamente el
tamao del contenido de inicializacin.

Ejemplo:

int[ ] Vec={1,2,3,4};// Vec es un vector de enteros con cuatro elementos

1 2 3 4
Vec[0] Vec[1] Vec[2] Vec[3]

char[,] Matr = {{ a,b,c},{ x,y,z}}; // Matr es una matriz de 6 elementos, en


dos filas y tres columnas

Matr[0,0] Matr[0,1] Matr[0,2]


a b c
x y z
Matr[1,0] Matr[1,1] Matr[1,2]

2 caso: Se conoce el tamao mximo del array, aunque no su contenido:

Se deber crear un nuevo objeto del tipo determinado, indicando el tamao.


C# inicializa todos sus elementos en 0 (cero).

Profesores Adriana Gil, Pablo Linares, Jorge Romero 19 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Ejemplo:

int[] Vec= new int[5]; // Vector de enteros de 5 posiciones

0 0 0 0 0
Vec[0] Vec[1] Vec[2] Vec[3] Vec[4]

float[,] Matr= new float[3,4]; // Matrices de 12 elementos de 3 filas y 4 columnas.

Recorriendo los Array


En los dos primeros casos, recorrer el vector podr hacerse de la forma que conocemos, es decir,
usando for como ya fue explicado
Veamos que, aunque podemos usar el
nmero del tamao del vector para
controlar el for, es ms conveniente
int[ ] vec ={ 1, 3, 5, 7, 9 }; utilizar la propiedad correspondiente

for (int i = 0; i < vec.Length; i++)


{
// Cdigo que afecta a cada elemento del vector, vec[i];
}

Un caso a destacar es la posibilidad que nos ofrece esta estructura de control (for) para recorrer
simultneamente dos vectores con ndices distintos. Por ejemplo, si queremos obtener un vector que
tenga los mismos elementos que otro, pero en orden inverso, podramos escribir:

int[ ] v = new int[5];


int[ ] vec ={ 1, 3, 5, 7, 9 };
for (int i = 0, j=4; i < vec.Length; i++, j--)
{
v[j] = vec[i]; En este caso es indistinto controlar el
} for con esta propiedad que con
;j>=0;
ya que ambas significan la misma
cantidad de iteraciones

Profesores Adriana Gil, Pablo Linares, Jorge Romero 20 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

EXCEPCIONES

Concepto de excepcin:

Las excepciones son el mecanismo recomendado en la plataforma .NET para trabajar sobre los
errores que se produzcan durante la ejecucin de las aplicaciones (divisiones por cero, lectura de
archivos no disponibles, etc.)
using System;
using System.Collections.Generic;
using System.Text;

namespace primera
{
class Program
{
static void Main(string[] args)
{
int a,b,c,resultado;
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
c = int.Parse(Console.ReadLine());
try
{
resultado = 2 / a;
}
catch
{
Console.WriteLine("error no puede ser un valor 0 la variable a");
}

Console.ReadKey();
}
}
}
Creacin de METODOS:
Ejemplo de ejercicio sin la utilizacin de mtodos
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a,b;
Console.Clear();

Console.WriteLine("Ingrese un valor..");
a = int.Parse(Console.ReadLine());
Console.WriteLine("Ingrese un valor..");
b = int.Parse(Console.ReadLine());
int sumar = a + b;
Console.WriteLine("El resultado de la suma es..{0}", sumar);

Console.ReadKey();
}
}
}

Profesores Adriana Gil, Pablo Linares, Jorge Romero 21 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

El mismo ejemplo que el anterior pero usando mtodos

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a,b;
Borrar();
Ingreso(a,b);
int sumar = Hallar_Suma(a, b);
Mostrar_Resultado(sumar);
Console.ReadKey();
}

private static void Mostrar_Resultado(int sumar)


{
Console.WriteLine("El resultado de la suma es..{0}", sumar);
}

private static int Hallar_Suma(int a, int b)


{
int sumar = a + b;
return sumar;
}

private static void Ingreso(int a,int b)


{
Console.WriteLine("Ingrese un valor..");
a = int.Parse(Console.ReadLine());
Console.WriteLine("Ingrese un valor..");
b = int.Parse(Console.ReadLine());
}

private static void Borrar()


{
Console.Clear();
}
} //cierra clase program
} //cierra namespace

Profesores Adriana Gil, Pablo Linares, Jorge Romero 22 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Ejercitacin
Estructura de decisin
1 - Ingresar dos nmeros e informar cual es: a) mayor b) Menor.
2 - Ingresar 4 nmeros e informar si corresponde a alguna de las siguientes situaciones:

a) Son los cuatro valores iguales.


b) El segundo valor es el menor.
c) Son todos distintos.
f) Los dos valores del medio son iguales.
d) El primero es el mayor que los otros tres.
e) El ltimo es el mayor de los cuatro.

3 - Escribir un programa que calcule la raz cuadrada y el inverso multiplicativo de un nmero


ingresado por teclado. Antes de calcular la raz, se debe verificar que el nmero sea no negativo, y
para el inverso, que no sea cero.
Escriba un programa que calcule las races reales de un polinomio de segundo grado con
coeficientes a, b y c.

( x=(- b (b2-4*a*c)) / (2*a)).

CICLOS
4 Dado un conjunto de valores finalizado con un valor nulo, desarrollar el programa que determine e
imprima (si hubo valores).
a) Valor mximo negativo.
b) Valor mnimo positivo.
c) Hallar el valor menor dentro del rango -17 a 26.

5 - Hacer un programa que calcule el factorial de un nmero. En un men el usuario debe decidir si
usa las sentencias While , Do.. While For. (El men debe llamar a las distintas funciones).

6- Escriba un programa que segn se indique mediante un men apropiado, calcule y emita:
- Suma
- Promedio
- Rango (mximo mnimo)

CADENAS
7 Ingresar una frase e informar si es palndromo.
8 - Realizar un programa que ingresando la fecha en el siguiente formato 24/10/2010 debe mostrar
lo siguiente: veinticuatro de octubre de 2010.
9 - Hacer un programa que cuente los blancos de una frase dada, y que diga cuantas vocales tiene.
10 - Hacer un programa que intercale una frase en otra, a partir de la posicin que indique el usuario.
11 - Hacer un programa que cuente cuntas palabras de 4 letras tiene una frase ingresada por teclado.
12 - Implementar una funcin que devolver un dato de tipo cadena que corresponder con las siglas
de la cadena que toma como argumento. Las siglas estarn formadas por las letras en maysculas de
todas las palabras, separadas por un punto
Ejemplo: Introduzca frase: tren articulado ligero (devolver: T . A . L .)
13 Dadas 2 fechas en el siguiente formato dd/mm/aaaa, decir cual es la mas lejana al dia de hoy.
Profesores Adriana Gil, Pablo Linares, Jorge Romero 23 de 45
Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

14 - Ingresar una fecha en el formato 24/10/2010, con dicha fecha se debe informar en una clase
llamada HALLAR, si esa fecha ingresada es valida o no, la confirmacin o no de ser una fecha valuida
tiene que ser atravez de un devolucion de un dato booleano.

Vectores
15 - Emitir el valor mnimo y la cantidad de veces que se repiti y en qu posiciones.
16 - Obtener la suma y el promedio de los elementos de una matriz de 3 x 4.
17- Hacer un algoritmo que llene una matriz cuadrada con nmeros aleatorios y determine las
posiciones [fila][columna] del nmero mayor almacenado en la matriz.
18- Cargar un vector de 20 elementos con un numero random entre 50 y 100, de forma que no
contenga elementos repetidos. Mostrar el vector resultante y ordenarlo segn el criterio que indique el
usuario.
Mostrar el vector ordenado.
19 Cargar un vector con los nmeros aleatorios, indicar si esta ordenado, si no esta ordenarlo segn
criterio del usuario. Mostrar el vector ordenado sin perder el contenido anterior.
20 Cargar un vector en forma aleatoria entre un rango de 20 a 40(la dimensin la indica el usuario).
A partir de ese vector generar otro que no contenga repetidos. Comparar ambos vectores e indicar si
son iguales.

21 - La buena balancita o la balacerita

Estamos trabajando en un mercado de oro en el medio del Transvaal, con todos los peligros que esta
actividad acarrea. Nuestra tarea es la de recibir bolsitas de oro, y determinar con una balancita de dos
platillos si no existe alguna trampa en el intercambio (que llevara a una balacera imparable). El tema
es as: me entregan de a 4 bolsitas, y tengo que ver si existe alguna distribucin de esas 4 bolistas en
los platillos que equilibre la balancita. Por ejemplo:
Me entregan 4 bolsitas con los siguientes pesos (en gramos): 12 36 18 6. Puedo poner en una
balancita las bolsitas de 12, 18 y 6 gramos (36 gramos en total) y en el otro platillo la bolsita de 36
gramos, y la balancita quedar equilibrada. Si las bolsitas pesan: 10 20 5 30 no tengo distribucin
posible.
Escriba un programa que lea la entrada y produzca la salida indicada a continuacin:

ENTRADA (por teclado)


NMOP

Que son los 4 nmeros separados cada uno por un espacio, finalizando con enter. (Cada nmero
estar entre 1 y 1000).
SALIDA (por pantalla)
Si hay solucin posible, en una lnea uno de los grupos de bolsitas, y en la lnea siguiente el otro (no
importa cul de los dos grupos aparece primero).
Si no hay solucin, el cartel NO HAY SOLUCION.

Ejemplos:
Ejemplo 1 Ejemplo 2 Ejemplo 3 Ejemplo 4
Entrada 12 36 18 6 10 20 30 40 5 2 999 996 6 10 12 3
Salida 12 18 6 10 40 999 2 No hay solucin
36 20 30 996 5

Profesores Adriana Gil, Pablo Linares, Jorge Romero 24 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Matrices
22 - Cargar una matriz con 25 valores al azar y generar dos vectores que son las suma por fila y por
columna.
23 - Dada una matriz cuadrada de m x n, obtener el par formado por la suma de los elementos de
cada diagonal.
24 Cargar una matriz cuadrada con ceros y unos (0 y 1), cada fila representa un nmero binario,
pasar a un vector llamado VectorDec, donde corresponde al nmero decimal de cada fila de la matriz.
25 Cargar una matriz cuadrada, segn la dimensin que indique el usuario (no superior a 25), con &
en los bordes, $ en las diagonales y % en las restantes. Mostrar por pantalla la matriz resultante.
26 Cargar y mostrar una matriz cuadrada, cuya dimensin se le pide al usuario y no puede ser
mayor a 30, de la siguiente forma: la matriz secundaria con 0, todas las posiciones que quedan debajo
con -1 y las que quedan por encima con 1.

27 - Descripcin del juego

Como es conocido, el juego del ahorcado consiste en que la maquina piensa o elige una palabra y
mantiene oculta, dando como informacin inicial el nmero de letras y el contrincante intenta
descubrirla letra a letra hasta que se acierten todas las letras o hasta un nmero de intentos fallidos
determinado.

Enunciado

Realizar un programa en C#, que permita leer de un vector todas las palabras a adivinar (mnimo 30
palabras).

Cada vez que el contrincante de una letra puede suceder uno de los siguientes casos:

A - Que se encuentre en la palabra oculta. Entonces se muestra la palabra con todas las letras ya
acertadas y colocadas en su lugar correspondiente, el resto de letras se mantienen ocultas mostrando
en su lugar *.
B - Si la letra no est en la palabra oculta se muestra un poco ms de la figura del ahorcado y de
nuevo la palabra con las letras acertadas previamente y *.
El juego finaliza cuando el contrincante descubre todas las letras de la palabra oculta o se muestra
completa la figura del ahorcado.

La figura del ahorcado consta de:

Cabeza
Tronco
Pierna izquierda
Pierna derecha
Brazo derecho
Brazo izquierdo

28 - TRABAJO FINALTATETI

Escribir un programa que permita a una persona jugar a las tres en lnea (TA-TE-TI) con la
computadora. Escribir el programa de forma que la computadora pueda ser tanto el primero como el

segundo jugador. Si la computadora es el primer jugador, el primer movimiento se generar al azar y


el resto mediante una estrategia tiene que jugar a ganarle a la persona y tapando las jugadas posibles
que realice la persona. Mostrar el estado del juego tras cada movimiento. La computadora debe avisar
cuando gana cada jugador, y al final de la sesin de juego, si ha ganado la computadora o la persona.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 25 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

APLICACION WINDOWS

VS.NET simplifica el desarrollo de aplicaciones basadas en .NET proporcionando un entorno de


desarrollo simple y unificado el cual posee las siguientes caractersticas:

Un solo IDE (Integrated Development Environment)


Soporte para varios lenguajes .NET (VB.NET, C#,...)
Desarrollo de mltiples tipos de proyectos
Explorador Web integrado (basado en IE)
Interfase personalizable
Posee varias utilidades adicionales: Acceso a datos SQL Server, Depurador, Emuladores para mviles,
etc.

Al iniciar el entorno de desarrollo de Visual Studio 2005 se encontrarn con un pantalla principal en la
se dispone de las opciones relacionadas a la creacin o edicin de proyectos.

Figura 01

En dicha pantalla se podr elegir el abrir un proyecto o sitio web, o crear alguno de ellos. En VS2005
las aplicaciones windows o web se desarrollan dentro del marco de las soluciones(Figura 01).

A los efectos del presente apunte se detallarn los pasos para la creacin de una nueva aplicacin
Windows Forms, pero los mismos son similares para las restantes opciones.
Al crear un nuevo proyecto Windows se desplegar la siguiente ventana:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 26 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Figura 02

En Name se especificar el nombre de la nueva aplicacin, en Location se elegir la carpeta


destino de la misma (el botn browse nos permitir realizar la presente operacin mas fcilmente), no
obstante si tildamos el check Create Directory For Solution, el IDE se encargar de generar una
carpeta con el nombre especificado en Name (recomiendo esta prctica por sobre las dems).
En la ventana templates podremos seleccionar el tipo de aplicacin a desarrollar. Por el momento
usaremos Windows Application.
Asimismo podemos elegir en esta ventana el lenguaje a utilizar (en nuestro caso ser C#, por lo que
en la figura ejemplo dejaremos todo como esta en la ventana titulada como Project types(Figura 02).

Luego de presionar OK en la ventana anterior, se acceder al entorno de desarrollo propiamente


dicho, el cual se visualizar (de no mediar cambios en la configuracin) del siguiente modo:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 27 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Figura 03

Sobre el margen izquierdo se distingue el cuadro de herramientas o toolbox el cual permitir


seleccionar los diferentes controles a pegar en el formulario, los cuales se programarn con las
caractersticas necesarias para la aplicacin(Figura 03).

A lo largo del presente ao iremos utilizando los principales controles, por lo que se ampliar con
mayor detalle este tema.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 28 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

En la zona central de la Figura 09 se aprecia el formulario de la aplicacin, que es la parte principal de


la interfase cliente que poseer la aplicacin; es decir que el formulario es quien al ejecutar la
aplicacin terminada comunicara a las tareas de la misma con el usuario.

Finalmente sobre el margen derecho disponemos de dos ventanas mas, una titulada como Explorador
de soluciones y la que se encuentra debajo de esta, llamada como ventana de Propiedades(Figura 04).

Figura 04

El explorador de soluciones nos permite ubicarnos fcilmente en cada uno de los componentes de la
solucin y la ventana de propiedades nos indica las caractersticas actuales de un formulario o control,
para su visualizacin y/o modificacin.

COMENZADO A GENERAR UNA INTERFAZ

Si volvemos sobre la figura 03, en donde observamos todo el IDE completo, veremos, en el centro, un
rea blanca que posee un formulario en su esquina superior izquierda.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 29 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Dicho formulario es donde, en el mbito de WindowsForms, desarrollaremos la interfase que


comunicar nuestra aplicacin con el usuario, utilizando para dicho fin los controles que se nos ofrecen
en el cuadro de herramientas.
No nos detendremos en describir todos y cada uno de los controles, ya que lo consideramos tedioso e
innecesario; si, en cambio, explicaremos el concepto de cmo se trabaja en este tema y algunos
controles que consideramos bsicos.

Puntos a tener en cuenta:

Ubicar un control en el formulario: Es muy sencillo, tanto como arrastrar el icono, del control elegido,
desde la barra de controles hasta el formulario. Otro modo es hacer doble clic sobre el cono deseado,
con lo que automticamente se pegara el control en el formulario.

Propiedades de los controles (se aplica a los formularios): Las propiedades (tambin llamadas
atributos) permiten personalizar el control utilizado. Dichas propiedades pueden ser accedidas desde la
ventana correspondiente en el IDE (ver figura 11), o mediante cdigo a travs de la siguiente sintaxis:

<nombre>.<propiedad>=<dato>;

Los mtodos: Son los procedimientos que posee un control para realizar algn topo de operacin. Se
accede a ellos mediante la sintaxis:

<nombre>.<mtodo>();

Los eventos: Son el nexo entre una accin (muchas veces ocasionada por el usuario) y la ejecucin de
tareas para atender a la misma. De este modo podremos hacer que se ejecute un cdigo especifico
para el hecho de pulsa un botn, o el escribir un texto, etc. Los eventos se encuentran en cada control
y si bien la mayora son de aplicacin indistinta del control, existen eventos que son propios del control
utilizado. Antes de continuar es bueno observar que los eventos tienen el formato en su sintaxis que
indica que se trata de un procedimiento o subprograma, por lo que a continuacin se explica que son
los procedimientos y como funcionan.

Procedimientos y funciones:

Estas estructuras se utilizan para evitar la escritura repetida en un cdigo, esto quiere decir que el
cdigo inserto en ellas se utilizar cada vez que sean invocadas mediante el nombre que el
desarrollador les haya dado. La diferencia entre el concepto de procedimiento y el de funcin radica en
que las funciones devuelven por si mismas un resultado, mientras que el procedimiento no lo hace.

Sintaxis Procedimiento:

<mbito> void <nombre>([parmetros>])


{

Sintaxis Funcin:

<mbito> <tipo> <nombre>([parmetros>])


{
return <valor>;
}

Profesores Adriana Gil, Pablo Linares, Jorge Romero 30 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Explicacin de la sintaxis:

<mbito> : Indica el alcance de la ejecucin, por el momento utilizaremos la palabra private.


Oportunamente profundizaremos sobre este tema.
void en el procedimiento y <tipo> en la funcin: Como el procedimiento no devuelve un resultado es
que se le indica void, lo cual significa vaco. Mientras que para la funcin debemos indicar un tipo de
dato (se ver ms en detalle en el captulo siguiente)
<nombre>: Indica cual es el nombre que le daremos al procedimiento o funcin.
<parmetros>: Son opcionales y permiten el ingreso de informacin al procedimiento o a la funcin.
<return> (funciones): Se utiliza para determinar el valor de retorno o respuesta de que dispondr una
funcin; dato que deber respetar el <tipo> que se ha especificado en la declaracin de la funcin.

Procedimientos eventuales:

Los procedimientos por evento son aquellos que se ejecutan en relacin a una accin que
desencadena el evento del procedimiento. La sintaxis que utilizan los eventos es la que se detalla a
continuacin:

<mbito> void <nombre del control>_<Evento>(<parmetros>)


{

Notese que la diferencia con el procedimiento normal se basa en que se escribe el nombre del control y
seguido de un guin bajo el nombre del evento. Por lo general no nos tomaremos el trabajo de
escribirlo, sino que pulsaremos doble click sobre el control a trabajar y automticamente aparecer el
procedimiento en el IDE.

Desarrollando nuestra primera interfase:

Un buen ejemplo sera el de armar un sencillo cliente que permita ingresar un nombre, agregarle la
cadena hola y concatenar el nombre a continuacin:

Pasos:

Buscar un control de tipo textbox y pegarlo en el formulario.

Buscar un control de tipo button y luego de pegarlo en el formulario, realizar doble clic sobre el mismo,
con lo que obtendremos el siguiente resultado:

private void button1_Click_1(object sender, EventArgs e)


{

Finalmente ubicar el cono que representa al control label y hacer lo mismo que en la primera tarea.

Debi, entonces, quedar confeccionado un formulario que posee una casilla para ingresar el texto
(nombre en este caso) llamada textbox1, un botn llamado button1 que el usuario accionar para
aceptar el ingreso, y finalmente un control de etiqueta llamado label1 donde se visualizar el mensaje
final de la aplicacin.

Luego debemos simplemente cambiar algunas propiedades de los controles con el fin de lograr una
interfase bien terminada, para ello desde la ventana de propiedades realizar las siguientes
operaciones:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 31 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Borrar el contenido de las propiedades Text de los controles TextBox1 y Label1


Cambiar el contenido de la propiedad Text del control Button1 por Aceptar

Si hemos seguido correctamente los pasos precedentes debemos poder visualizar un formulario como
el siguiente:

Figura 12

Ahora habr que hacer doble clic en el botn y escribir dentro del procedimiento eventual, el siguiente
cdigo:

label1.Text = "Hola! " + textBox1.Text;

Con lo que quedara el cdigo siguiente:

private void button1_Click_1(object sender, EventArgs e)


{
label1.Text = "Hola! " + textBox1.Text;

// Este procedimiento se ejecutar toda vez que el usuario


// presione el botn de aceptar!!!!
}

Existen muchos otros controles; los hay para el ingreso y visualizacin de fechas, de chequeo, de
opcin, para la visualizacin de imgenes, etc, etc, etc.
Muchos se explicarn en clase, pero nos ser de mucho agrado el ver que uds. poseen la proactividad
necesaria para investigar los que queden fuera de las clases de que disponemos.

COMENZANDO A DESARROLLAR

Como en la mayora de los lenguajes visuales, podemos desarrollar la interfaz del usuario sin tener
que tipear cdigo, valindonos para ello de herramientas grficas. La programacin en Visual C#, a
diferencia de otros lenguajes, no es solamente lineal sino que es adems por eventos. Qu significa
esto?. Simplemente que mientras en Turbo Pascal o Turbo C++ el compilador lea lnea por lnea desde
el principio hasta el final del cdigo, terminando por lo general en ese momento la ejecucin, el Visual
C# lee procedimientos de cdigo ante determinadas acciones del usuario (eventos que suceden
durante la ejecucin del programa), como por ejemplo la simple pulsacin de un botn o la eleccin de
una opcin entre varias otras que el programa ofrezca.

Veamos un clarificador ejemplo en el que muestro un sencillo programa en Turbo C++ y su


equivalente en Visual C#:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 32 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

/* Ejemplo 1 en Turbo C*/

#include<stdio.h>

void main(void)
{

printf(Este es el primer programa);


}

... y a continuacin un equivalente posible en Visual C#:

private void button1_Click(object sender, EventArgs e)


{
MessageBox.Show("Este es el primer programa");
}

La pregunta obvia que surge de esto es y cul es la diferencia entre ejecucin lineal y
eventual?.

Bien, con ustedes la respuesta : los dos programas emiten un mensaje (Este es el primer programa)
slo que lo hace en momentos bien diferentes, cuando en C++ ejecuten este programa el mensaje en
cuestin se muestra de inmediato.
En cambio en Visual C# se espera el evento Click() del control button1 para mostrar el
mensaje.

Esto no es ms que la pulsacin (Click) de un botn llamado button1 que se cre con la barra de
herramientas que posee el Visual y que se situ en el Formulario.

Veamos los pasos que llev el desarrollo: Primeramente se ubic en el formulario un control llamado
button1. Esto es un botn clsico de los que se utilizan a menudo en Windows, luego se efectu un
doble click sobre el botn button1 con lo que el IDE pasa a la ventana de codificacin, en lugar de
seguir mostrando el formulario. Nos ubicar entonces dentro del procedimiento eventual Click del
control Button1.

Luego, al ejecutar (pulsar F5) la aplicacin, el formulario se quedar esperando a que


suceda un evento. En este caso el nico evento que hemos programado es click del
control button1, pero como se imaginarn existen muchos otros tipos de eventos y
controles.

Al pulsar el botn el usuario de la aplicacin, estar entonces haciendo que se ejecute


el cdigo encerrado entre las llaves del Private Sub Button1_Click.

A esto es lo que se le ha llamado programacin por eventos, este tipo de codificacin brinda una
mayor flexibilidad que la forma tradicional, ya que programamos para las acciones que el usuario
realice.

No obstante C# no es solamente un modelo eventual de programacin ya que adems se encuentra


orientado a objetos y es tambin un lenguaje fuertemente tipado, aunque dichos conceptos sern
tratados en captulos ms avanzados del presente manual.

Como Genera una clase en C#

Pasaremos a desarrollar un paso a paso de cmo crear una clase.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 33 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

- Realizamos click sobre nuevo.


- Le damos un nombre al proyecto(CreacionDeClase).
- Le damos una ubicacin(4to).

- Colocamos ACEPTAR y genera nuestra solucin.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 34 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

- Colocamos un button1 (cambiamos la propiedad Text y le colocamos ACEPTAR), textbox1,


label1(cambiamos propiedad Text le borramos u contenido).
- Doble click sobre button1 donde empezaremos a escribir nuestro cdigo.

- Vamos ahora a agregar el formulario de clase, hacemos ARCHIVO-AGREGAR - NUEVO


PROYECTO.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 35 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

- Elijo Biblioteca de Clase.

- Le doy un nombre a esa clase si quiero, en este caso de vamos dar el nombre AVERIGUACION.

- Se agrego la biblioteca de clase llamada AVERIGUACION.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 36 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

- Dentro de public class class1, vamos a escribir el mtodo que nos de l resultado solicitado.

- Adaptamos que problema que tenamos hecho para que nos funcione la validacin que la va a
generar la clase AVERIGUACION.
- Referenciamos el formulario con la clase, nos paramos sobre CreacionDeClase, Boton derecho
de mouse, agregar referencia, en las solapas de la ventana que nos apareci, presionamos
sobre la solapa Proyectos, y vemos dentro de dicha solapa nuestra clase llamada
AVERIGUACION, la marcamos y presionamos Aceptar.

Profesores Adriana Gil, Pablo Linares, Jorge Romero 37 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

- Colocamos en el nombre de la clase en el sector using AVERIGUACION.


- Instancio para poder visualizar los mtodos de la clase AVERIGUACION
Class1 Valida=new Class1();

- Ejecutamos nuestra aplicacin, visualizamos que funciona y nos devuelve la clase TRUE o FALSE
segn el cdigo solicitado.

Utilizacin de los datos tipo de fecha

CLASE DateTime

Dejando para lo ltimo de este tema, tenemos algo muy importante La clase DateTime, la cual
permite el manejo integro de los datos del tipo Fecha; datos que poseen ciertas particularidades que
los alejan de los dems.
Profesores Adriana Gil, Pablo Linares, Jorge Romero 38 de 45
Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Primeramente la clase se encarga de las validaciones y el control de fechas correctas, es decir que no
podremos especificar un valor para da, por ejemplo, que sea igual a 51 o un mes mayor a 12,
ahorrando mucho tiempo en validaciones y por supuesto favoreciendo a la integridad de la
informacin.

Del mismo modo, tambin, controla que por ejemplo no pongamos un da mayor a la capacidad del
mes, o si intentamos especificar da 29 para un febrero no bisiesto, entre otras muchas utilidades y
facilidades que nos brinda la clase.

Para poder utilizar todo lo antedicho (y mas!) debemos generar una instancia de la clase (un objeto
fecha) de acuerdo a lo descripto en lo que sigue:

Sintaxis:

DateTime <Nombre>=new DateTime(<Parmetros>)

Sintaxis Parmetros:

Opcin 1: <Sin Parametros>: Indica que se genera una instancia de la clase, la cual an no posee otra
cosa que null.
Opcin 4: <int year, int month, int day>: Carga en la declaracin una fecha especificada en el orden
ao, mes y da.
Opcin 6: <int year, int month, int day, int hour, int minutes, int seconds>: Muy similar al caso
anterior, salvo que se le especifican adems la hora, los minutos y los segundos.

Obviamente existen mas opciones de sobrecarga, ya que en este caso asciende a la cantidad de 12.

Ejemplo:

DateTime Fecha = new DateTime(1977, 5, 21);


// Fecha posee el date igual al 21 de mayo de 1977

La clase ademas posee una serie de mtodos con los que se podrn realizar distintas operaciones
sobre fechas.

Mtodo AddDays(<double N>): Permite mediante un double especificar un incremento de N dias en


la fecha contenida en el objeto. Si se especifica un nmero negativo se restarn los das especificados.
Del mismo modo se dispone de los mtodos AddMonth(), AddMonths(), AddYears(), AddMinutes(),
etc

Ejemplo:

DateTime Fecha = new DateTime(1977, 5, 21);


// Se define la fecha 21/05/1977

Fecha = Fecha.AddDays(-10);
// Ahora la fecha se atrasa 10 das

MessageBox.Show(Fecha.ToString ());
// Se visualiza 11/05/1977

Profesores Adriana Gil, Pablo Linares, Jorge Romero 39 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Propiedad DaysInMonth(int Ao, int Mes): Devuelve un int con la cantidad de das que posee el mes
especificado.

Ejemplo:

int dias = DateTime.DaysInMonth(2008, 2);


label1.Text = dias.ToString();

// Muestra 29

Propiedades Now y Today: Devuelven un DateTime con el momento actual (Now) o con el da actual
(Today).

Ejemplo:

DateTime Ahora = DateTime.Now;


// Carga en Ahora la fecha y hora actual

DateTime Hoy = DateTime.Today;


// Carga en Ahora la fecha actual, a las 00:00 hs.
// Notese que por tratarse de propiedades y no tener parametros
// no se utilizan parentesis.

CONVERSIONES DE FORMATOS

En el presente apartado trataremos lo inherente a conversiones de datos y asimismo aspectos


relativos a otros tipos de datos que no son de formato string o su relacionado char. Es aqu donde
podremos observar manejo de numricos y fechas, como as tambin el cambiar los tipos de datos de
la informacin.

Las conversiones nos permiten que una expresin de un tipo sea tratada como una expresin de otro
tipo, dichas conversiones pueden ser implcitas o explcitas, por ejemplo la conversin de un tipo int a
long es implcita, sin embargo la conversin de un tipo long a un tipo int es explcita, esto debido a que
un int puede ser expresado en formato long sin que haya perdida de precisin en la operacin, sin
embargo si intentamos convertir un numero long a int puede haber perdida de precisin y se necesita
una conversin explcita, es como una forma de obligarnos a demostrar que estamos conscientes de
que existe tal perdida de precisin y en verdad es muy til.

Mtodo Parse:

Parse posee la capacidad de convertir datos desde un string a un tipo numrico. Las conversiones
sern realizadas a travs del tipo que se necesita (int,double, long, etc)

Sintaxis:

Sobrecarga 1: <tipo>.Parse(<string>)

Dada la magnitud de operaciones posibles, se darn una serie de ejemplos orientativos ya que
creemos que no tiene mucho sentido explayarse durante varias pginas con conceptos tales como
int32.Parse convierte un string a formato integer de 32 bytes. De todas formas, en cada ejemplo se
detalla que es lo que se hace en cada uno:

Profesores Adriana Gil, Pablo Linares, Jorge Romero 40 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Ejemplos:

string b = "2";
// Se define la variable b con contenido 2

string c = "3";
// Se define la variable c con contenido 3

MessageBox.Show((int.Parse (c) +int.Parse(b)).ToString());


// Se muestra como resultado el nmero 5

Como vemos se parsearon las dos variables que originariamente eran string. Si no hubieramos
efectuado la presente conversin, todo habra sido tratado como cadena, con lo que el resultado final
habra sido 32.

Ahora bien, qu hubiera sucedido si definamos, por decir algo, la variable c con un valor igual a
2.5? Sencillamente nos generara un error ya que el tipo int no soporta datos nmeros con decimales
(es en parte lo que se menciona en el recuadro superior cuando habla de conversiones implcitas y
explcitas).
En tal caso hubiera sido necesario algo como lo que sigue:

string b = "2,5";

string c = "2,2";

MessageBox.Show((double.Parse(c) + double.Parse(b)).ToString());

// Se muestra como resultado el nmero 4,7

Operador Cast

Se puede forzar un dato, variable o una expresin a convertirse o cambiarse a un nuevo tipo de dato.
El operador cast realiza este proceso entre numricos.

Sintaxis:

(tipo)<dato>

Ejemplo:
double a = 101.90;
// Se declara a con el tipo double y el valor 101.90

int b = (int)a;
// Se castea b al tipo int, con lo que se
// fuerza el dato y pierde los decimales

MessageBox.Show(b.ToString());
// Al mostrar b se comprueba que su valor es 101

En el ejemplo que precede se ve claramente una conversin de tipo explcita.

int b = 101;
// Se declara a con el tipo double y el valor 101
double a = (double)b;
// Se castea a al tipo double

Profesores Adriana Gil, Pablo Linares, Jorge Romero 41 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

En el nuevo caso se genera un casteo que pasa un valor int a double, a diferencia del primer caso,
aqu no era obligatorio realizar la operacin ya que el C# puede en esta ocasin realizar una
conversin de tipo implcita. A continuacin veremos como habra sido el cdigo para tal caso.

Int b = 101;
// Se declara b con el tipo double y el valor 101

double a = b;
// Se castea a al tipo double pero en esta ocasin de manera implcita

CLASE Convert

Finalmente se dispone de la clase Convert, la cual tiene mltiples posibilidades en cuanto a la


conversin de datos. Con ella se puede transformar a casi cualquier dato en cualquier tipo de
informacin.

Por el volumen de operaciones que posee, necesitaramos un captulo exclusivo para la clase, por lo
que se mostrarn ejemplos de uso con el fin de orientar sobre su uso y aprovechamiento.
En la figura 14 se aprecian en parte la cantidad de posibilidades que ofrece la clase Convert. Cada uno
de dichos mtodos poseen su propia parametrizacin y sus correspondientes sobrecargas.

Sintaxis:
Convert.<mtodo>(<parmetros>)

Ejemplos:

string a = "101.9";

double b=Convert.ToDouble(a);

MessageBox.Show(b.ToString());

Profesores Adriana Gil, Pablo Linares, Jorge Romero 42 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

Creacin de un archivo de texto

using System;
using System.Collections.Generic;
using System.Text;
using System.IO; // se agrega System.IO para la utilizacin de archivos

namespace ConsoleApplication1
{
class Program
{
const string path = "d:\\datos.txt"; //se define una constante llamada path
que va contener los datos del archivo principal
const string path2 = "d:\\datosresg.txt";

static void Main(string[] args)


{

char opc;
bool salir = false;
do
{
Console.Clear();
Console.WriteLine("1 - Ingresar");
Console.WriteLine("2 - Borrar");
Console.WriteLine("3 - Modificar");
Console.WriteLine("4 - Consultar");
Console.WriteLine("5 - Salir");
opc = char.Parse(Console.ReadLine());
salir = true;
switch (opc)
{
case '1':{Ingresar();
salir = true;
break;}
case '2':{Borrar();
salir = true;
break;}
case '3':{Modificacion();
salir = true;
break;}
case '4':{Consultar();
salir = true;
break;}
case '5':{salir = false;
break;}

}
}

while (salir == true);


Console.ReadKey();
}

public static void Ingresar()


{
string ape, nom, dom, altura, cp;
StreamWriter file = new StreamWriter(path,true);//ruta=donde lo
guardo+true=append
//abro el archivo datos.txt para escritura
Console.Write("Ingrese apellido..");
ape = (Console.ReadLine().Replace(' ','_'));
Console.Write("Ingrese nombre..");
nom = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese domicilio..");
dom = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese altura..");
altura = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese codigo postal..");
cp = (Console.ReadLine().Replace(' ', '_'));

file.WriteLine(ape + " " + nom + " " + dom + " " + altura + " " + cp); //guardo en el archivo
datos.txt
file.Close(); //cierro datos.txt

Profesores Adriana Gil, Pablo Linares, Jorge Romero 43 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I
}

public static void Borrar()


{
string[] datos;
string ape="",cadena = "";
char opc;
StreamReader file = new StreamReader(path,true); //abro el archivo para lectura
StreamWriter resguardo = new StreamWriter(path2); //crea un numero archivo
Console.Write("Ingrese el apellido a buscar..");
ape = (Console.ReadLine().Replace(' ', '_'));
do
{
cadena = file.ReadLine(); //leo una linea de datos.txt
datos = cadena.Split(' '); //guardo en un vector cortado por espacios
if (ape == datos[0])
{
Console.WriteLine("Encontrado!!!");
foreach (string variable in datos)
{
Console.WriteLine(variable.Replace('_',' '));
}
Console.WriteLine("Desea borrarlo!!(s/n)");
opc = char.Parse(Console.ReadLine().ToLower());
if (opc == 's')
{
Console.WriteLine("Eliminado!!");
}
Else
{
resguardo.WriteLine(datos[0] + " " + datos[1] + " " + datos[2] + " " + datos[3] + " " + datos[4]);
}
else
resguardo.WriteLine(datos[0] + " " + datos[1] + " " + datos[2] + " " + datos[3] + " " + datos[4]);

} while (!file.EndOfStream);
file.Close(); //cierro archivo datos.txt
resguardo.Close(); //cierro archivo resguardo.txt
File.Delete(path); //borro el arhivo datos.txt
File.Copy(path2, path); //copio el contenido de resguardo.txt en datos.txt
File.Delete(path2); //borro el archivo resguardo.txt
}

public static void Modificacion()


{
string[] datos;
string ape="", nom="", dom="", altura="", cp="",cadena="";
char opc;

StreamReader file = new StreamReader(path,true);


StreamWriter resguardo = new StreamWriter(path2); //crea un numero archivo

Console.Write("Ingrese el apellido a buscar..");


ape = (Console.ReadLine().Replace(' ', '_'));

do
{
cadena = file.ReadLine();
datos = cadena.Split(' ');

if (ape == datos[0])
{

Console.WriteLine("Encontrado!!!");
foreach (string variable in datos)
{
Console.WriteLine(variable.Replace('_',' '));
}

Console.WriteLine("Desea modificarlo!!(s/n)");
opc = char.Parse(Console.ReadLine().ToLower());

Profesores Adriana Gil, Pablo Linares, Jorge Romero 44 de 45


Escuela Tcnica N 37 D.E. 11 Hogar Naval Stella Maris
LABORATORIO I - El lenguaje de programacin C# - MODULO I

if (opc == 's')
{
Console.WriteLine("Reingrese los datos!!");
Console.Write("Ingrese apellido..");
ape = (Console.ReadLine().Replace(' ', '_'));//Reemplazo el
espacio por guion bajo
Console.Write("Ingrese nombre..");
nom = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese domicilio..");
dom = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese altura..");
altura = (Console.ReadLine().Replace(' ', '_'));
Console.Write("Ingrese codigo postal..");
cp = (Console.ReadLine().Replace(' ', '_'));

resguardo.WriteLine(ape + " " + nom + " " + dom + " " + altura + " " + cp);
} //guardo en el archivo auxiliar
else
resguardo.WriteLine(ape + " " + nom + " " + dom + " " + altura + " " + cp);
} //guardo en el archivo auxiliar
else
resguardo.WriteLine(datos[0] + " " + datos[1] + " " + datos[2] + " " + datos[3] + " "+datos[4]);
}

while (!file.EndOfStream);
file.Close();
resguardo.Close();
File.Delete(path);
File.Copy(path2, path);
File.Delete(path2);
}

public static void Consultar()


{
string ape;
string cadena = "";
string[] datos;
StreamReader file = new StreamReader(path);
Console.Write("Ingrese el apellido a buscar..");
ape = (Console.ReadLine().Replace(' ', '_'));
do
{ cadena = file.ReadLine();
datos = cadena.Split(' ');
if (ape == datos[0])
{
Console.WriteLine("Encontrado!!!");
foreach (string variable in datos)
{
Console.WriteLine(variable.Replace('_',' '));
}
}
} while (!file.EndOfStream);
file.Close();
Console.ReadKey();

}
}
}

Profesores Adriana Gil, Pablo Linares, Jorge Romero 45 de 45

Das könnte Ihnen auch gefallen