Professional Documents
Culture Documents
Lenguaje C#
Profesor: Integrantes:
Dionis Marcano Olivo Nisser C.I.: 11.120.546
Junio, 2009
Introducción
C#, pronunciado C Sharp, es actualmente uno de los lenguajes de programación más populares
en informática y comunicaciones. El objetivo de Microsoft, que tiene todos los derechos sobre la
plataforma de desarrollo .NET Framework SDK en la que está incluido C#, es permitir a los
programadores abordar el desarrollo de aplicaciones complejas con facilidad y rapidez. Es como si
tomáramos todas las cosas buenas de Visual Basic y las añadiéramos a C++, aunque recortando algunas
de las tradiciones más ocultas y difíciles de conocer de C y C++.
Con C# no sólo se pueden escribir programas para la Web, sino que también permite desarrollar
aplicaciones de propósito general.
El lenguaje de programación C# es simple y sencillo, fácil de entender, que ilustran los fundamentos de
la programación C#.
Este lenguaje le permitirá introducirse en la programación orientada a objetos y ademas le enseñará a
trabajar con estructuras de datos y ficheros, así como a manipular excepcionespara así introducirlo en el
desarrollo de aplicaciones.
Lenguaje C#:
Características de C#
Con la idea de que los programadores más experimentados puedan obtener una visión general del
lenguaje, a continuación se recoge de manera resumida las principales características de C# Alguna de
las características aquí señaladas no son exactamente propias del lenguaje sino de la plataforma .NET
en general. Sin embargo, también se comentan aquí también en tanto que tienen repercusión directa en
el lenguaje, aunque se indicará explícitamente cuáles son este tipo de características cada vez que se
toquen:
• Sencillez: C# elimina muchos elementos que otros lenguajes incluyen y que son innecesarios en
.NET. Por ejemplo:
o El tamaño de los tipos de datos básicos es fijo e independiente del compilador, sistema
operativo o máquina para quienes se compile (no como en C++), lo que facilita la
portabilidad del código.
o No se incluyen elementos poco útiles de lenguajes como C++ tales como macros,
herencia múltiple 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 años ha ido
demostrándose son muy útiles para el desarrollo de aplicaciones y que en otros lenguajes como
Java o C++ hay que simular, como un tipo básico decimal que permita realizar operaciones de
alta precisión con reales de 128 bits (muy útil en el mundo financiero), la inclusión de una
instrucción foreach que permita recorrer colecciones con facilidad y es ampliable a tipos
definidos por el usuario, la inclusión de un tipo básico string para representar cadenas o la
distinción de un tipo bool específico para representar valores lógicos.
Por otro lado y a diferencia de Java, en C# se ha optado por hacer que todos los métodos sean
por defecto sellados y que los redefinibles hayan demarcarse con el modificador virtual (como
en C++), lo que permite evitar errores derivados de redefiniciones accidentales. Además, un
efecto secundario de esto es que las llamadas a los métodos serán más eficientes por defecto
al no tenerse que buscar en la tabla de funciones virtuales la implementación de los mismos a la
que se ha de llamar. Otro efecto secundario es que permite que las llamadas a los métodos
virtuales se puedan hacer más eficientemente al contribuir a que el tamaño de dicha tabla se
reduzca.
• Seguridad de tipos: C# incluye mecanismos que permiten asegurar que los accesos a tipos de
datos siempre se realicen correctamente, lo que permite evita que se produzcan errores difíciles
de detectar por acceso a memoria no perteneciente a ningún objeto y es especialmente necesario
en un entorno gestionado por un recolector de basura. Para ello se toman medidas del tipo:
o Sólo se admiten conversiones entre tipos compatibles. Esto es, entre un tipo y
antecesores suyos, entre tipos para los que explícitamente se haya definido un operador
de conversión, y entre un tipo y un tipo hijo suyo del que un objeto del primero
almacenase una referencia del segundo (downcasting) Obviamente, lo último sólo
puede comprobarlo en tiempo de ejecución el CLR y no el compilador, por lo que en
realidad el CLR y el compilador colaboran para asegurar la corrección de las
conversiones.
o Se comprueba que todo acceso a los elementos de una tabla se realice con índices que
se encuentren dentro del rango de la misma.
o A diferencia de Java, C# incluye delegados, que son similares a los punteros a funciones
de C++ pero siguen un enfoque orientado a objetos, pueden almacenar referencias a
varios métodos simultáneamente, y se comprueba que los métodos a los que apunten
tengan parámetros y valor de retorno del tipo indicado al definirlos.
• Instrucciones seguras: Para evitar errores muy comunes, en C# se han impuesto una serie de
restricciones en el uso de las instrucciones de control más comunes. Por ejemplo, la guarda de
toda condición ha de ser una expresión condicional y no aritmética, con lo que se evitan errores
por confusión del operador de igualdad (==) con el de asignación (=); y todo caso de un switch
ha de terminar en un break o goto que indique cuál es la siguiente acción a realizar, lo que evita
la ejecución accidental de casos y facilita su reordenación.
• Sistema de tipos unificado: A diferencia de C++, en C# todos los tipos de datos que se definan
siempre derivarán, aunque sea de manera implícita, de una clase base común llamada
System.Object, por lo que dispondrán de todos los miembros definidos en ésta clase (es decir,
serán “objetos”)
• Extensibilidad de operadores: Para facilitar la legibilidad del código y conseguir que los
nuevos tipos de datos básicos que se definan a través de las estructuras estén al mismo nivel que
los básicos predefinidos en el lenguaje, al igual que C++ y a diferencia de Java, C# permite
redefinir el significado de la mayoría de los operadores -incluidos los de conversión, tanto para
conversiones implícitas como explícitas- cuando se apliquen a diferentes tipos de objetos.
Las redefiniciones de operadores se hacen de manera inteligente, de modo que a partir de una
única definición de los operadores ++ y -- el compilador puede deducir automáticamente como
ejecutarlos de manera prefijas y postifja; y definiendo operadores simples (como +), el
compilador deduce cómo aplicar suversión de asignación compuesta (+=) Además, para
asegurar la consistencia, el compilador vigila que los operadores con opuesto siempre se
redefinan por parejas (por ejemplo, si se redefine ==, también hay que redefinir !=)
• Versionable: C# incluye una política de versionado que permite crear nuevas versiones de
tipos sin temor a que la introducción de nuevos miembros provoquen errores difíciles de
detectar en tipos hijos previamente desarrollados y ya extendidos con miembros de igual
nombre a los recién introducidos.
o Se obliga a que toda redefinición deba incluir el modificador override, con lo que la
versión de la clase hija nunca sería considerada como una redefinición de la versión de
miembro en la clase padre ya que no incluiría override. Para evitar que por accidente un
programador incluya este modificador, sólo se permite incluirlo en miembros que tengan
la misma signatura que miembros marcados como redefinibles mediante el modificador
virtual. Así además 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 compilación.
Aunque es posible utilizar cualquier editor de textos ASCII para escribir aplicaciones en C#, un
entorno de desarrollo integrado (IDE) suele darnos la productividad que un desarrollador de hoy
necesita. Microsoft tiene una completa familia de ellos llamada Visual Studio. Una de esas versiones
se llama Visual Studio Express y es gratuita.
En la familia Visual Studio Express hay distintas versiones: una para C# llamada Visual C# Developer,
una para Visual Basic .Net, otra para escribir aplicaciones Web llamada Visual Web Developer.
Nosotros utilizaremos a partir de ahora lo siguiente
• Visual C# Developer
• Visual Web Developer
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
Console.WriteLine("Hola mundo!");
Console.Read();
}
}
}
Puntos de entrada
El punto de entrada de una aplicación es un método de nombre Main que contendrá el código por
donde se ha de iniciar la ejecución de la misma. Hasta ahora sólo se ha visto una versión de Main() que
no toma parámetros y tiene como tipo de retorno void, pero en realidad todas sus posibles versiones
son:
Como se ve, hay versiones de Main() que devuelven un valor de tipo int. Un int no es más que un tipo
de datos capaz de almacenar valor enteros comprendidos entre –2.1471483.648 y 2.1471483.647, y el
número devuelto por Main() sería interpretado como código de retorno de la aplicación. Éste valor
suele usarse para indicar si la aplicación a terminado con éxito (generalmente valor 0) o no (valor
según la causa de la terminación anormal)
Una vez escrito el código con algún 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 pasárselo
como parámetro al compilador así:
csc HolaMundo.cs
Tras la compilación se obtendría un ejecutable llamado HolaMundo.exe cuya ejecución produciría la
siguiente salida por la ventana de consola:
¡Hola Mundo!
Si la aplicación que se vaya a compilar no utilizase la ventana de consola para mostrar su salida sino
una interfaz gráfica de ventanas, entonces habría que compilarla pasando al compilador la opción /t
con el valor winexe antes del nombre del fichero a compilar. Si no se hiciese así se abríría la ventana de
consola cada vez que ejecutase la aplicación de ventanas, lo que suele ser indeseable en este tipo de
aplicaciones. Así, para compilar Ventanas.cs como ejecutable de ventanas sería conveniente escribir:
Como se ha repetido varias veces a lo largo del tema, la principal utilidad del preprocesador en C# es la
de permitir la compilación de código condicional, lo que consiste en sólo permitir que se compile
determinadas regiones de código fuente si las variables de preprocesado definidas cumplen alguna
condición determinada. Para conseguir esto se utiliza el siguiente juego de directivas:
Condicionales:
Las instrucciones condicionales son instrucciones que permiten ejecutar bloques de instrucciones sólo
si se da una determinada condición. En los siguientes subapartados de este epígrafe se describen cuáles
son las instrucciones condicionales disponibles en C#
if (<condición>)
<instruccionesIf>
else
<instruccionesElse>
El significado de esta instrucción es el siguiente: se evalúa la expresión <condición>, que ha de
devolver un valor lógico. Si es cierta (devuelve true) se ejecutan las <instruccionesIf>, y si es falsa
(false) se ejecutan las <instruccionesElse> La rama else es opcional, y si se omite y la condición es
falsa se seguiría ejecutando a partir de la instrucción siguiente al if. En realidad, tanto <instruccionesIf>
como <instruccionesElse> pueden ser una única instrucción o un bloque de instrucciones.
using System;
class HolaMundoIf
{
public static void Main(String[] args)
{
if (args.Length > 0)
Console.WriteLine(“Hola {0}!”, args[0]);
else
Console.WriteLine(“Hola mundo!”);
}
}
Instrucción foreach
La instrucción foreach es una variante del for pensada especialmente para compactar la escritura de
códigos donde se realice algún tratamiento a todos los elementos de una colección, que suele un uso
muy habitual de for en los lenguajes de programación que lo incluyen. La sintaxis que se sigue a la
hora de escribir esta instrucción foreach es:
El significado de esta instrucción es muy sencillo: se ejecutan <instrucciones> para cada uno de los
elementos de la <colección> indicada. <elemento> es una variable de sólo lectura de tipo
<tipoElemento> que almacenará en cada momento el elemento de la colección que se esté procesando
y que podrá ser accedida desde <instrucciones>.
Comentarios
Un comentario es texto que se incluye en el código fuente para facilitar su lectura a los programadores
y cuyo contenido es, por defecto, completamente ignorado por el compilador. Suelen usarse para incluir
información sobre el autor del código, para aclarar el significado o el porqué de determinadas secciones
de código, para describir el funcionamiento de los métodos de las clases, etc.
En C# hay dos formas de escribir comentarios. La primera consiste en encerrar todo el texto que se
desee comentar entre caracteres /* y */ siguiendo la siguiente sintaxis:
/*<texto>*/
Estos comentarios pueden abarcar tantas líneas como sea necesario. Por ejemplo:
/* Esto es un comentario
que ejemplifica cómo se escribe comentarios que ocupen varias líneas */
Definición de variables
Una variable puede verse simplemente como un hueco en el que se puede almacenar un objeto de un
determinado tipo al que se le da un cierto nombre. Para poderla utilizar sólo hay que definirla indicando
cual será su nombre y cual será el tipo de datos que podrá almacenar, lo que se hace siguiendo la
siguiente sintaxis:
<tipoVariable> <nombreVariable>;
Una variable puede ser definida dentro de una definición de clase, en cuyo caso se correspondería con
el tipo de miembro que hasta ahora hemos denominado campo. También puede definirse como un
variable local a un método, que es una variable definida dentro del código del método a la que sólo
puede accederse desde dentro de dicho código. Otra posibilidad es definirla como parámetro de un
método, que son variables que almacenan los valores de llamada al método y que, al igual que las
variables locales, sólo puede ser accedidas desde código ubicado dentro del método. El siguiente
ejemplo muestra como definir variables de todos estos casos:
class A
{
int x, z;
int y;
En este ejemplo las variables x, z e y son campos de tipo int, mientras que p es una variable local de
tipo Persona y a y b son parámetros de tipo string. Como se muestra en el ejemplo, si un método toma
varios parámetros las definiciones de éstos se separan mediante comas (carácter ,), y si queremos
definir varios campos o variables locales (no válido para parámetros) de un mismo tipo podemos
incluirlos en una misma definición incluyendo en <nombreVariable> sus nombres separados por
comas.
Conclusión
El Lenguaje C# como hemos visto tiene algunas caracteristicas muy similares a el famoso C o
C++, es por esto que se nos hace muy practico entender la estructura de codigos y las forma de las
intrucciones, sentencias y variables, ademas es una alternativa muy viable a la hora de realizar trabajos
robustos que nos brinden estabilidad y seguridad ya que este sistema es muy estable, es por esto que
dejemos esta opción abierta y claro nuestra recomendación es practivarlo para ver las bondades que
ofrece este versatil sistema de desarrollo.
Bibliografía
• “A programmer’s introduction to C#” escrito por Eric Gunnerson y publicado por Apress en 2000.
• C# and the .NET Framework”, escrito por Andrew Troelsen y publicado por Apress en 2001
• “C# Essentials”, escrito por Beb Albahari, Peter Drayton y Brand Merril y publicado por O’Reilly
en 2000.
• “C# Programming with the Public Beta”, escrito por Burton Harvey, Simon Robinson, Julian
Templeman y Karli Watson y publicado por Wrox Press en 2000.
• “Inside C#”, escrito por Tom Archer y publicado por Microsoft en 2000
• “Presenting C#”, escrito por Christoph Wille y publicado por Sams Publishing en 2000.
• “Professional C#”, escrito por Simon Robinson, Burt Harvey, Craig McQueen, Christian Nagel,
Morgan Skinner, Jay Glynn, Karli Watson, Ollie Cornes, Jerod Moemeka y publicado por Wrox
Press en 2001.
• “Programming C#”, escrito por Jesse Liberty y publicado por O’Reilly en 2001