Curso C# v1

40
Curso de iniciació n C#. Este documento pretende dar una breve introducción al mundo de la programación con C#, los conceptos aca tratados se mantienen a lo largo de la programación. En documentos posteriores se profundizara en otros términos y aplicaciones. Fase de Introduccion

description

curso C#

Transcript of Curso C# v1

Curso de iniciacin C#.

Curso de iniciacin C#.22 de noviembre2010Este documento pretende dar una breve introduccin al mundo de la programacin con C#, los conceptos aca tratados se mantienen a lo largo de la programacin. En documentos posteriores se profundizara en otros trminos y aplicaciones.Fase de Introduccion

Contenido1.Conceptos basicos42.Qu es la plataforma .NET?43.Componentes de la plataforma .NET44.El Common Language Runtime5Estructura de un Programa C#5Estructura de un Programa en C#7Mtodo Principal Main7Tipos Predefinidos8Common Type System8Declaracin de Variables9+ Declaracin Sencilla9+ Declaracin Multiple9Instrucciones Condicionales9Instrucciones de Iteracin10Instruccin WHILE10Instruccin DO-WHILE11Instruccin FOR11Operaciones bsicas de entrada/salida11Conversin de Tipos de Datos en C#12Operadores "checked" y "unchecked"13Estructuras de Datos13Enmerados14Arreglos15Mtodos15Manejo de Excepciones17Clases18Objetos19Encapsulacin21Creacin de una Clase Sencilla21Miembros estticos versus instancias22Alcance25Reglas26Recomendaciones26Constructores y Destructores26Destructores y Terminadores28Finalizacin28Destructores28

1. Conceptos basicos

2. Qu es la plataforma .NET?Es la Base de la nueva generacion de software en la cual los Servicios Web son un medio que permitira a distintas tecnologias interoperar entre si, asi como conectar diversos sistemas operativos, dispositivos, informacion y usuarios dando a los desarrolladores las herramientas y tecnologias necesarias para desarrollar soluciones de negocios de manera rapida sin importar que involucren diversos medios y tecnologias. En la plataforma .NET el software es mas concretamente de servicio y se aboca a construir, instalar, consumir, integrar o agregar de manera federada servicios que pueden ser accedidos mediante Internet, la idea central es que un usuario de Internet con un explorador pueda acceder a contenidos, no solo en forma de texto, imagenes o sonido, sino tambien pueda hacer uso de Servicios Web, los cuales se utilizan como bloques de construccion en este nuevo modelo de computacion distribuida en internet. El punto central es que los usuarios deben poder acceder a la funcionalidad que los servicios Web Proveen desde cualquier dispositivo, sistema operativo y ubicacion geografica.3. Componentes de la plataforma .NETEstamos en el umbral de una nueva era de Internet, el Internet "inteligente" que permite que los servicios sean ejecutados e invocados desde cualquier dispositivo y sistema operativo, para su acceso mediante Internet, asi mismo los sitios podran comunicarse entre si y acceder a servicios y contenidos sin necesidad de intervencion humana. Es por eso que la plataforma .NET no es un producto, sino un conjunto de ellos que de manera conjunta proporcionan una solucion al problema, sus componentes principales son: Clientes Inteligentes: Son dispositivos muy variados. Lo que los hace inteligentes es su capacidad para hacer uso de servicios Web. Pueden ser Computadoras de Bolsillo, personales, portatiles, Telefonos Inteligentes, Handhelds e incluso consolas de juegos como XBOXServidores: Proveen de la infraestructura para implementar el modelo de computacin distribuida en Internet. Son sistemas operativos y de aplicacin.Servicios Web basados en XML: Son los bloques de construccin de la tercera generacin de Internet. Permiten a las aplicaciones compartir datos y estan basados en XML.Herramientas de desarrollo: Visual Studio .NET y el .NET Framework. Ambos permiten al desarrollador hacer servicios Web basados en XML adems de otro tipo de aplicaciones. El .NET Framework viene incorporado directamente en la nueva lnea de sistemas operativos Windows .NET. Para los dispositivos mviles se llama .NET Compact Framework.4. El Common Language RuntimeEs el encargado de proveer lo que se llama cdigo administrado, es decir, un entorno que provee servicios automticos al cdigo que se ejecuta. Los servicios son variados:Cargador de Clases: Permite cargar en memoria las clases.Compilador MSIL a nativo: Transforma cdigo intermedio de alto nivel independiente del hardware que lo ejecuta a cdigo de mquina propio del dispositivo que lo ejecuta.Administrador de Cdigo: Coordina toda la operacin de los distintos subsistemas del Common Language Runtime.Recolector de Basura: Elimina de memoria objetos no utilizados.Motor de Seguridad: Administra la seguridad del cdigo que se ejecuta.Motor de Depuracin: Permite hacer un seguimiento de la ejecucin del cdigo an cuando se utilicen lenguajes distintos.Verificador de Tipos: Controla que las variables de la aplicacin usen el rea de memoria que tienen asignado.Administrador de Excepciones: Maneja los errores que se producen durante la ejecucin del cdigo.Soporte de multiproceso (threads): Permite ejecutar cdigo en forma paralela.Empaquetador de COM: Coordina la comunicacin con los componentes COM para que puedan ser usados por el .NET Framework.Soporte de la Biblioteca de Clases Base: Interfaz con las clases base del .NET Framework.Estructura de un Programa en C#

