Intruducion de C#
Intruducion de C#
Intruducion de C#
NET
3: El Lenguaje C#
ndice
! ! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
! !
! !
Introduccin
! ! ! ! !
C# es el ltimo en una lnea de evolucin de los lenguajes derivados de C, que incluye C++ y Java. Usado por Microsoft para desarrollar la mayora del cdigo de .NET. C# es orientado a objetos, moderno, simple y potente. En C# todo es un objeto. Actualmente, C# es un estndar ECMA (European Computer Association Manufacturing) e ISO. Cualquiera que obtenga su especificacin puede desarrollar un compilador totalmente compatible con la garanta del control que se ejerce sobre su evolucin. Caractersticas: " Mejoras sobre C++ en las reas de seguridad de datos, versionamiento, eventos y recoleccin de basura. " Acceso al SO, COM y APIs " Soporta el modo unsafe que permite el uso de punteros como en C. " Generacin de documentacin XML automtica. " Creacin de pginas ASP.NET y servicios Web.
Un programa en C# contiene:
"
o relativo:
using System; ...; Console.WriteLine(...);
Ejemplo:
namespace N1 {
class C1 { // ... } struct S1 { // ... } interface I1 { // ... } delegate int D1(); enum E1 { // ... } }
Comentar el cdigo:
"
"
#endregion
ndice
! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
! !
! !
Lo comparten todos los lenguajes de .NET Admite tanto tipos de valor como tipos de referencia:
Tipos de referencia
Arrays Clases Interfaces Punteros, Delegados
Todos los tipos de datos derivan de System.Object # sistema de tipos unificado. Cualquier tipo puede ser tratado como un objeto.
"
Identificadores
" Dan
nombre a variables, constantes y mtodos. " Constan de caracteres alfanumricos y _ " C# es Sensible a maysculas y minsculas. " Han de comenzar con letra o _ " No pueden ser una palabra reservada
Variables
" Una
" Declaracin:
" Recordar
! !
" Los
" Comparacin
entre variables de tipo valor y variables tipo referencia: Variables de tipo referencia:
!
Contienen sus datos directamente Cada una tiene su propia copia de datos Las operaciones sobre una no afectan a otra
Almacenan referencias a sus datos (conocidos como objetos) Dos variables de referencia pueden apuntar al mismo objeto Las operaciones sobre una pueden afectar a otra
" Inicializacin
de variables en la declaracin:
bool bln = true; byte byt1 = 22; char ch1=x, ch2=\u0061; // Unicode para a decimal dec1 = 1.23M; double dbl1=1.23, dbl2=1.23D; short sh = 22; int i = 22; long lng1=22, lng2=22L; // L long sbyte sb=22; float f=1.23F; ushort us1=22; uint ui1=22, ui2=22U; // U unsigned ulong ul1=22, ul2=22U, ul3=22L, ul4=2UL;
" Los
string s = "Hola";
" Como
las sentencias de escape comienzan con \, para escribir este carcter hay que doblarlo, o usar @:
string s3 = "c:\\WINNT"; string s4 = @"C:\WINNT"; $
" mbito
y Visibilidad:
using System; namespace ConsoleAppVisibilitat { class Simple { public int Var1=10; private int Var2=20; //local public int Var3=30; } class Class1 { static void Main(string[] args) { Simple s = new Simple(); Console.WriteLine("Simple:"); Console.WriteLine("Var1={0}, Var3={1}",s.Var1, s.Var3); Console.ReadLine(); } } }
# mbito: lugar donde se declara una variable. Determina su accesibilidad. # La visibilidad de una variable fuera de su mbito se puede modificar anteponiendo public o private en su declaracin.
# static: Variable esttica, existe durante toda la ejecucin del programa. % Slo existe una sola copia de la misma sin necesidad de crear objeto alguno. % Hay que referirse a ella usando el nombre completo del tipo al que pertenece. % No afecta a su visibilidad
using System; namespace ConsoleAppVisibilitatSTAT { class Simple { public static int Var3=30; // pblica // esttica
static int Var4=40; //privada i esttica public void mostraVar4() { Console.WriteLine("Var4={0}", ++Var4); }
} class Class1 static void Simple s Simple k { Main(string[] args) = new Simple(); = new Simple();
Constantes
" " "
El modificador const permite definir variables constantes: Una constante no cambia nunca su valor. Son implcitamente static.
Class Class1 { private const int min = 1; private const int max = 100; public const int rango = max min;
} }
int intValor = 123; long longValor = intValor; // implcita de int a long intvalor = (int) longValor; // explcita de long a int con cast int x = 123456; long y = x; // implcita short z = (short)x; // explcita double d = 1.2345678901234; float f = (float)d; // explcita long l = (long)d; // explcita //uso de la classe Convert: int c=154; Console.WriteLine(Convert.ToString(c));
short, int, long, float, double, decimal int, long, float, double, decimal
int, uint, long, ulong, float, double, decimal
long, float, double, decimal long, ulong, float, double, decimal float, double, decimal float, double, decimal double ushort, int, uint, long, ulong, float, double, decimal
Las enumeraciones se crean cuando se necesita que una variable tome valores de una lista limitada no predefinida. Tienen por tipo base nmeros enteros. Por defecto empieza la numeracin por 0.
" "
o
colorPaleta = (Color)1; // Tipo int a tipo Color "
"
" Uso:
Empleado empresaEmpleado, otroEmpleado; empresaEmpleado.Nombre = "Juan"; empresaEmpleado.edad = 23; otroEmpleado = empresaEmpleado; //asignacin directa
Arrays
" Los
" Sus
Ejemplo: string[] a;
# El tipo de datos array viene dado por string[] # El nombre del array es una referencia al array
" Para crear espacio para los elementos string[] a = new string[100];
usar:
" Los arrays se pueden inicializar directamente: string[] animales = {"gato", "perro", "caballo"}; int[] a2 = {1, 2, 3}; " Arrays
multidimensionales:
"
Si se crea un nuevo array sobre el mismo se libera la memoria que ocupaba y se pierde toda la informacin que contenia. Dimensiones: .Rank Nmero total de elementos del array: .Length Nmero de elementos de la dimensin d: .GetLength(d) ndice superior e inferior: .GetLowerBound(d); .GetUpperBound(d); (d=dimensin, desde 0 hasta Rank-1) Saber si es un array: if (a is Array) .... foreach (string a in animales) Console.WriteLine(a);
"
"
"
Manipulacin de cadenas
" " "
Los tipos char y string permiten manipular caracteres. Una variable char puede contener cualquier carcter Unicode Manipulacion de caracteres: char.IsDigit();
char.IsLetter(); char.IsPunctuation(); char.ToUpper(); char.ToLower(), char.ToString();..., etc.
Una variable tipo string es una referencia al lugar donde se guarda la cadena. Cada vez que se modifica el valor de la cadena se asigna un nuevo bloque de memoria y se libera el anterior. Concatenacin: Nuevo operador + (no existe en C, C++) o se puede usar tambin el mtodo: String.Concat()
string a, b; a="Programaci "; b=amb C#"; Console.WriteLine(Usant operador + en {0}", a+b); Console.WriteLine(" Usant concat en {0}", string.Concat(a, b));
ndice
! ! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
!
!
Operadores y expresiones
Control del flujo
Condicionales Bucles " Saltos
" "
! !
Operadores y expresiones
!
Operadores aritmticos:
" " " " " " " " "
Operadores relacionales:
"
+ Suma unaria: +a - Resta unaria: -a ++ Incremento ++a o a++ -- Decremento: --a o a-+ Suma a+b - Resta: a-b * Multiplicacin: a*b / Divisin: a/b % Resto: a%b
Igualdad: a==b Desigualdad: a!=b Menor que: a<b Menor o igual: a<=b Mayor que: a>b Mayor que o Igual a: a>=b Negacin: !a And binario: a&b Or binario: a|b Or exclusivo: a^b Negacin binaria: ~a And lgico: a&&b Or lgico: a||b
Otros operadores
" min=a<b ".
] ndice de arrays, punteros, propiedades y atributos : crea nuevos objetos : obtiene el tipo de un objeto
" new
" sizeof
! !
Asociatividad:
" Todos " Los
los operadores binarios, salvo los de asignacin, son asociativos por la izquierda. operadores de asignacin y el operador condicional(?) son asociativos por la derecha.
ndice
! ! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
Operadores y expresiones
! !
Instrucciones
"
"
Un bloque y su bloque padre o pueden tener una variable con el mismo nombre
{ int i; ... { int i; ... }
"
"
Condicionales
if (<condicin>) <sentenciasCondTrue> if (<condicin>) { <sentenciasCondTrue> } [else { <sentenciasCondFalse> }]
Ejemplo:
if (a>b) Mayor=a; if (a>b) { Mayor=a; Menor=b; } else { Mayor=b; Menor=a; }
Ejemplo: if en cascada
enum Palo { Treboles, Corazones, Diamantes, Picas} Palo cartas = Palo.Corazones; string color; if (cartas == Palo.Treboles) color = Negro; else if (cartas == Palo.Corazones) color = Rojo"; else if (cartas == Palo.Diamantes) color = "Rojo"; else color = Negro";
"
Condicionales mltiples
switch (<expressin>) { case Opc1 : [<sentencias-1>] break; [case Opc2 : [<sentencias-2>] break; default: <sentencias-def> break;] }
Ejemplo:
switch(B) { case 5: Console.WriteLine(B es ptimo); A=10; break; case 1: case 2: case 3: //1,2,3 sin break pq estn vacos case 4: Console.WriteLine(B est por debajo del valor ptimo); A=3; break; default: Console.WriteLine(B no es vlido); break; }
"
! !
Las opciones tienen que ser expresiones constantes, nunca variables. El orden de las opciones no importa y no pueden estar repetidas. En C# se permite usar en el switch el tipo string
Ejemplo:
string country; const string england = "uk"; const string britain = "uk"; const string spain = "sp"; const string german = "ge"; switch(country) { case england: ; break; case britain: ; break // error de compilacin case spain: ; break case german: ; break }
Bucles
" for
for (int i=0; i < 5; i++) { // i declarada dentro del bucle Console.WriteLine(i); } for (;;) { ... // bucle infinito } for (int i=1, j=2; i<=5; i++, j+=2) { //mltiples expresiones System.Console.WriteLine("i=" + i + ", j=" + j); }
" while
Ejecuta instrucciones en funcin de un valor booleano. ! Evala la expresin booleana al principio del bucle.
!
" do
... while ! Ejecuta instrucciones en funcin de un valor booleano. ! Evala la expresin booleana al final del bucle.
do { ... } while (true); int i = 10; do { ... i--; } while (i > 5);
" foreach
Este bucle es nuevo en C#. ! Itera sobre una coleccin de elementos ! No permite cambiar el valor de los tems
!
Instrucciones de salto
" continue: Salta el resto de la iteracin y comienza
la siguiente:
" break
ndice
! ! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
! !
! !
Funciones y Mtodos
! ! ! !
En C# todo son funciones, no existen procedimientos. Todas las funciones siempre pertenecen a una clase, luego son todas las funciones son mtodos. Los mtodos, por defecto, son privados (private) Main es un mtodo y para definir mtodos propios se usa la misma sintaxis:
using System; class EjemploClase { static void EjemploMetodo( ) { Console.WriteLine("Este es un ejemplo de mtodo"); } static void Main( ) { // ... } }
Llamar a un mtodo desde dentro de la misma clase ! Se usa el nombre del mtodo seguido de una lista de parmetros entre parntesis Llamar a un mtodo que est en una clase diferente ! Hay que indicar al compilador cul es la clase que contiene el mtodo que se desea llamar
!
"
"
Usar llamadas anidadas. ! Unos mtodos pueden hacer llamadas a otros, que a su vez pueden llamar a otros mtodos, y as sucesivamente.
Variables locales " Se definen dentro del mtodo. " Son privadas para el mtodo. " Se destruyen a la salida del mtodo. Variables compartidas " Se definen en la clase. " Permiten compartir datos entre los mtodos de la clase. Conflictos de mbito " El compilador no avisa si hay conflictos entre nombres de las variables locales y las de clase.
Devolucin de valores
" "
El mtodo se debe declarar con un tipo que no sea void Se aade una instruccin return con una expresin
! !
"
Parmetros " En C# todos los parmetros se pasan por valor si no se indica lo contrario. " Declaracin de parmetros
! !
Se ponen entre parntesis despus del nombre del mtodo Se define el tipo y el nombre de cada parmetro
" Llamadas a mtodos con parmetros ! Un valor para cada parmetro " Paso
de parmetros: por valor, por referencia, de salida y lista de parmetros de longitud variable.
MetodoConParametros(int n, string y)
" Paso
! !
por valor
Se copia el valor del parmetro. Se puede cambiar el nombre de la variable dentro del mtodo. No afecta al valor fuera del mtodo.
static void SumaUno(int x) { x++; // Incrementar x } static void Main( ) { int k = 6; SumaUno(k); Console.WriteLine(k); // Muestra el valor 6, no 7 }
" Paso por referencia ! Se pasa una referencia a una posicin de memoria. ! Se usa la palabra clave ref en la declaracin y las llamadas al mtodo. ! Los tipos y valores de variables deben coincidir. ! Los cambios hechos en el mtodo afectan al llamador. ! Hay que asignar un valor al parmetro antes de la llamada al mtodo.
static int RaizCuarta(ref int x) { x = (int)Math.Sqrt(x); return (int)Math.Sqrt(x); } static void Main( ) { int num = 625; //siempre inicializar antes de utilizarla!! Console.WriteLine(Raiz cuarta: {0}, el nmero original es: {1}, RaizCuarta(ref num), num); }
" Parmetros de salida ! No sirven para pasar valores al mtodo. ! Slo devuelven resultados desde el mtodo. ! Se usa la palabra clave out en la declaracin y las llamadas al mtodo. ! La variable no necesita estar inicializada. ! Al parmetro de salida hay que asignarle siempre un valor.
static void OutDemo(out int p) { p = 255; // ... } static void Main( ) { int n; // sin inicializar OutDemo(out n); }
" Lista
! ! !
Se usa la palabra reservada params. Se declara como un array al final de la lista de parmetros. Siempre se pasan por valor.
static long SumaLista(params long[ ] v) { long total, i; for (i = 0, total = 0; i < v.Length; i++) total += v[i]; return total; } static void Main( ) { long x = SumaLista(63,21,84); }
" Gua
! ! ! !
El paso por valor es el ms habitual y suele ser el ms eficaz. El valor de retorno del mtodo es til para un solo valor. ref y/o out son tiles para ms de un valor de retorno. ref slo se usa si los datos se pasan en ambos sentidos.
" Devolucin
class EjemploArr1 { static void Main( ) { int[ ] array = CrearArray(42); ... } static int[ ] CrearArray(int tamano) { int[ ] creada = new int[tamano]; return creada; } }
" Paso
! ! !
Un parmetro de array es una copia de la variable array. No es una copia de los elementos del array. Se modifican los valores originales del array.
class EjemploArr2 { static void Main( ) { int[ ] arg = {10, 9, 8, 7}; Metodo(arg); System.Console.WriteLine(arg[0]); } static void Metodo(int[ ] parametro) { parametro[0]++; }
Este mtodo modificar el array original creado en Main
Mtodos recursivos
" "
Comparten un nombre dentro de la clase. Se distinguen por el nmero y tipo de parmetros. Usarlos cuando:
! !
hay mtodos similares que requieren parmetros diferentes si se quiere aadir funcionalidad al cdigo existente.
class OverloadingExample { static int Suma(int a, int b) { return a + b; } static int Suma(int a, int b, int c) { return a + b + c; } static void Main( ) { Console.WriteLine(Suma(1,2) + Suma(1,2,3)); } }
ndice
! ! !
Sistema comn de tipos Identificadores Variables y Constantes Tipos definidos por el usuario: enumeraciones y estructuras Arrays Manipulacin de cadenas
! !
! !
Los errores (sintcticos y semnticos) pueden aparecer en el cdigo de forma inesperada. Visual Studio ofrece potentes y eficaces herramientas para la depuracin de los errores.
El depurador de Visual Studio proporciona un men Depurar que ofrece acceso a las herramientas del depurador.
Adems, el lenguaje C# incorpora tcnicas para controlar las posibles situaciones de error en tiempo de ejecucin.
Cuando una aplicacin se ejecuta en modo de depuracin VS es capaz de conocer qu ocurre exactamente en cada lnea de cdigo. Esa informacin de depuracin est contenida en los ficheros .pdb En modo depuracin podremos:
" " " " " "
Consultar y modificar el valor de las variables, Detener un momento la ejecucin Editar el cdigo y continuar la ejecucin, Parar la ejecucin en un lugar concreto, Ejecutar el programa lnea a lnea, Realizar llamadas de prueba a mtodos en la ventana Inmediato sin ejecutar la aplicacin, Etc.
Excepciones
" Las
excepciones son el mecanismo OO de C# para controlar las situaciones de error. qu usar excepciones? El tratamiento tradicional de errores resulta muy complicado de gestionar:
" por
int errorCodigo = 0; FileInfo source = new FileInfo("code.cs"); if (errorCodigo == -1) goto Fallo; int longitud = (int)source.Length; if (errorCodigo == -2) goto Fallo; char[] contenido = new char[longitud]; if (errorCodigo == -3) goto Fallo; // No hay problemas ... Fallo: ...
Trat. De errores
"
" Tratamiento
try { ... } catch { ... } finally { ... }
// bloque de finalizacin que siempre se ejecuta // Permite limpiar recursos utilizados por try
Ejemplo:
try { Console.WriteLine("Escriba un nmero"); int i = int.Parse(Console.ReadLine()); } catch (OverflowException capturada)
{ Console.WriteLine(capturada); }
Cuando ocurre un error se crea una excepcin que contiene informacin para solucionar el problema. Cada bloque catch captura una clase de excepcin. Un bloque try puede tener un bloque catch general que capture excepciones no tratadas (slo uno y adems el ltimo de los bloques catch) Un bloque try no puede capturar una excepcin derivada de una clase capturada en un bloque catch anterior.
try { Console.WriteLine(Escriba el primer nmero"); int i = int.Parse(Console.ReadLine()); Console.WriteLine("Escriba el segundo nmero"); int j = int.Parse(Console.ReadLine()); int k = i / j; } catch (OverflowException capturada) { Console.WriteLine(capturada); } catch (DivideByZeroException capturada) {Console.WriteLine(capturada); } catch {} // tambin: catch (Exception x) { } ...
"