Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CSHARP Visto Desde C
CSHARP Visto Desde C
C# es un lenguaje de programacin bastante semejante en lo que a sintaxis se refiere a C++. Por otra parte, C++ puede considerarse como un superconjunto de C. En este documento analizaremos diversos ejemplos de programacin utilizados habitualmente en C, y su correspondiente codificacin en C#. Por lo tanto, este documento no pretende ser un estudio exhaustivo de los tipos de datos, estructuras de control y libreras de C#, sino una muestra de un conjunto de ejemplos de cdigo escritos en ambos lenguajes. No se trata entonces de justificar todo cuanto se escribe, con cuidado de haber dado previamente las definiciones necesarias, sino de mostrar de forma intuitiva las diferencias sintcticas de ambos lenguajes en aquellos aspectos en que nos encontramos familiarizados en C. En otras palabras, con esto se quiere justificar la posible falta de rigor expositivo. Todo lo que aqu se muestra, se muestra de forma muy simple, procurando huir de elementos muy diferenciales. La forma de proceder utilizada en C# para estos ejemplos no es la ms adecuada, sino la ms aproximada a C, sin exponer en ningn caso otras alternativas mejores disponibles. Se parte de la base de que el alumno sabe C, y este documento es una primera toma de contacto con el nuevo lenguaje partiendo de ese supuesto. Por lo tanto, si el alumno no comprende los ejemplos propuestos en C, debera repasar un poco los contenidos de las asignaturas previas. Para simplificar el cdigo al mximo y quedarnos con lo esencial en lo que a sintaxis se refiere, todos los ejemplos estn realizados en modo consola, tanto en C como en C#.
1. Hola mundo.
Hola mundo en C
#include <stdio.h> void main (int argc, char* argv[]) { printf ("Hola mundo\n"); }
Hola mundo en C#
using System; namespace Simple { class CSimple { [STAThread] static void Main(string[] args) { Console.Write ("Hola mundo\n"); } } }
El ejemplo de la izquierda muestra un tpico programa Hola mundo en C. Es necesaria la directiva #include para poder usar la librera que define la funcin printf. La funcin main recibe el nmero de argumentos pasados por la lnea de comandos, y el array de cadenas de caracteres que los contiene. El ejemplo de la derecha muestra un tpico programa Hola mundo escrito en C#. Es necesaria la lnea using System para acceder a la clase Console y al mtodo Write. La funcin Main en este caso recibe directamente un array de strings (cadenas de caracteres en C#), como en el caso anterior. El nmero de argumentos est implcito en el array de C#. En C#, adems, es necesario un espacio de nombres (namespace Simple) y una clase (class CSimple), para poder contener la funcin Main, que ser el punto de entrada del programa al ejecutarse. Desde un punto de vista prctico y, si se quiere, simplista, dentro de la clase CSimple pondremos todo lo que pondramos en el fichero fuente de C a excepcin de las directivas include y define.
printf ("Introduce tu nombre: "); scanf ("%s",Cadena); printf ("Introduce tu edad: "); scanf ("%d",&DatoEntero); printf ("Introduce el precio de una barra de pan: "); scanf ("%f",&DatoReal); printf ("Tu nombre: %s\n",Cadena); printf ("Tu edad: %d\n",DatoEntero); printf ("Barra pan: %f\n",DatoReal); } Ejemplo en C# using System; namespace Simple { class CSimple { [STAThread] static void Main(string[] args) { string Cadena; int DatoEntero; double DatoReal; Console.Write ("Introduce tu nombre: "); Cadena = Console.ReadLine(); Console.Write ("Introduce tu edad: "); DatoEntero = Convert.ToInt32 (Console.ReadLine()); Console.Write ("Introduce el precio de una barra de pan: "); DatoReal = Convert.ToDouble (Console.ReadLine ()); Console.WriteLine ("Tu nombre: " + Cadena); Console.WriteLine ("Tu edad: " + DatoEntero.ToString()); Console.WriteLine ("Barra pan: " + DatoReal.ToString("0.00")); } } } Vemos que toda la entrada por la consola se realiza a travs de la funcin ReadLine de Console. ReadLine lee hasta que llega un <CR> (ENTER) del teclado, y retorna siempre un string. Es como si utilizramos scanf (%s,Cad) siempre, y luego convirtiramos la cadena de caracteres (con las funciones atoi y atof). Las operaciones de la clase Convert permiten convertir los strings ledos por el teclado al tipo de datos deseado.
4. Operadores.
En general, los operadores de C son semejantes a los de C#. Tenemos la suma, la resta, el producto, la divisin (+, -, *, /, %), tambin operadores de comparacin (==, !=, >, ), operadores de bits, etc. La siguiente tabla resume los operadores de C#.
Categoras
Aritmticos Lgicos (booleanos y bit a bit) Concatenacin de cadenas Incremento y decremento Desplazamiento Relacionales Asignacin Acceso a miembros Indizacin Conversin de tipos explcita Condicional Concatenacin y eliminacin de delegados Creacin de objetos Informacin de tipos Control de excepciones de desbordamiento Direccionamiento indirecto y direccin
+ & + ++ << == = . [] () ?: + new is * sizeof -> [] typeof & checked unchecked ->> != += < -= > *= <= /= | * ^ / ! % ~ && ||
Operadores
false true
9. Uso de punteros.
Ya se ha comentado anteriormente que no es necesario utilizar punteros en C#. Si an as queremos seguir utilizndolos (no en esta asignatura), es necesario marcar las funciones que los usen como no seguras. Ejemplo en C# using System; namespace Simple { class CSimple { unsafe static void UnaFuncion (int* p) { *p = *p + 2; } [STAThread] unsafe static void Main(string[] args) { int Dato = 7; UnaFuncion (&Dato); Console.WriteLine (Dato); } } } Para que el ejemplo anterior funcione, se ha de compilar el proyecto con el parmetro /unsafe, estableciendo la propiedad de cdigo no seguro de la siguiente manera:
void main (int argc, char* argv[]) { Persona P; P.Edad = 39; strcpy (P.Nombre,"Ruben Hidalgo"); printf ("%d - %s\n",P.Edad,P.Nombre); } Ejemplo en C# using System; namespace Simple { class CSimple { class Persona { public string Nombre; public int Edad; } [STAThread] static void Main(string[] args) { Persona P = new Persona(); P.Edad = 39; P.Nombre = "Ruben Hidalgo"; Console.WriteLine ("{0} - {1}",P.Edad,P.Nombre); } } } En C# son preferibles las clases a las estructuras. En el ejemplo anterior vemos la declaracin de la clase Persona, semejante a la estructura equivalente de C. Los miembros de la clase deben ser pblicos (public) para que la clase sea equivalente a la estructura. Salvo en la declaracin de la variable de tipo Persona (revisar el ejemplo anterior que mostraba la declaracin de un array), el uso de una clase definida de este modo y una estructura es prcticamente el mismo.
En C, el manejo de este tipo de estructuras involucra malloc (reservar memoria), realloc (reasignar el espacio asignado), free (liberar espacio), y copias entre elementos. C# considera estas operaciones como no seguras, y ofrece tipos de datos para realizar estas tareas de forma segura. Adems, dichos tipos de datos son mucho ms fciles de utilizar. Ejemplo en C# using System; using System.Collections; namespace Simple { class CSimple { class Persona { public int Edad; public string Nombre; } static void ImprimirPersonas (ArrayList K) { Console.WriteLine ("Listado de personas:"); for (int i=0 ; i<K.Count ; i++) { Persona P = (Persona) K[i]; Console.WriteLine ("{0} - {1}",P.Edad,P.Nombre); } Console.WriteLine (); } [STAThread] static void Main(string[] args) { ArrayList K = new ArrayList (); Persona P = new Persona(); P.Edad = 15; P.Nombre = "Manolo"; K.Add (P); P = new Persona(); P.Edad = 25; P.Nombre = "Filomeno"; K.Add (P); P = new Persona(); P.Edad = 48; P.Nombre = "Martirio"; K.Add (P); ImprimirPersonas (K); K.RemoveAt (1); ImprimirPersonas (K); } } } Vemos que un objeto ArrayList tiene las operaciones necesarias para agregar y eliminar elementos, igual que el tratamiento implementado por malloc, realloc y free. Un objeto ArrayList se inicializa solo y se destruye solo. Pero esto es un tema sobre el que incidiremos profundamente cuando veamos la programacin orientada al objeto, ahora no es relevante.
Ejemplo en C# using System; using System.IO; namespace Simple { class CSimple { [STAThread] static void Main(string[] args) { StreamReader F = new StreamReader ("C:\\Texto.txt"); for (;;) { string s = F.ReadLine (); if (s == null) break; Console.WriteLine ("Linea: " + s); string[] Palabras = s.Split (' '); for (int i=0 ; i<Palabras.Length ; i++) Console.WriteLine (" " + Palabras[i]); } F.Close (); } } } El ejemplo anterior va leyendo del fichero lnea a lnea, y utiliza el mtodo Split del objeto string para separar las palabras en un nuevo array de cadenas de caracteres. La salida de este programa muestra lnea a lnea el fichero, y para cada lnea muestra las palabras, separadas unas de otras. A partir de aqu, y con las operaciones del objeto Convert (Convert.ToInt32, Convert.ToDouble, etc), se puede emular el funcionamiento de un fscanf con formato.