- Un programa en C# es una coleccin de Clases, Estructuras y Tipos- Dichos elementos pueden residir en uno o varios archivos- Todo es un objeto- C# diferencia Mayusculas y Minusculas- Utiliza los espacios de nombre para organizar las clases

Debemos recordar que una clase es una conjunto de propiedades y los mtodos para utilizarlas. Los elementos puedenresidir en uno o ms archivos, y un archivo puede contener una o todas las clases que integran una aplicacin, asi mismoen C# todo es un objeto, esto gracias a que el lenguaje ha sido rediseado por completo para permitir usar esos objetoscomo componentes de la aplicacion. El proceso en realidad es muy simple, al compilar una aplicacion C# la aplicacion nose compila directamente a lenguaje maquina, sino que se compila a codigo intermedio de Microsoft o MSIL, al ejecutar, esteMSIL es el que vamos a distribuir, al usarse una funcion esa y solamente esa funcion se compila a codigo nativo, esto es loque nos permite olvidarnos de la plataforma, de una manera similar a Java, aunque la diferencia radica en que Java siemprese interpreta a partir de su codigo intermedio, en cambio el MSIL se convierte a codigo nativo antes de ser utilizado, estopermite que las funciones se vayan compilando conforme se vayan utilizando minimizando el impacto al usuario, interesante verdad?.

Mtodo Principal Main

- Es el punto de inicio de la aplicacion- Puede devolver voidstatic void Main()- Puede devolver intstatic int Main()- Puede tomar argumentosstatic int Main(string[] args)En C# todas las aplicaciones deben tener un punto de inicio, que es el mtodo Main, en Main es donde se crean los objetosy se ejecutan otros mtodos, es un mtodo esttico que reside dentro de una clase o estructura y solo puede haber un Mainpor aplicacin. El mtodo Main puede o no recibir argumentos, dichos argumentos los recibe en forma de un array de stringsunidimensional y contiene los argumentos que el programa recibe al ser invocado en la linea de comandos.En resmen un programa en C# se ve ms o menos as.using System;

namespace Day1{/// /// Introducction to C# programming - Day 1/// class Example{[STAThread]static void Main(string[] args){Console.WriteLine("Hola Mundo");}}}

Tipos Predefinidos

En C# existen 2 tipos predefinidos:

- Tipos por Valor:- Contienen una copia de los Datos que utilizan- Las operaciones que uno realiza con su copia no afectan las copias de los demas

- Tipos por Referencia:- Contienen referencias a los Datos que utilizan- Dos o mas referencias pueden apuntar al mismo objeto- Las operaciones que uno realiza afectan a los demas

Todos los tipos se definen en el espacio de nombre System, todos los tipos se derivan de System.Object y los que son por valor derivan de Syste.ValueType.

Common Type System

Es el Sistema Comun de Tipos de la plataforma .NET(CTS), se encarga de definir la manera en que se declaran, utilizan yadministran los tipos de datos en tiempo de ejecucin, sin el sera posible la integracin entre lenguajes, ya que aunqueVB.NET y C# usan enteros de 32 bits la forma en que los representan y almacenan podria ser drasticamente diferente sinofuera porque utilizan el CTS. El CTS, lleva a cabo las siguientes funciones:

- Establece un marco que permite la integracin entre lenguajes, la seguridad de tipos y una ejecucin de cdigo de alto rendimiento.- Proporciona un modelo orientado a objetos que soporta la implementacin completa de muchos lenguajes de programacin.- Define las reglas que deben seguir los lenguajes, lo cual ayuda a asegurar que los objetos escritos en diferentes lenguajes pueden interactuar entre s.

Declaracin de Variables

+ Declaracin Sencilla- tipo_variable nombre_variable;+ Declaracin Multiple- tipo_variable nombre_variable1, nombre_variable2, ... nombre_variablen;NOTA: No se pueden utilizar variables no inicializadas.

Una variable puede inicializarse al momento de ser declarada, ejemplo: int miEntero=0;

o puede inicializarse despus en el cdigo, ejemplo: int miEntero; miEntero = 2;

Instrucciones Condicionales

Las instrucciones condicionales o de seleccin se utilizan para determinar que cdigo se debe ejecutar y cundo se debeejecutar. C# incluye dos instrucciones de seleccin la instruccin if que ejecuta cdigo en base a una condicin lgicay la instruccin switch que ejecuta cdigo con base en un valor, pero debes tomar en cuenta que al utilizar la instruccinswitch, puede especificar que se devuelva un valor numrico y una o ms partes de cdigo, que se ejecutarn dependiendo delresultado de la expresin.

Instruccin IFSi la(expresin)hacer esto...de lo contrariohacer esto otro...

EjemplO:if( i== 0 )Console.WriteLine("No ahi datos");elseConsole.WriteLine("Si ahi datos");

Instruccin SWITCHCompara(variable)caso variable=1: hacer esto... terminarcaso variable=2: hacer esto... terminarcaso no_coincidio: hacer esto... terminarEjemplo:switch(i){case 0: Console.WriteLine("No hubo inscritos");break;case 1: Console.WriteLine("Si hubo inscritos");break;default: Console.WriteLine("No se introdujo un numero valido"); break;}

Instrucciones de Iteracin

Las instrucciones de iteracin permiten realizar una serie de operaciones una y otra vez mientras una condicin dada secumpla, en el caso de la instruccin while, el bloque de intrucciones se ejecutar mientras la expresin se cumpla, estonos permite entrar al ciclo solo si la expresin da el valor que permita la entrada al ciclo, caso contrario no ejecutarani siquiera una vez, a diferencia del while el do-while se ejecuta al menos una vez ya que la comparacin de la condicinse realiza al final, esto es sumamente til para imprimir mens y pantallas que deben ser ejecutadas AL MENOS una vezmientras que el while nos permite evalua la condicin primero y entonces entrar al ciclo. Adems de estas dos instruccionestambin tenemos el ciclo for que nos sirve principalmente para evaluar condiciones nmericas donde una variable se va a estar incrementando continamente, cabe destacar que un ciclo se usa en lugar de otro ms que nada por comodidad, ya quetodo ciclo for puede ser convertido en while, todo ciclo while puede ser adaptado a un do-while y todo do-while portadoa for, bueno al menos esa es mi experiencia personal.

Instruccin WHILEMientras(expresin)hacer esto...

Ejemplo:while( i es < resultado >./// class SegundoEjercicio{[STAThread]static void Main(){int n1=2, n2=5;//Declaramos nuestros dos numeros y les damos un valor

Console.WriteLine("El resultado de la suma de "+n1+" y "+n2+" es "+(n1+n2));//Imprimimos el resultado de la suma}}}Ejercicio 3 - Construir una aplicacin que reciba el nombre de un mes del ao como el parmetro y proporcione su nmero correspondiente. Debe ser con el formato: < Nombre del mes > + < nmero del mes >.

using System;

namespace TercerEjercicio{/// /// Ultimo de los tres ejercicios/// Lee un mes e imprime su numero correspondiente/// Debe tener el formato: < Nombre del mes > + < nmero del mes >/// class TercerEjercicio{[STAThread]static void Main( string[] args ){string Mes = Console.ReadLine();//Leemos de consola el mes y lo guardamos en una variable stringswitch(Mes)//Dependiendo del valor del string sera la operacion a realizar, en caso de que el valor del string //Coincida con el case imprimira el valor del string + el numero del mes, si el valor no encaja en//ninguno de los case, entonces pedira que se vuelva a teclear el mes.{case "Enero":Console.WriteLine(Mes+": 1");break;case "Febrero":Console.WriteLine(Mes+": 2");break;case "Marzo":Console.WriteLine(Mes+": 3");break;case "Abril":Console.WriteLine(Mes+": 4");break;case "Mayo":Console.WriteLine(Mes+": 5");break;case "Junio":Console.WriteLine(Mes+": 6");break;case "Julio":Console.WriteLine(Mes+": 7");break;case "Agosto":Console.WriteLine(Mes+": 8");break;case "Septiembre":Console.WriteLine(Mes+": 9");break;case "Octubre":Console.WriteLine(Mes+": 10");break;case "Noviembre":Console.WriteLine(Mes+": 11");break;case "Diciembre":Console.WriteLine(Mes+": 12");break;default:Console.WriteLine("Por favor teclee un mes");break;}}}}

Ejercicio 4

Construir una aplicacin que cumpla con los requisitos siguientes: 1. Declarar un tipo estructura Person (Persona) que contenga la siguiente informacin de una persona: - nombre - apellido - edad - nmero de seguro social 2. Implementar un mtodo que reciba dos estructuras Person y devuelva la ms antigua. 3. Declarar una matriz para almacenar las estructuras Person. 4. Implementar un mtodo para ordenar la matriz por edad.Nota: uno de los algoritmos ms conocidos y sencillos para organizar es Bubble Sort. 5. Implementar un mtodo para mostrar la informacin de cada Person contenida en la matriz. 6. Implementar un procedimiento que reciba la matriz antes definida y llenarla con la informacin proporcionada por el usuario. Utilizar un try catch para asegurar que el usuario proporcione informacin vlida. Generar unaexcepcin en el bloque catch para indicar que se ingres informacin invlida. Para detectar esta excepcin, inserte un bloque try catch en el mtodo principal. 7. Por ultimo, en la funcin principal, invoque los mtodos para llenar, ordenar y mostrar la formacin. using System; namespace CuartoEjercicio{ public struct Person //Aqui declaramos un tipo de datos que se llamara Person { public string Nombre,Apellido; //Para el nombre public int Edad; //Para la edad public int NSS; //Para el numero de Seguro Social } class CuartoEjercicio { [STAThread] //A continuacion las funciones que utilizaremos public static void Llenar(Person[] Persona)//Recibimos un arreglo de datos de tipo Person { try //Siempre ahi que llevar un control de errores { for(int i=0; i < Persona.Length; i++) //mientras aun haya mas personas en la lista pedimos sus datos { Console.Write(" Nombre: "); //Imprimimos la peticin de que nos den el nombre Persona[i].Nombre = Console.ReadLine(); //Capturamos el dato en el arreglo Console.Write("Apellido: "); Persona[i].Apellido = Console.ReadLine(); Console.Write(" Edad: "); Persona[i].Edad = int.Parse(Console.ReadLine()); Console.Write(" N.S.S.: "); Persona[i].NSS = int.Parse(Console.ReadLine()); Console.WriteLine(""); } } catch (Exception e) //En caso de alguna anomala se lanzar una excepcin { throw new Exception("Dato no valido: " + e.Message,e); /*Aqu nosotros lanzaremos una excepcin personalizada, dicha excepcin dir que es un dato invalido e imprimir la descripcin del problema, este tipo de excepciones nos permitn detener la ejecucin del programa en un punto determinado sin necesidad de tratarla en la parte del cdigo donde tratamos las dems excepciones*/ } } public static void Ordenar( Person[] Persona )//Recibimos un arreglo de datos de tipo Person { Person p;//Declaramos una variable de tipo Person llamada p /*Los dos ciclos for uno dentro de otro nos permitiran utilizar una tcnica de ordenamiento Conocida como bubble sort, en el articulo de metodos de ordenamiento se explicaran mas con mas detalle las tcnicas de ordenamiento*/ for(int i=0; i < Persona.Length; i++) { for(int j=0; j Persona[j].Edad ) { p = Persona[i]; Persona[i] = Persona[j]; Persona[j] = p; } } } } public static void Mostrar( Person[] Persona )//Recibimos un arreglo de elementos Person { foreach( Person p in Persona ) //Por cada Person en Persona se imprimirn los datos de dicha persona { Console.WriteLine(" Nombre: "+p.Nombre); Console.WriteLine("Apellido: "+p.Apellido); Console.WriteLine(" Edad: "+p.Edad); Console.WriteLine(" N.S.S.: "+p.NSS+"\n"); } } static void Main(string[] args) //Desde aqui controlaremos el flujo del programa { Person[] Persona = new Person[2]; //Declaramos un array de datos Person llamado Persona con 2 elementos try //Nuestro control general de errores(aquellas no personalizadas) { Llenar(Persona); //Llenamos el arreglo Ordenar(Persona);//Lo ordenamos Mostrar(Persona);//Lo mostramos } catch( Exception e ) //Si hubo algn error aqu lo podemos solucionar { Console.WriteLine("\n"+e.Message); Console.WriteLine("*----------------------------------------------------*"); } finally //Finalmente haya habido o no errores este mensaje se imprimir { Console.WriteLine("\ngracias por usar nuestro programa"); } Console.Read(); } }}

Aqui podemos ver los datos al ser introducidos En esta imagen se ven los datos ya ordenados y el mensaje que pusimos en el bloque finally es desplegado

Ejercicio 5

1. Utilizar dos matrices bidimensionales de elementos int, construir una aplicacin que permita al usuario ingresar el tamao de cada dimensin e ingresar el valor de cada posicin.

2. Una vez que se hayan cargado las dos matrices, la aplicacin debe proporcionar una tercera matriz que contenga en cadaposicin la suma de los elementos correspondientes de las dos matrices que proporcion el usuario.

using System;

namespace ConsoleApplication1{class QuintoEjercicio{[STAThread]//Primero las funciones que utilizaremospublic static void Cargar( int[,] A, int[,] B )//Recibimos dos matricez para poder llenarlas con los datos que nos de el usuario{//Aqui usamos dos for uno dentro de otro para poder recorrer todas las posicionesfor( int i=0 ; i < A.GetLength(0) ; i++ ){for( int j=0 ; j < A.GetLength(1) ; j++ ){Console.Write("\nValor A: [{"+(i+1)+"},{"+(j+1)+"}] :");A[i,j] = int.Parse(Console.ReadLine());Console.Write("Valor B: [{"+(i+1)+"},{"+(j+1)+"}] :");B[i,j] = int.Parse(Console.ReadLine());}}}

public static void Sumar( int[,] A, int[,] B, int[,] C )//Aqui recibimos tres matricez dos para leer y sumarlas entre si y una tercera para almacenar el resultado{//Igual que antes utilizamos dos for anidados para poder recorrer todas las posicionesfor( int i=0 ; i < A.GetLength(0) ; i++ )for( int j=0 ; j < A.GetLength(1) ; j++ )C[i,j] = A[i,j]+ B[i,j];}

public static void Mostrar( int[,] C )//Aqui solo recibimos la matriz que guarda el resultado de la suma de las dos anteriores{Console.WriteLine("\nEl resultado de la suma de ambas Matrices es: ");//Recorremos todas las posicionesfor( int i=0 ; i < C.GetLength(0) ; i++ )for( int j=0 ; j < C.GetLength(1) ; j++ )Console.WriteLine("Valor C: [{"+(i+1)+"},{"+(j+1)+"}] : "+C[i,j]);//Imprimimos el resultado de la suma}static void Main(string[] args){int[,] A,B,C; //Nuestras tres matricez sin tamao definidoint f,c; //Las variables que guardaran el numero de filas y columnas

try//Como siempre ahi que llevar un control de errores{Console.Write(" Numero de Filas: ");f = int.Parse(Console.ReadLine());//Guardamos el numero de filasConsole.Write("Numero de Columnas: ");c = int.Parse(Console.ReadLine());//guardamos el numero de columnasA = new int[f,c];//Inicializamos las tres matricez con las mismas dimensionesB = new int[f,c];C = new int[f,c];Cargar(A,B);//Llenamos las dos primeras matricezSumar(A,B,C);//Sumamos las dos primeras matricez y vaciamos el resultado en la terceraMostrar(C);//Mostramos el resultado de la suma}catch( Exception e )//En caso que haya ocurrido algun error{Console.WriteLine( e.Message );//Imprimimos el mensaje de error para poder saber que paso}

finally{Console.WriteLine("\nGracias por haber utilizado nuestro programa");//Sin importar si haya o no haya habido errores se agradece al usuario su preferencia}}}}

Nota 1: Siempre pongo el try catch en el main porque al ser llamadas las funciones desde el main cualquier error que ocurraen cualquiera de las funciones sera captado por ese unico catch en el main, eso es mas simple que un try catch en cada funcion, si deseamos un control mas preciso ahi que lanzar excepciones personalizadas como en el ejemplo anterior, las cualesse veran reflejadas en el catch del main

Nota 2: Ahi que mantener el cdigo lo mas simple posible, pero sin sobreutilizar las funciones, el cdigo que escribo procurohacerlo entendible a primera vista y con un flujo muy directo y simple, siempre ahi que facilitarnos la vida, esta costumbreque nos hacemos desde los primeros programas es muy util cuando trabajamos con programas con cientos o miles de lineas decodigo donde es facil perderse si no se ha construido con la suficiente simpleza

Aqui podemos ver los datos al ser introducidos