Académique Documents
Professionnel Documents
Culture Documents
NET Framework
confidencialidad
Aviso: Este documento es material confidencial y propiedad de everis. Se prohbe el uso, reproduccin o la divulgacin del contenido de este material sin permiso previo y por escrito de la empresa propietaria.
Derechos de Autor 2010, everis. All rights reserved
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
Qu es .NET Framework?
Microsoft .NET es un conjunto de tecnologas sencillas y potentes de software de servicios distribuido. Se basa en el suministro de servicios remotos y la comunicacin entre stos . Es independiente de la plataforma, lenguaje de programacin y modelo de componentes. La plataforma recibe el nombre de Plataforma .NET y los servicios, Servicios Web .NET Framework SDK. Entorno de trabajo para desarrollar, distribuir y ejecutar tanto servicios web como aplicaciones tradicionales. A ste se le aade Visual Studio .NET para permitir el trabajo desde una interfaz grfica basada en ventanas.
Qu es .NET Framework?
Microsoft .NET tambin incluye otras aplicaciones de Microsoft o terceros pensadas para la plataforma: Windows .NET Halistorm MSN.NET Office .NET Servidores de empresa (SQL Server .NET, Exchange .NET, etc)
Qu es .NET Framework?
Arquitectura .NET Framework
Qu es .NET Framework?
CLR
El Common Language Runtime (CLR) es el ncleo de la plataforma .NET Es el encargado de gestionar la ejecucin de las aplicaciones. Ofrece servicios que simplifican el desarrollo y favorecen la fiabilidad y seguridad. Principales caractersticas y servicios de CLR: Modelo de programacin consistente y sencillo Eliminacin del infierno de las DLLs Ejecucin multiplataforma Integracin de lenguajes de programacin, incluso con ms antiguos Gestin dinmica de la memoria Seguridad en tipos de datos y tratamiento de excepciones Aislamiento de procesos y soporte multihilo
10
Qu es .NET Framework?
MSIL
El Microsoft Intermediate Language (MSIL) es el lenguaje intermedio al que todo cdigo desarrollado con .NET se compila. Es el nico lenguaje que sabe interpretar la CLR. Lenguaje con nivel de abstraccin superior respecto a los lenguaje mquina de las CPU actuales (por ejemplo, contiene instrucciones que tratan directamente con objetos, tablas o excepciones). Es multiplataforma Independiente de cada CPU y mquina. Es necesario que el cdigo MSIL se compile a lenguaje mquina en tiempo de ejecucin Para ello tenemos el compilador JIT (Just in Time) o jitter.
11
Qu es .NET Framework?
Proceso de compilacin y ejecucin
Compiladores MSIL
Lenguaje mquina
JIT
CLR
12
Qu es .NET Framework?
Metadatos
En la plataforma .NET se distinguen dos tipos de mdulos de cdigo compilado: Ejecutables (extensin .exe). Tienen un nico punto de entrada para ejecutar el cdigo desde la lnea de comandos. Bibliotecas de enlace dinmico (Dynamic Link Library o DLL) A ambos tipos se les suele llamar ejecutables portables (PE) ya que su cdigo puede ejecutarse en los diferentes sistemas operativos de la familia Windows.
13
Qu es .NET Framework?
Ensamblados
Un ensamblado es una agrupacin lgica de uno o varios mdulos o ficheros de recursos englobados bajo un nombre comn. Nos ayudan a abstraer la ubicacin fsica del cdigo ya que podemos acceder a la informacin de un ensamblado sin saber cul es el fichero concreto donde se encuentra Todo ensamblado contiene un fichero de manifiesto, que ofrece informacin sobre las caractersticas del primero. Puede almacenarse en cualquier mdulo interior.
14
Qu es .NET Framework?
CTS
El Common Type System (CTS) o sistema de tipos comunes es el conjunto de reglas que han de seguir las definiciones de tipos de datos para que el CLR las acepte. Aunque todos los lenguajes tienen sus reglas de sintaxis, el MSIL resultante de la compilacin ha de cumplir ciertas reglas, como por ejemplo: Cada tipo de dato puede constar de cero o ms miembros. Cada uno de estos miembros puede ser un atributo, un mtodo, una propiedad o un evento. No puede haber herencia mltiple y todo tipo de dato debe heredar directa o indirectamente de System.Object.
15
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
16
Orgenes de C#
C# (en ingls, C Sharp) es el lenguaje de propsito general para la plataforma .NET, creado por Scott Wiltamuth y Anders Hejlsberg. C# es el lenguaje nativo de .NET ya que fue diseado especficamente para la plataforma. Carece de elementos heredados innecesarios de otros lenguajes de .NET, lo que le hace ms sencillo e intuitivo de aprender. Su estructura es muy similar a la de C++, ya que su intencin es la de facilitar la migracin de cdigo C++ a C# y facilitar su aprendizaje a los programadores habituados al primero.
17
Orgenes de C#
Debido a rencillas con Sun Microsystems, Microsoft ide desde cero este lenguaje, parecido a Java, pero con ciertas mejoras para encaminarlo a que fuera un lenguaje orientado a componentes. Pese a ser reciente no es inmaduro ya que su biblioteca de clases base (Base Class Library o BCL) est escrita en el propio lenguaje y su compilador es el ms depurado y optimizado del framework. En conclusin, C# es un lenguaje que toma las mejores caractersticas de sus antecesores (C++, Java y Visual Basic) y las combina en uno solo.
18
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
19
Caractersticas de C#
Sencillez El cdigo es autocontenido y no son necesarios ficheros de cabecera o IDLs El tamao de los tipos bsicos es fijo e independiente del compilador y mquina (no como en C++), cosa que aumenta la portabilidad. Se han eliminado elementos poco tiles de C++ como macros, herencia mltiple, operadores de acceso diferentes del punto (.) , etc. Slo posee unas 80 palabras reservadas, hacindolo simple. Modernidad C# incorpora funcionalidades que con el tiempo han resultado tiles en el desarrollo de aplicaciones: tipo de datos decimal, instrucciones foreach, Strings, booleanos, etc.
20
Caractersticas de C#
Orientacin a objetos A diferencia de C++, C# es un lenguaje orientado a objetos puro, prohibiendo el uso de variables y mtodos globales. Se basa en los tres pilares del paradigma de orientacin a objetos: encapsulacin, herencia y polimorfismo. En cuanto a encapsulacin, C# incluye un cuarto modificador de visibilidad (junto con public, private y protected) llamado internal, que indica que un elemento slo es accesible desde el ensamblado al cual pertenece. Carece de herencia mltiple, pero se puede simular a travs de interfaces. Al contrario que Java, los mtodos por defecto se declaran sellados para evitar redefiniciones accidentales y para serlo hay que declararlo como virtual.
21
Caractersticas de C#
Orientacin a componentes La sintaxis de C# ofrece elementos propios del diseo de componentes tales como propiedades, eventos o atributos. Gestin automtica de la memoria No es necesario destruir objetos ya que un mecanismo dentro del CLR llamado recolector de basura se encarga de ello de forma automtica. Debido a que la llamada a este recolector no siempre se produce cuando se desea, se dispone de un mecanismo de liberacin de recursos explcita a travs de la sentencia using
22
Caractersticas de C#
Seguridad de tipos C# tiene mecanismos de seguridad para garantizar de forma correcta los accesos a los tipos de datos para evitar accesos a memoria no correspondiente. Para ello toma medidas del tipo: Slo se admiten conversiones entre tipos compatibles. Debido a que algunas compatibilidades slo se resuelven en tiempo de ejecucin, el compilador y CLR trabajan conjuntamente. No se pueden usar variables no inicializadas. El compilador asigna un valor por defecto a los atributos y vigila la inicializacin de variables locales. Al acceder a una tabla, se comprueba que el acceso se realiza con los ndices que se encuentren en el rango de la misma.
23
Caractersticas de C#
Seguridad de tipos A diferencia de Java, C# incluye delegados, que son una aproximacin a los punteros de C++ a funciones pero con un enfoque orientado a objetos. Almacenan referencias a mtodos simultneamente y se comprueba que los parmetros y valores de retorno tengan el mismo tipo de datos que la definicin. Pueden definirse mtodos que admitan un nmero indefinido de parmetros de cierto tipo y siempre se comprueba al ser llamado un mtodo que estos parmetros sean del mismo tipo. Instrucciones seguras Se imponen restricciones en las instrucciones de control ms comunes de forma que toda la condicin ha de ser expresin condicional y no aritmtica. Todo switch ha de terminar en un break o un goto.
24
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
25
Sintaxis bsica
Identificadores
Como en el resto de lenguajes de programacin, un identificador es un nombre mediante el cual identificamos un elemento del cdigo (clase, variable, mtodo, etc.) Es una secuencia alfanumrica (incluidas vocales acentuadas y la ) cuyo primer carcter no es un nmero. Se permiten incluir otros caracteres imprimibles (diresis, subrayados, etc.) exceptuando aquellos que tienen un significado especial dentro del lenguaje (por ejemplo # y !). De todas formas, no es recomendable. Ejemplos vlidos: Arriba, caa, C3P0, , hola, _barco_, ck, AB Ejemplos no vlidos: 3com, 123, 4D5v, C#, a!b
26
Sintaxis bsica
Palabras reservadas
abstract char as checked base class bool const break continue byte decimal case default catch delegate
do
finally in new protected sizeof true using
double
fixed int null public stackalloc try virtual
else
float interface object readonly static typeof void
enum
for internal operator ref string uint while
event
foreach is out return struct ulong
explicit
goto lock override sbyte switch
unchecked
extern
if long params sealed this unsafe
false
implicit
namespace
27
Sintaxis bsica
Palabras reservadas
C# proporciona un mecanismo para permitir que nuestros identificadores sean alguna de las palabras reservadas anteriores Usar el prefijo @ class @class { static void @static(bool @bool) { if(@bool) { Console.WriteLine(cierto); } else { Console.WriteLine(falso); } } } Microsoft ha especificado que si se ampliasen en futuro las palabras reservadas, las nuevas habran de incluir dos smbolos de subrayado consecutivos (__) Para evitar futuros conflictos, se recomienda no usar esa secuencia.
28
Sintaxis bsica
Tipos de datos bsicos
Nmeros enteros sbyte, short, int, long Nmeros naturales (enteros positivos) byte, ushort, uint, ulong Nmeros reales (con decimales) decimal, float, double Caracteres char Booleanos (lgicos) bool
29
Sintaxis bsica
Tipos de datos bsicos
Tipo
sbyte short int long 128 a +127 32.768 a +32.767 2.147.483.648 a +2.147.483.647 9.223.372.036.854.775.808 a +9.223.372.036.854.775.807
Rango
Tamao
8-bit (1-byte) 16-bit (2-byte) 32-bit (4-byte) 64-bit (8-byte)
byte
ushort uint ulong decimal float double bool char
0 a 255
0 a 65.535 0 a 4.294.967.295 0 a 18.446.744.073.709.551.615 7,9228162514264337593543950335 a +7,9228162514264337593543950335 1,401298E45 a 3,402823E+38 4,94065645841246E324 a 1,79769313486232E+308 true o false '\u0000' a'\uFFFF'
8-bit (1-byte)
16-bit (2-byte) 32-bit (4-byte) 64-bit (8-byte) 128-bit (16-byte) 32-bit (4-byte) 64-bit (8-byte) 8-bit (1-byte) 16-bit (2-byte)
30
Sintaxis bsica
Literales
Tipo
Enteros
Descripcin
Representan nmeros expresados tanto en decimal (0-9) como en hexadecimal (0x seguido de 0-9 o A-F). Pueden preceder se los smbolos + o para indicar signo
Representar nmeros con decimales. El separador es un punto (.). Pueden ser expresados tambin en formato cientfico
Ejemplos
Decimal: 56, -5, +6
Hexadecimal: 0x3EF1, 0xFF, -0x4C 0.0, 4.5, -7.56, 0.134e4, 6.5e-9, 4.7E6
Reales
Lgicos
Reprsentan los valores de cierto (true) y falso (false) Cualquier carcter imprimible. Van cerrados entre comillas simples. Algunos caracteres deben ser usados mediante secuencias de escape
true, false
De carcter
a, 3, ?, , \n, \
De cadena
Secuencia de caracteres. Van cerrados entre comillas dobles. Si la cadena tiene comillas dobles, stas se han de escapar. Valor especial que se usa como valor de las variables objeto no inicializadas
Nulos
null
31
Sintaxis bsica
Declaracin de variables
Una variable se puede ver como un almacn de objetos de un determinado tipo al cual se le asocia un identificador para referirse a l. Para declarar una variable basta con indicar su tipo seguido de un identificador <tipoDatos> <identificador> int x; char letra; string mensaje; Object obj; Asimismo podemos inicializar una variable asignndole un valor. int x = 45; string mensaje = Hola; Object obj = new Object() En funcin de donde se localice una variable, puede ser de tres tipos: Atributo. Se hallan dentro de la definicin de una clase, es decir, de un objeto. Son permanentes hasta la destruccin de dicho objeto Variable local. Se hallan dentro de un mtodo. Se destruyen al finalizarlo. Parmetro. Slo pueden usarse dentro del mtodo donde actan.
32
Sintaxis bsica
Constantes
Una constante es una variable cuyo valor nunca vara y en consecuencia el compilador lo conoce de antemano y optimiza. Las constantes se declaran al igual que las variables pero aadiendo la palabra const en su declaracin y siempre asignndolas un valor. const double pi = 3.141596; Las constantes son implcitamente estticas.
33
Sintaxis bsica
Variables de slo lectura
Debido a que las constantes son muy rgidas, C# permite declarar variables de slo lectura, es decir, que nunca pueden ser sobrescritas. Se declaran como variables aadiendo la palabra readonly. No hace falta asignarles un valor directamente, pero entonces slo se puede hacerlo en los constructores de los objetos. El valor que almacenan se puede calcular en tiempo de ejecucin
34
Sintaxis bsica
Operadores
Un operador es un smbolo formado por uno o ms caracteres que permite realizar una determinada operacin entre uno o ms datos y produce un resultado. Operadores aritmticos Unarios: negativo (-) y positivo (+) Binarios: suma (+), resta (-), producto (*), divisin (/) y mdulo (%) checked( [<expresinAritmtica>] ) y unchecked( [<expresinAritmtica>] ): calcula el resultado de expresinAritmtica y evala si se produce desbordamiento. En caso afirmativo se producen las siguientes situaciones: Si es checked, se lanza un error de compilacin si se tratan de constantes o una excepcin en tiempo de ejecucin de tipo System.OverflowException si son variables. Si es unchecked, se trunca el resultado.
35
Sintaxis bsica
Operadores
Operadores lgicos Unarios: not (!) Binarios perezosos (no evalan la condicin cuando se deduce el resultado de un operando): and (&&), or (||) y xor (^^). Binarios no perezosos (evalan toda la condicin): and (&), or (|) y xor (^) Operadores relacionales Igualdad (==), desigualdad (!=), mayor que (>), menor que (<), mayor o igual que (>=) y menor o igual que (<=). Operadores de manipulacin de bits And (&), or (|), not (~), xor (^), desplazamiento hacia la izquierda N posiciones (<< <nmero>) e dem hacia la derecha (>> <nmero>)
36
Sintaxis bsica
Operadores
Operadores de asignacin El operador bsico es (=) que, a parte de asignar, devuelve el valor asignado. La asignacin es asociativa por la derecha. Operadores compuestos: realizan una operacin y asignan el resultado. Existen para la suma (+=), resta (-=), producto (*=), divisin (/=), mdulo (%=), las operaciones bit a bit de and (&=), or (|=), xor (^=) y los desplazamientos de bits (<<= y >>=) Operadores incrementales: realizan un incremento (++) o decremento (--) de una unidad en una variable. Si el operador se coloca antes del nombre de la variable devuelve el valor de la variable antes de incrementarla; si se hace despus, se incrementa y devuelve el valor ya incrementado
37
Sintaxis bsica
Operadores
Ejemplos de asignacin:
a = 56; //asign. bsica b = 78 + a; //asign. bsica c += 23; //asign. compuesta. Equivale a c i++; //Incremento. Equivale a i = i + d = i++; //Asigna e incrementa. Si i vale inicio, d vale 3. d = ++i; //Incrementa y asigna. Si i vale inicio, d vale 4
= c + 23 1 3 al 3 al
38
Sintaxis bsica
Operadores
Operadores con cadenas Se usa (+) para concatenar (unir) cadenas. Se pueden concatenar cadenas con caracteres. Ejemplo: Hola + Mundo y Hola Mund + o devuelven Hola Mundo Operadores de acceso a objetos Para acceder a los miembros de un objeto se usa el operador punto (.) entre el nombre del objeto y el nombre del miembro.
39
Sintaxis bsica
Operadores
Operadores de conversin de tipos Se usa ((<tipo>) <expresion>) seguido de una expresin para transformar sta en el tipo que se halla encerrado entre parntesis. Tambin se puede usar <expresion> as <tipo> para tal acometido. Las conversiones de tipos de menor capacidad a otros de mayor (por ejemplo, byte int o int long) son implcitas y no son necesarios operadores. Ejemplos:
int i = 4; double d = 8; d = i; //conversin implcita porque double es //ms amplio que int i = (int)d; //conversin explcita. Se trunca valor. i = d as int //conversin explcita
el
40
Sintaxis bsica
Operadores
Operador condicional Es el nico de C# con tres operandos, cuya sintaxis es: <condicin> ? <expresin1> : <expresin2> Se evala <condicin>. Si es cierta se devuelve el resultado de evaluar <expresin1> y si es falsa, <expresin2> Ejemplo: max = (a>b)?a:b; pregunta si a es mayor que b y devuelve a en caso afirmativo y b en caso contrario. No confundirlo con una sentencia ifelse ya que el operador condicional siempre devuelve un valor, pero ifelse no (aunque se puede usar de forma similar). Es un operador asociativo por la derecha: a?b:c?d:e equivale a a?b:(c?d:e)
41
Sintaxis bsica
Control de flujo
Sentencia condicional if
if(<condicin>){ <instrucciones> }else { <instrucciones> } Ejemplo: if(a > b){ Console.WriteLine(A gana); } else { Console.WriteLine(B gana); } if(<condicin>){ <instrucciones> } else if(<condicin2>) { <instrucciones> } //N condiciones else if
42
Sintaxis bsica
Control de flujo
Sentencia condicional switch - case
switch(<expresin>){ case <constante1>: <instrucciones> break; case <constante2>: <instrucciones> break; //N valores case <constanteN>: <instrucciones> break; default: <instrucciones> } Ejemplo: switch(estado){ case 0: Console.WriteLine(Estoy triste); break; case 1: Console.WriteLine(Estoy serio); break; case 2: Console.WriteLine(Estoy feliz); break; default: Console.WriteLine(No estoy); }
43
Sintaxis bsica
Control de flujo
Sentencias iterativas while y do - while
while(<condicin>){ <instrucciones> }
44
Sintaxis bsica
Control de flujo
Sentencias iterativas for y foreach
for(<declaracin>; <condicin>;<instruccin>){ <instrucciones> } Ejemplo: int[] v = {4,7,9,1,5,0}; for(int i = 0; i < v.Length; i++){ Console.WriteLine(v[i]); } foreach(<tipo> <variable> in <array o coleccin>){ <instrucciones> } Ejemplo: int[] v = {4,7,9,1,5,0}; foreach(int a in v){ Console.WriteLine(a); }
45
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
46
Arrays
Conceptos y declaracin
Una array es un conjunto ordenado de objetos del mismo tipo y tamao fijo. Se trata como un objeto. Se declara con la siguiente sintaxis: <tipoDatos>[] <nombreArray>; Ejemplo: un array que almacenase enteros se declarara as int[] miArray; No obstante, este array no almacena nada ya que su valor es null. Si se desea de verdad que almacene objetos hay que indicar cul es su tamao (cuntos objetos podr almacenar), que se hace con la siguiente sintaxis: <tipoDatos>[] <nombreArray> = new <tipoDatos>[<nmDatos>] int[] miArray = new int[50];
47
Arrays
Conceptos y declaracin
En el ejemplo anterior, todas las posiciones se inicializan al valor por defecto de cada tipo de datos (0 en el caso de enteros). Si queremos dar un valor a cada posicin, hemos de usar la siguiente sintaxis: <tipoDatos>[] <nombreArray> = new <tipoDatos>[]{valores} int[] miArray = new int[]{1,7,3,0}; Int[] miArray = {1,7,3,0}; Los arrays no pueden ser redimensionados. Al declarar el tamao de un array, se puede usar cualquier expresin avaluada como entera, no hace falta que sea un valor numrico constante. int n = 4; int[] miArray = new int[n+6];
48
Arrays
Acceso a elementos
Se usa [<posicinElemento>] detrs del identificador de array para acceder al elemento contenido en esa posicin. Cuidado! En C#, los arrays se indizan desde 0, es decir, el primer elemento es el 0 y el ltimo el N-1 vec[0] devuelve el primer elemento vec[9], devuelve el dcimo elemento y vec[i], el i-1simo. Hay que ir con precaucin al acceder a los elemento de un array. Si se especifica una posicin superior al nmero de elementos del array se lanza una excepcin del tipo System.OutOfBoundsException. Para saber el tamao de un array, basta con consultar el atributo Length de ste. miArray.Length
49
Arrays
Arrays dentados
Una array dentado es un array cuyos elementos son a su vez arrays. Se pueden anidar tantos niveles de arrays como se desee, aadiendo corchetes por cada nuevo nivel. No es necesario que cada array tenga el mismo tamao que los dems. Ejemplos de declaracin y acceso: int[][] miArray = new int[2][]; int[][] miArray = new int[2][]{new int[]{1,2},new int[]{3,4,5}} int[][] miArray = new int[][]{new int[]{1,2},new int[]{3,4,5}} int[][] miArray = {new int[]{1,2}, new int[]{3,4,5}} miArray [2][6] = miArray [i+2][3] No se permite especificar el tamao de cada dimensin en la declaracin del array. As la siguiente declaracin no est permitida: int[][] miArray = new int[3][4];
50
Arrays
Arrays multidimensionales
Un array multidimensional es un array cuyos elementos se encuentran organizados siguiendo una estructura de varias dimensiones. Se declaran de forma parecida a los de una sola dimensin, pero separando las dimensiones con comas (,). No es obligatorio indicar el tamao en la declaracin int[,] miArray; int[,] miArray = new int[3,4]; Tambin podemos indicar en la declaracin los elementos del array int[,] miArray = new int[3,3]{{1,2,3},{4,5,6},{7,8,9}}; int[,] miArray = {{1,2,3},{4,5,6},{7,8,9}}; El acceso a un elemento se realiza indicando los ndices miArray [1,2] = 45;
51
Arrays
Arrays mixtos
Los arrays mixtos son arrays formados por la combinacin de los arrays
anteriormente citados. Para declararlos y manipularlos basta solo combinar las notaciones ya vistas para los dentados y los multidimensionales. As declarar un array de arrays multidimensionales cuyos elementos son arrays simples de enteros sera as: int[][,][] miArray;
52
Arrays
La clase System.Array
Todo array que definamos hereda directamente de System.Array y en consecuencia, dispone de los mtodos y atributos definidos para esta clase. Atributo Length Atributo de slo lectura que indica el nmero actual de elementos que contiene un array. Si el array tiene ms de una dimensin y/o nivel de anidacin, Length indica el nmero total de elementos de todas sus dimensiones y niveles. int array[] = {1,2,3,4}; // Length = 4 int array[][] = {new int[]{1,2},new int[]{3,4,5}}; //Length = 5 int array[,] = {{1,2}, {3,4,5,6}}; //Length = 6
53
Arrays
La clase System.Array
Atributo Rank Atributo de slo lectura que indica el nmero de dimensiones del array. Obviamente, si el array no es multidimensional, vale 1. int array[] = {1,2,3,4}; // Rank= 1 int array[][] = {new int[]{1,2},new int[]{3,4,5}}; //Rank= 1 int array[,] = {{1,2}, {3,4,5,6}}; //Rank= 2 Mtodo GetLength(int dimension) Devuelve el nmero de elementos de la dimensin especificada. Las dimensiones empiezan a contarse desde cero int array[,] = {{1,2}, {3,4,5,6}}; array.GetLength(0); //devuelve 2 array.GetLength(1); //devuelve 4
54
Arrays
La clase System.Array
Mtodo CopyTo(Array destino, int posicin) Copia todos los elementos del array origen en el de destino a partir de la posicin pasada como parmetro. Los dos arrays han de ser unidimensionales y no han de valer null. EL array de destino ha de ser de un tipo compatible con el array origen. El ndice posicin ha de estar dentro del rango de posiciones del array. Si no se respetan estas restricciones, saltan diversas excepciones. int array1[] = {1,2,3,4}; int array2[] = {5,6,7,8}; array1.CopyTo(tabla2,0); //array2 := {1,2,3,4} A parte de estos mtodos, la clase System.Array dispone de otros mtodos tiles tales como ordenaciones, bsquedas, etc.
55
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
56
57
58
59
60
61
} Cada vez que se quieran ejecutar, basta con referenciarlas a travs de dicho nombre en vez de tener que reescribirlas. Dentro de un mtodo es posible acceder con total libertad a los atributos de la clase donde est definido el mtodo Es preciso sealar que en C# los literales se tratan como objetos y como tales podemos invocar mtodos sobre ellos.
62
63
64
//No! //Ok!
Ambigedad
entre
atributo
66
67
68
69
70
71
72
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
73
Interfaces
Concepto de interfaz
Una interfaz (o interface) es la definicin de un conjunto de mtodos u otros miembros para los que no se da una implementacin. Su sintaxis es casi similar a la de una clase: <modificadores> interface <nombre>:<interfaces base> { <miembros> } Una interfaz equivale a una clase abstracta cuyos mtodos son todos abstractos y deben ser implementados en sus subclases. La diferencia entre definir una interfaz y una clase abstracta con mtodos abstractos radica en que las interfaces permiten herencia mltiple.
74
Interfaces
Definicin de una interfaz
Slo se permiten declarar mtodos, propiedades, indizadores y eventos. No se permiten ni atributos, ni constructores, ni destructores ni operadores. Implcitamente, los miembros se declaran como public y abstract. Por lo tanto el resto de modificadores no se permiten (tampoco static) salvo new (en el caso que se quiera ocultar la definicin de la interfaz padre). Las interfaces no admiten miembros estticos. public interface IfaceA { int propiedad{get;} void comun(int x); } public interface IFaceB { int this[int i]{get; set;} void comun(int x); }
75
Interfaces
Herencia
Cada interfaz puede heredar de varias interfaces (que se indicaran en la zona de herencia separadas entre comas) pero nunca de clases o estructuras. Las clases tambin pueden heredar de varias interfaces junto con su clase padre. Hay que asegurar entonces que se redefinen todos los miembros declarados en las interfaces y declararlos como pblicos (no hace falta usar el modificador override). Se pueden usar los modificadores abstract y virtual en la redefinicin de miembros heredados de interfaz. Esto implicara una redefinicin en las clases hijas con la partcula override.
76
Interfaces
Herencia
public interface IfaceA { int A(); //No lleva public ni abstract (implcitos) }
public interface IfaceB { int B(); } public class Cls: IfaceA, IfaceB { //Implem. de A. No lleva override (implcito) public int A(){ return 3; } //Implem. De B. Puede llevar virtual. public virtual int B(){ return 8; } }
77
Interfaces
Acceso a miembros
Se puede acceder a los miembros de una interfaz implementados en una clase de la misma manera que accederamos a los miembros propios de la clase. Retomando el ejemplo anterior: Cls miCls = new Cls(); int k = miCls.A(); Tambin es posible definir variables de tipo interfaz. Aunque no existen constructores, se pueden inicializar a travs del polimorfismo. IfaceB ifB = new Cls();//Permitido porque Cls hereda de IfaceB int k = ifB.B(); A travs de estas variables slo se pueden acceder a los miembros definidos en la interfaz, no aquellos otros definidos en la clase.
78
Interfaces
Implementacin explcita
Cuando una clase hereda de dos o ms interfaces con un mismo miembro (por ejemplo, un mtodo con mismo nombre y parmetros), su implementacin valdr para las todas las interfaces. Sin embargo, tambin es posible dar una implementacin diferente para cada una usando una notacin explcita: Se antepone al nombre el nombre de la interfaz seguido de punto (.). No debe llevar el modificador public ni tampoco virtual ni abstact. Para acceder a los miembros implementados como explcitos en una clase no se puede acceder a travs de un objeto de tipo clase, sino que se debe hacer como objetos de la interface. As se deshacen las ambigedades
79
Interfaces
Implementacin explcita
public interface IfaceA { int F(); }
public interface IfaceB { int F(); } public class Cls: IfaceA, IfaceB { void IfaceA.F(){ //implementacin de F de IfaceA return 0; } void IfaceB.F(){ //implementacin de F de IfaceB return 4; } }
80
Interfaces
Implementacin explcita
}
}
81
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
82
El parmetro es una copia de la direccin de memoria. Se pueden modificar los atributos del objeto, pero no la referencia en s misma
void f(Object o){} El parmetro es la direccin de memoria de una referencia (referencia de referencia). Se pueden modificar los atributos del objeto as como la direccin de memoria del objeto. void f(ref Object o){}
84
void f(int x){} El parmetro es una copia de la direccin de memoria de un elemento. El valor original cambia Por referencia al modificar el parmetro
85
86
87
88
89
90
92
95
96
97
Antes de definir un delegado hay que pensar qu tipo de mtodos admitir, es decir, qu tipo de parmetros tendrn los mtodos y cul ser su tipo de retorno (tambin es vlido void). Por ejemplo un delegado pblico llamado Deleg que admita mtodos con un nico parmetro entero y un valor de retorno string se define as: public delegate string Deleg(int val); Los delegados son en el fondo clases especiales. Como clases que son pueden tener modificadores de visibilidad y su declaracin, colocarse dentro o fuera de una clase.
98
99
}
100
101
102
103
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
104
Estructuras y enumeraciones
Estructuras
Una estructura es un tipo especial de clase pensada para representar objetos ligeros, es decir, que ocupen poca memoria y deban ser manipulados con velocidad. Las estructuras no derivan de ninguna clase (salvo System.ValueType) ni pueden ser derivadas de ella. Al contrario de las clases, sus variables no almacenan ninguna referencia a zonas de memoria dinmica sino directamente referencias a los objetos. En consecuencia: Las estructuras son de tipo valor. En las asignaciones entre variables no se copian referencias, sino que se duplican los objetos enteros. Las estructuras no admiten valores null. Se declaran igual que una clase, pero cambiando la palabra class por struct.
105
Estructuras y enumeraciones
Estructuras
struct Point { public double x; public double y;
public Point(int x, int y){ this.x = x; this.y = y; } //ms mtodos } Otras diferencias respecto a las clases: El mtodo Equals() no compara referencias sino que mira que todos los campos de la estructura valen lo mismo. El operador == no es en principio aplicable directamente, luego el programador debe redefinirlo explcitamente para que funcione.
106
Estructuras y enumeraciones
Boxing y unboxing
Las estructuras derivan indirectamente de la clase Object. Por lo tanto, es posible aplicar polimorfismo y asignar una estructura a un objeto Object. Aun y as, no se puede asignar directamente debido a diferencias semnticas y de almacenamiento que existen entre clases y estructuras. Es por ese motivo que a los objetos de tipo valor se les ha de hacer una conversin a tipo referencia llamada boxing. El proceso es sencillo: basta con crear una clase que haga de envoltura del tipo valor: public class T_box { T value; public T_box(T t){ value = t; } }
107
Estructuras y enumeraciones
Boxing y unboxing
El boxing se hace de forma transparente al programador, ya que el compilador se encarga de crear la clase de envoltura. El programador tan slo realiza la asignacin polimrfica y listo. Point p = new Point(0.0,1.0); //Point es una struct Object o = p; //equivale a Object o = new Point_Box(p); El proceso de unboxing es anlogo al anterior pero a la inversa, es decir, recupera la estructura encapsulada de dentro de la clase. Se realiza como un casting normal: Point p2 = (Point) o; //equivale a p2 = ((Point_Box)o).value La comprobacin de tipos en el unboxing es estricta: slo se acepta que el tipo expecificado sea exactamente el mismo que el tipo original. int i = 123; Object obj = i; //boxing long l = (long) obj; //incorrecto. obj es en realidad un int long l = (long) (int) obj; //correcto. Doble conversin
108
Estructuras y enumeraciones
Constructores de estructuras
Los constructores de estructuras difieren un poco respecto los constructores de clase: No pueden llevar el inicializador base ya que no tienen mecanismo de herencia No se pueden leer los atributos de una estructura sin haberlos inicializado antes. Por ese motivo el constructor se usa principalmente para tal efecto. Toda estructura incluye un constructor sin parmetros que le da un valor por defecto a sus atributos. Nunca puede ser redefinido por el programador.
109
Estructuras y enumeraciones
Enumeraciones
Una enumeracin es un tipo de datos en el que los literales de los valores que pueden tomar sus objetos se indican explcitamente en la definicin. enum <nombreEnumeracin>:<tipoBase> { <literales> } enum Tamao { Pequeo, Mediano, Grande} En realidad, las enumeraciones son estructuras que tienen como atributos campos estticos, constantes, pblicos y de alguna tipologa de nmero entero (short, int, long, etc.) Declarar enumeraciones y asignar sus elementos funciona como con cualquier otro atributo. Tamao tam; //declaracin tam = Tamao.mediano //asignacin
110
Estructuras y enumeraciones
Uso de enumeraciones
Cada literal de la enumeracin se representa a nivel interno como un nmero entero empezando desde 0. Se puede cambiar esto asignando valores a los literales siempre que se respeten unas reglas: El valor debe estar comprendido dentro del rango numrico admitido del tipo. Se pueden definir valores de otros literales o cualquier expresin con ellos siempre y cuando no hayan definiciones circulares. El valor por defecto de una variable tipo enumeracin es siempre 0. Se pueden asignar a variables enteras literales de una enumeracin; as: int a = Tamao.pequeo int b = (Tamao)1; Tamao t = (Tamao)4;
111
Estructuras y enumeraciones
Uso de enumeraciones
Para forzar a una enumeracin que sus literales no sean de tipo int hay que indicar en su declaracin el tipo al que pertenecern como si de una herencia se tratase: enum Tamao:long { Pequeo, Mediano, Grande }; Al ser todas ellas de tipo entero, podemos aplicarles operaciones de enteros tales como aritmticas y lgicas. Sin embargo, existen ciertas restricciones: Los operadores binarios + y no pueden aplicarse entre dos enumeraciones. Al menos un operando ha de ser entero. Los operadores |, & y ^ slo pueden aplicarse entre operandos tipo enumeracin
112
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
113
Espacios de nombres
Concepto de espacio de nombres
Un espacio de nombres o namespace es un modo de organizar las clases y otros tipos de datos anlogo a la estructura de directorios y ficheros pero a nivel lgico. La BCL de C# se encuentra organizada dentro de espacios de nombres, de modo que las clases ms usadas se encuentran en el namespace System. Por ejemplo, las clases de acceso a base de datos estn en System.Data y las operaciones de entrada y salida, dentro de System.IO. Para declarar un espacio de nombres se usa la siguiente sintaxis: namespace <nombreEspacio> { <tipos> } Donde <tipos> pueden ser clases, interfaces, estructuras, delegados, etc. Los tipos definidos dentro de esta definicin pasarn automticamente a formar parte del espacio de nombres.
114
Espacios de nombres
Concepto de espacio de nombres
namespace MiEspacio{ public class MiClase{} } El verdadero nombre de una clase, que se denomina nombre completamente calificado, es el nombre de la clase precedido de la concatenacin de espacios de nombres ordenados del ms externo al ms interno y separados por puntos. As el ejemplo anterior resultara MiEspacio.MiClase. Gracias a los nombres completamente calificados resolvemos ambigedades cuando tenemos dos clases que se llaman igual. Debido a que provienen de dos espacios distintos, pueden ser diferenciadas Si se define una clase fuera de un espacio de nombre, sta se asigna automtica al espacio global.
115
Espacios de nombres
Espacio de nombres anidados
C# permite incluir dentro de un espacio de nombres otros subespacios de nombres. Por ejemplo: namespace EspacioA { namespace EspacioB { public class C {} } } Luego, la clase C tiene como nombre calificado EspacioA.EspacioB.C. Es posible compactar definiciones de nombres de espacios anidados usando puntos. As, la siguiente definicin equivale a la anterior: namespace EspacioA.EspacioB { public class C {} }
116
Espacios de nombres
Sentencia using
En principio si se desea acceder a una clase de un determinado espacio de nombres externo al actual, se ha de referir a dicha clase usando el nombre completamente calificado. Retomando el ejemplo anterior, para declarar un objeto de la clase C dentro de un espacio diferente de EspacioA.EspacioB, habra que hacer: EspacioA.EspacioB.C objeto = new EspacioA.EspacioB.C(); Los espacios de nombres suelen ser largos y pesados de escribir. En este escenario entra la sentencia using, que funciona como mecanismo de importacin de nombres, es decir, poder usar nombres de clases sin tener que escribir el nombre completamente calificado. Estas sentencias deben ir dentro del namespace antes de cualquier definicin de clase.
117
Espacios de nombres
Sentencia using
namespace EspA.EspB{ public class Cls1 {} }
namespace EspC { using EspA.EspB; //importamos el namespace EspA.EspB class Cls2 { Cls1 c; //Con using, no hemos de poner EspA.EspB.Cls1 } }
118
Espacios de nombres
Espacios de nombres distribuidos
Se permite declarar varias definiciones del mismo espacio de nombres en un fichero o distintos. Esto es posible gracias a que el compilador las fusiona en una nica definicin de namespace e introduce todas las clases a la vez. namespace A { class B1 {} } namespace A { class B2 {} } El compilador entonces, genera algo del estilo namespace A { class B1{} class B2{} }
119
Espacios de nombres
Ambigedades y alias
Es posible encontrarse con ambigedades cuando tenemos dos clases del mismo nombre al usar sentencias using. //suponemos que en A y B existe una clase C using A; using B; public class Conflicto:C {} En este caso, el compilador lanza un error ya que no sabe si nos referimos a la clase A.C o a la A.B. La primera aproximacin vlida es usar el nombre completamente calificado, pero se ha visto que es un procedimiento largo y tedioso. La otra opcin que permite C# es el uso de alias, es decir, nombres que actan de sinnimos del nombre al que hacen referencia.
120
Espacios de nombres
Alias
Los alias se declaran dentro de la sentencia using: using <alias> = <nombreClase o nombreNamespace> Destacar que los alias pueden hacer referencia a nombres de clase o bien a otros espacios de nombres. As el error de compilacin quedara resuelto de la siguiente manera: using A; using B; using CdeB = B.C; public class Conflicto1:C {} //el compilador escoge A.C public class Conflicto2:CdeB {} //el compilador escoge B.C Cuidado! No se pueden definir alias que hagan referencia a otros alias. Provocara un error de compilacin. namespace N1.N2 {} using A1 = N1; using A2 = A1.N2; // No! error de compilacin.
121
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
122
123
124
125
127
129
130
131
132
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
133
Excepciones
Concepto de excepcin
Una excepcin es un suceso anmalo que ocurre durante la ejecucin de un programa e interrumpe el flujo normal de instrucciones. Las posibles causas del lanzamiento de una excepcin incluyen desde fallos de hardware (desbordamiento, divisiones por 0, etc.) hasta errores de programacin (acceso fuera de rangos de una tabla, fallo de conexiones a bases de datos, etc.), siendo estos ltimos las principales. La gestin de excepciones es el mecanismo que usa y recomienda C# para el control de errores.
134
Excepciones
Ventajas
El mecanismo clsico de gestin de errores consiste en que cada fragmento de cdigo susceptible de error genere un cdigo que debe tratar despus el programador a travs de sentencias if else. Las excepciones ofrecen usa serie de ventajas respecto al mecanismo anterior. Claridad. El control de excepciones separa el cdigo normal del cdigo de control de errores en dos partes bien diferenciadas para separar ambas lgicas y hacer el programa menos lioso. Ms informacin. Las excepciones permiten especificar mensajes para indicar las causas del error y hacer ms trazable el error. Tratamiento asegurado. Se garantiza que en caso de error, la excepcin ser tratada y de no serlo, se abortar la ejecucin del programa.
135
Excepciones
Capturando excepciones
El control de excepciones se estructura en tres bloques: Bloque try. Incluye las instrucciones normales de cdigo. Si se detecta el lanzamiento de una excepcin se interrumpe el flujo de ejecucin y se pasa a ejecutar el bloque catch. Bloque catch. Incluye las instrucciones que tratarn la excepcin generada. Un bloque catch dispone siempre de una referencia a la excepcin generada para poder acceder a informacin extra sobre la causa y la trazabilidad. Bloque finally. Incluye instrucciones que se ejecutarn siempre, se haya producido una excepcin o no. Es decir, si el bloque try no lanza excepcin alguna se pasa a ejecutar finally y si se lanza, despus del catch tambin se ejecutar finally. Se usa principalmente para liberar recursos o destruir objetos.
136
Excepciones
Capturando excepciones
public void division(int num, int den){ Console.WriteLine(Inicio de programa); try{ int result = num / den; Console.WriteLine(El resultado es {0},result); }catch (DivideByZeroException ex) { Console.WriteLine(Error! Se ha intentado dividir por 0); }finally{ Console.WriteLine(Fin de programa); } }
137
Excepciones
Capturando mltiples excepciones
C# ofrece la posibilidad de capturar mltiples excepciones en un nico bloque try. Para ello basta con definir varios bloques catch, uno por cada excepcin que se desee tratar. Los bloques catch se ejecutan en secuencia, de forma que es importante definir su orden, sobre todo cuando existe una jerarqua de excepciones ya que por polimorfismo una excepcin padre puede capturar excepciones hijas. Conviene siempre capturar primero las excepciones ms concretas y dejar como ltimas las ms genricas (siendo la ms bsica, System.Exception, la ltima)
138
Excepciones
Capturando mltiples excepciones
public void acceso(int[] vec, int index){ try { Console.WriteLine(El valor es {0}, vec[index]); } catch (NullReferenceException re){ Console.WriteLine(Error 1! + re.Message); } catch (IndexOutOfRangeException ie){ Console.WriteLine(Error 2! + ie.Message); } }
139
Excepciones
Lanzando excepciones
A parte de capturar excepciones, el lenguaje permite definir momentos en los cuales lanzar una excepcin. Para lanzar una excepcin se usa la palabra throw seguida de una expresin que devuelta una referencia a una excepcin. throw <expresionExcepcin> Resulta conveniente cuando se desea propagar una excepcin para que en otra regin de cdigo (o clase) sea capturada.
public double raizCuadrada(double num){ if(num < 0.0){ throw new ArgumentException(Argumento negativo); } return Math.sqrt(num); }
140
Excepciones
Excepciones personalizadas
La BCL de C# incluye una coleccin extensa de excepciones que resuelven la mayora de errores comunes cuando uno programa. No obstante hay veces en que se desea una excepcin personalizada dentro de un programa para tratar nuevas casusticas de situaciones extraas. C# permite la creacin de estas excepciones heredando de la clase base de excepciones System.Exception. Se recomienda que el nombre de clase de la excepcin indique la causa de su lanzamiento y que termine con el sufijo Exception para su rpida identificacin. Se deberan declarar dos constructores: el constructor vaco y otro con un parmetro string que simbolice el mensaje de error.
141
Excepciones
Propagando excepciones
Si una excepcin no se captura dentro de un mtodo decimos que se propaga hacia niveles superiores. Es decir, se delega la responsabilidad de captura al mtodo que llam al mtodo que gener excepcin, y as sucesivamente. Si una excepcin no se captura en ningn mtodo a travs de un bloque try catch se finaliza el hilo de ejecucin y si este hilo es el principal, entonces se aborta el programa. Las excepciones ofrecen una propiedad interesante llamada StackTrace que nos escribe la pila de llamadas a mtodos desde Main() hasta aqul que gener la excepcin y la lnea donde se produjo. Esto es muy til de cara a detectar errores de programacin y corregirlos.
142
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
143
Estructuras de datos
Introduccin
Las llamadas Colecciones son una agrupacin de clases de .NET Framework que sirven para almacenar conjuntos de datos, siendo, cada instancia de estas clases, una coleccin de elementos. Las colecciones permiten almacenar conjuntos de datos utilizando estructuras sin preocuparse de cmo estn implementadas, que es una forma til de aplicar la reutilizacin. As se codifica ms rpidamente y se obtiene un mayor rendimiento mejorando la velocidad de ejecucin y reduciendo el consumo de memoria. Se explicarn con ms detalle: Las interfaces de coleccin que describen las posibilidades de cada tipo Las clases de implementacin Los enumeradores que permiten recorrer las colecciones
144
Estructuras de datos
Ventajas
Las ventajas de utilizar colecciones son obvias: No se necesita escribir una librera de utilidades para almacenar la informacin. El API de colecciones est pensada para un gran rango de usos y est optimizada Es extensible Comienza a ser muy utilizada por la comunidad de programadores, estandarizando el modelo de desarrollo
145
Estructuras de datos
Espacios de nombres
La plataforma .NET suministra tres espacios de nombres dedicados a las colecciones: System.Collections. Contiene colecciones que almacenan referencias a objetos. System.Collections.Generic. Alberga clases genricas para guardar colecciones de tipos especificados. System.Collections.Specialized. Contiene varias colecciones que soportan tipos especficos como strings y bits.
146
Estructuras de datos
Interfaces
Todas las colecciones de .NET Framework implementan alguna combinacin de las interfaces de coleccin. Estas interfaces declaran operaciones que se aplican de modo genrico sobre varios tipos de colecciones. Todas ellas estn declaradas en el espacio System.Collections y tienen otras similares en System.Collections.Generic. La implementacin de estas interfaces se incluye dentro de la plataforma.
147
Estructuras de datos
Interfaces
Interfaz Descripcin La interfaz raz de la jerarqua de colecciones de la cual heredan las interfaces IList y Dictionary. Contiene propiedades como Count, CopyTo Coleccin ordenada que se manipula como un array. Accede a sus elementos por medio de un ndice entero. Tambin permite bsquedas, inserciones, modificaciones, etc. Coleccin de valores indexados por una clave (objeto arbitrario). Accede a los elementos por indexacin y mtodos para modificar la coleccin. La propiedad Keys contiene los objetos usados como ndices y Values, los objetos almacenados. Un objeto puede ser enumerado. Esta interfaz slo tiene un mtodo, GetEnumerator, que devuelve un objeto IEnumerator. ICollection implementa IEnumerable, de modo que todas las clases de coleccin tambin.
148
ICollection
IList
IDictionary
IEnumerable
Estructuras de datos
Colecciones no genricas
El espacio de nombres System.Collections es la fuente de las colecciones no genricas. Estas clases ofrecen implementaciones estndar de muchas estructuras de datos que almacenan referencias de tipo Object. Se tratarn las clases ArrayList, HashTable, Stack y Queue.
149
Estructuras de datos
Clases
Clase Array ArrayList BitArray HashTable Queue SortedList Stack Implementa IList IList ICollection IDictionary ICollection IDictionary ICollection Descripcin Clase base de los arrays convencionales. Imita los arrays convencionales con posibilidades de aadir o quitar datos. Array de booleanos. Agrupacin de parejas clave-valor. Coleccin de tipo FIFO (first-in first-out). Una HashTable que ordena datos por clave y se acceden a travs de clave o ndice. Una coleccin de tipo LIFO (last-in first-out).
150
Estructuras de datos
Colecciones genricas
Las colecciones de Object acaban resultando pesadas en el trato ya que es necesario hacer downcasting cada vez que se desea acceder a sus valores. Adems, estas colecciones son inseguras a nivel de tipos ya que podemos mezclar en ellas objetos de cualquier tipo (por ejemplo, int con boolean) con sus consecuentes excepciones en tiempo de ejecucin. Por estos motivos, C# introdujo en su versin de 2005 los tipos genricos, pensados para hacer ms robusta la programacin genrica. Para definir una clase con tipos genricos, basta con encerrar entre < > identificadores que harn referencia al tipo. class Lista<X> {} class Diccionario<Clase,Valor>{}
151
Estructuras de datos
Tipos genricos: definicin y uso
Para definir una clase con tipos genricos, basta con encerrar entre < > los identificadores que harn referencia a los tipos. class Lista<T> {} class Diccionario<Clase,Valor>{} Para utilizar objetos tipo dentro de la clase hay que usar el identificador especificado en la definicin. T varT; public void add(T t){} Cuando se desee usar un objeto de la clase genrica en otra regin de cdigo, habr que especificar un tipo de datos concreto y existente. IList<string> lista = new ArrayList<string>();
152
Estructuras de datos
Tipos genricos: restricciones
A los tipos de una clase genrica se les pueden aadir ciertas restricciones: De derivacin. Los tipos pueden heredar de cualquier clase, interfaz u otro tipo. As se restringe los tipos que puede tratar una clase genrica. Para indicarlo hay que aadir la palabra where en la definicin de la clase indicando el tipo y el tipo base del cual hereda. class AVL<T> where T: IComparable {} De construccin. No se pueden crear instancias del tipo con new salvo que se haga con el constructor por defecto. Hay que explicitarlo dentro de la clusula where. class MyList<T> where T: new() { T unT = new T(); Se permite la combinacin de ambas restricciones.
153
Estructuras de datos
Tipos genricos: herencia y operadores
Los tipos genricos admiten herencia y la propagacin de tipo es de dos maneras: definiendo un tipo concreto o bien definiendo el mismo que el de la clase base. public class ListaHija1<int> : ListaPadre<T> {} public class ListaHija2<T> : ListaPadre<T> {} Se permiten declarar clases abstractas genricas y con mtodos virtuales. public abstract class ListaAbstracta<T>{} C# permite tambin redefinir operadores en una clase de tipos genricos. Esto no es vlido para la versin 2.0 e inferiores. public class MiLista<T> { public static operator +(MiLista<T> l1, MiLista<T> l2){} }
154
Estructuras de datos
Clases genricas
Clase Dictionary<K,E> SortedDictionary<K,E> LinkedList<E> List<E> SortedList<K,E> Stack<E> Queue<E> Implementa Descripcin Coleccin genrica de parejas IDictionary<K,E> clave-valor que se acceden por una clave. IDictionary<K,E> ICollection<E> Ilist<E> IDictionary<K,E> ICollection<E> ICollection<E> Diccionario que ordena los datos por clave en un rbol binario. Lista doblemente enlazada ArrayList, ahora genrico.
Estructuras de datos
Enumeradores
A la hora de recorrer una coleccin podemos optar por un mecanismo de enumeradores o iteradores, que permiten el acceso secuencial a sus elementos. Para poder usar un enumerador dentro de una coleccin es necesario que sta implemente la interfaz IEnumerable, cuyo nico mtodo, GetEnumerator(), devuelve un objeto de la interfaz IEnumerator, que recorre la coleccin. Es muy importante su uso debido a que la instruccin iterativa foreach hace uso de ellos de forma transparente y sencilla al programador, razn de ms para definirlos en colecciones personalizadas.
156
Estructuras de datos
Enumeradores
Es necesario que cada coleccin que use un enumerador cree la implementacin interna de IEnumerator, que ha de tener los siguientes miembros: Un constructor con un parmetro cuyo tipo sea la coleccin para la que definimos el enumerador Propiedad Current. Devuelve un objeto o tipo genrico que representa el elemento actual. Mtodo MoveNext. Avanza una posicin dentro de la coleccin y devuelve un valor booleano indicando si existen ms elementos. Mtodo Reset. Posiciona el iterador en el primer elemento de la coleccin. Se recomienda que la clase que implementa IEnumerator sea una clase interna y privada de la coleccin.
157
Estructuras de datos
ArrayList
La clase ArrayList imita la funcionalidad de los arrays convencionales y ofrece la posibilidad de redimensionar su tamao a travs de los mtodos de su clase. Todo ArrayList tiene un tamao (el nmero de elementos que hay actualmente) y una capacidad (el nmero de elementos que puede llegar a tener sin redimensionar). Si el tamao de un ArrayList supera la capacidad, sta ltima se dobla (se crea un nuevo ArrayList el doble de grande con los mismos elementos).
158
Estructuras de datos
ArrayList
Mtodo / Propiedad
int Add(Object) int Capacity(get; set;) void Clear() bool Contains(Object)
Descripcin
Aade el objeto al ArrayList al final y devuelve un nmero entero indicando la posicin. Propiedad que establece o consulta el nmero de elementos que puede contener el ArrayList Borra todos los elementos del ArrayList Comprueba si existe un determinado objeto en el ArrayList Propiedad de slo lectura que obtiene el nmero de elementos contenidos realmente en el ArrayList. Capacity indica los que puede contener como mximo. Devuelve el ndice del primer elemento del objeto especificado que se encuentre. Inserta un elemento en la posicin indicada por el nmero Quita la primera ocurrencia de un objeto concreto del ArrayList 159
int Count(get;)
int IndexOf(Object) void Insert(int, Object) void Remove(Object)
Estructuras de datos
ArrayList
string values[] = {Senatvs, Popvlvs, Qve, Romanvs} ArrayList listValues = new ArrayList(); foreach(string word in values){ listValues.add(word); } for(int i = 0; i < listValues.Count; i++){ Console.WriteLine(Posicion {0} -> {1}, i, listValues[i]); } Console.WriteLine(La capacidad es de {0}, listValues.Capacity);
160
Estructuras de datos
Tablas Hash
Una tabla hash es una estructura de datos que mapea claves con valores y permite accesos eficientes a los datos. Se usa cuando tenemos un volumen grande de datos y las bsquedas a stos han de ser los ms rpidas posibles. A nivel interno, las tablas de hash son arrays de gran capacidad que transforman las claves en un ndice entero del array a travs de una funcin de hash. Si dos claves tienen el mismo valor al aplicar la funcin de hash, se produce una colisin. Existen varias formas de tratarlas (listas, siguiente posicin ,etc.) El factor de carga es la relacin mxima de elementos por sectores de almacenamiento. Un factor de carga inferior implica una bsqueda ms rpida a costa de un mayor consumo de memoria.
161
Estructuras de datos
HashTable
La clase HashTable implementa este tipo de estructura de datos. La funcin de Hash ya viene definida en todas las clases ya que la clase Object dispone del mtodo GetHashCode. La mayora de las clases que son candidatas a ser usadas como claves en una HashTable sobreescriben este mtodo para ofrecer una manera de efectuar clculos eficientes de hashing para un tipo especfico. Se puede variar el factor de carga con un nmero proporcionado en el constructor de la clase.
162
Estructuras de datos
HashTable
Mtodo / Propiedad Descripcin
Esta variedad del constructor crea un objeto HashTable con la capacidad inicial, factor de carga y comparador predeterminados. Propiedad que obtiene el nmero de elementos de la HashTable. Obtiene o establece el valor asociado a la clave especificada. Propiedad que obtiene una ICollection con las claves de la HashTable. Propiedad que obtiene una ICollection con los valores de la HashTable. Aade un elemento con la clave y valor indicados como argumentos. Borra el elemento cuya clave coincida con la especificada. Determina si la HashTable contiene una clave especfica. 163
HashTable() int Count(get;) Object Item[Object(set;get;)] ICollection Keys(get;) ICollection Values() void Add(Object, Object) void Remove(Object) Boolean Contains(Object)
Estructuras de datos
Stack
La clase Stack (pila) representa una coleccin sencilla de objetos en la que se aplica el algoritmo LIFO (last-in first-out). Slo se pueden aadir y sacar objetos por un nico punto de entrada llamado cima. Para sacar un objeto por debajo de la cima se debe sacar previamente todos aquellos que estn por encima.
164
Estructuras de datos
Stack
Mtodo / Propiedad
Stack()
Descripcin
El constructor est sobrecargado tres veces. Esta variante crea un Stack vaco con una capacidad inicial predeterminada de 10 elementos. Propiedad que obtiene el nmero de elementos de la pila. Quita y devuelve el objeto situado en la cima de la pila. Causa una InvalidOperationException si est vaca. Inserta un elemento al principio del Stack.
int Count(get;)
Object Pop()
void Push(Object)
bool Contains(Object)
Object Peek()
165
Estructuras de datos
Stack
public static void Main(){ // Crea e inicializa un nuevo Stack. Stack miPila = new Stack(); miPila.Push(Hola); miPila.Push(Mundo); miPila.Push(!); // Muestra propiedades y valores de la pila. Console.WriteLine( MiPila ); Console.WriteLine( "\tCuenta: {0}, miPila.Count ); Console.Write( "\tValores: ); MuestraValores( miPila ); }
public static void MuestraValores( IEnumerable miColeccion ) { foreach ( Object obj in miColeccion ) Console.Write( {0}, obj ); }
166
Estructuras de datos
SortedDictionary<K,E>
Un diccionario es el trmino general para una coleccin que almacena pares de clave y valor. Las tablas de hash son un modo de implementar un diccionario, pero no el nico. .NET Framework ofrece varias implementaciones de diccionario, tanto genricas como no genricas y todas implementan la interfaz IDictionary. Una clase del grupo de las genricas muy usada es SortedDictionary<K,E>. En lugar de una tabla hash, utiliza un rbol binario que est ordenado por las claves. Los mtodos de esta clase son similares a los de la clase Hashtable.
167
Estructuras de datos
SortedDictionary<K,E>
Mtodo / Propiedad
int Count(get;) ICollection<K> Keys Icollection<E> Values
Descripcin
Devuelve el nmero de entradas incluidas en el diccionario. Obtiene una coleccin con todas las claves del diccionario. Obtiene una coleccin con todos los valores del diccionario. Agrega un elemento al diccionario y lo ordena segn su clave. Comprueba si la clave existe y en caso afirmativo devuelve su valor asociado.
void Add(K,E)
bool TryGetValue(K, out E)
bool ContainsKey(K)
bool ContainsValue(E)
bool Remove(K)
Estructuras de datos
SortedDictionary<K,E>
public static void Main( string[] args ) { // creamos un nuevo Sorted Dictionary con lo que teclee el usuario SortedDictionary<string,int> dicc = new SortedDictionary <string,int>(); Console.WriteLine( Teclea una frase: " ); string frase = Console.ReadLine(); // Partimos la frase en palabras (array) string[] pals = Regex.Split (frase, @"\s+"); foreach (string palabra in pals) { if (dicc.ContainsKey(palabra)) // Si aparece la palabra ++dicc [palabra]; // sumamos al nmero de repeticiones else // Aadimos nueva palabra y su nm. Ocurrencias dicc.Add( palabra, 1 ); // Muestra el contenido del Sorted Dictionary DisplayDictionary( dicc); }
169
Estructuras de datos
LinkedList<E>
La clase LinkedList implementa una lista doblemente enlazada. Permite recorrerla hacia delante y hacia atrs con nodos de la clase genrica LinkedListNode. Cada nodo contiene la propiedad Value (valor almacenado) y las propiedades de slo lectura Previous y Next. La propiedad Previous obtiene una referencia al nodo precedente de la lista enlazada o null si el nodo es el primero de la lista. Similarmente, Next obtiene la referencia al siguiente dato de la lista o null si es el ltimo.
170
Estructuras de datos
LinkedList<E>
Mtodo / Propiedad
int Count(get;) LinkedListNode<E> First(get;) LinkedListNode<E> Last(get;) void AddAfter(nodo, nodoNuevo) void AddBefore(nodo, nodoNuevo) void AddFirst(nodo) void AddLast(nodo) bool Find(E) Bool FindLast(E) void RemoveFirst() void RemoveLast() void Remove(nodo) void Clear()
Descripcin
Devuelve el nmero de entradas incluidas en la lista. Obtiene el primer y el ltimo nodo de la lista respectivamente. Aade un nuevo nodo antes o despus del nodo indicado. Aade un nuevo nodo al principio o al final de la lista. Encuentra la primera o la ltima ocurrencia del valor especificado. Borra el primer o ltimo nodo de la lista Borra el nodo especificado de la lista. Borra todos los nodos de la lista y la deja vaca. 171
Estructuras de datos
LinkedList<E>
// Creamos y manipulamos una lista enlazada public static void Main(string[] args){ readonly string[] colores = { negro, amarillo, verde", azul, violeta, plata };
LinkedList<string> lista = new LinkedList<string>(); // aade elementos a la primera lista enlazada foreach ( string color in colores ){ lista1.AddLast( color ); } // escribimos la lista original Console.WriteLine(lista); //realizamos unos cambios lista.AddFirst(oro); lista.RemoveLast(); Console.WriteLine(lista); Console.WriteLine(Contiene plata? {0},lista.Find(plata); }
172
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
173
Ficheros y Streams
Persistencia de datos
Las variables y colecciones slo almacenan datos de forma temporal. Los datos se pierden cuando la variable est fuera de mbito o bien cuando el programa termina. En contrapartida, los ficheros permiten retener esos datos ya que se almacenan en un medio fsico (disco, cinta, etc.). Estos datos se suelen llamar datos persistentes. Por esas dos razones es muy necesario que el programador conozca cmo el lenguaje en el que programa accede y manipula los ficheros del sistema.
174
Ficheros y Streams
Ficheros en C#
C# contempla cada fichero como una secuencia de bytes. Cuando un fichero se abre, se crea un objeto y un flujo (secuencia o stream) se asocia con ese objeto. Estos objetos facilitan la comunicacin entre un programa y un fichero o dispositivo. Cuando se ejecuta un programa, el entorno de ejecucin crea un objeto consola (Console) con tres flujos: Console.out es la salida estndar asociada a la pantalla. Console.in es la entrada estndar asociada al teclado. Console.error es la salida de mensajes de error, asociada tambin a la pantalla.
175
Ficheros y Streams
Clases bsicas
El espacio System.IO contiene una buena cantidad de mtodos para leer y escribir archivos. File y Directory manipulan con utilidades los ficheros y directorios del sistema de archivos. Path es una clase de mtodos estticos que ofrece utilidades para el manejo de la ruta de un archivo. Sus mtodos se basan en operaciones sobre string que contienen la ruta. La clase abstracta Stream ofrece la funcionalidad para representar streams como bytes. Las clases FileStream, MemoryStream y BufferedStream heredan de Stream y aaden algunas caractersticas propias. FileStream se usa para escribir y leer datos de ficheros.
176
Ficheros y Streams
Ficheros y directorios
Bsicamente hay cuatro clases para manejar los directorios (carpetas) y ficheros (archivos) de un disco duro. Directory es una clase de mtodos estticos y por lo tanto pueden usarse sin necesidad de instanciar ningn objeto. Todos los mtodos requieren especificar la ruta sobre la cual se trabajar. DirectoryInfo, al contrario, es una clase de instancia, es decir, que necesita de objetos para poder operar. Para operar con un directorio hay q indicarle su ruta en el constructor del objeto. File y FileInfo son anlogas a Directory y DirectoryInfo respectivamente pero orientada al trato de ficheros. Se recomienda que si se va a usar varias veces el acceso a ficheros no se implemente a travs de las clases estticas.
177
Ficheros y Streams
La clase File
Mtodo / Propiedad
AppendText
Descripcin
Devuelve un StreamWriter que aade texto a un fichero existente o creado
Copy
Create CreateText Delete Exist GetCreationTime GetLastAccessTime GetLastWriteTime Move Open OpenRead/Text/Write
Ficheros y Streams
La clase Directory
Mtodo / Propiedad
CreateDirectory Delete
Descripcin
Crea un directorio y devuelve su objeto DirectoryInfo asociado. Borra el directorio indicado.
Exists
GetDirectories GetFiles GetCreationTime GetLastAccessTime
GetLastWriteTime
Move
Ficheros y Streams
Secuencias
Las clases de secuencia o streams proporcionan un mecanismo para hacer referencia a un espacio de datos, los cuales de normal se leen y almacenan uno detrs de otro. Comparten una base comn llamada Stream que est definida en el espacio de nombres System.IO y que contiene propiedades y mtodos que permiten a los programas trabajar con secuencias de datos. Existen varias clases que derivan de ella y proporcionan una implementacin especfica usada para un entorno particular. Slo admiten acceso a datos a nivel de byte con mtodos como Read() o Write(); sin embargo, trabajar a tan bajo nivel puede no ser lo mejor.
180
Ficheros y Streams
La clase FileStream
Mtodo / Propiedad
FileStream
Descripcin
Constructor sobrecargado. Todos deben especificar un string que contenga la ruta del fichero y un modo de apertura (abrir, abrir y crear, append, etc.). Es recomendable indicar tambin el tipo de acceso (lectura, escritura o ambas). Lee un bloque de bytes de la secuencia y escribe los datos en un bfer dado. Lee un byte del archivo y avanza la posicin de lectura un byte. Escribe un bloque de bytes en esta secuencia mediante el uso de datos de un bfer. Escribe un byte en la posicin actual de la secuencia de archivo. Cierra la secuencia actual y libera todos los recursos (como sockets e identificadores de archivo) asociados a sta. Establece la posicin actual de esta secuencia actual en el valor dado. Al sobrescribir en una clase derivada, borra todos los bferes de esta secuencia y hace que todos los datos almacenados en el bfer se escriban en el dispositivo subyacente. 181
Ficheros y Streams
Clases lectoras y escritoras
Para paliar el inconveniente de tratar con bytes en los streams existen clases lectoras y escritoras que permiten leer y escribir datos de mayor nivel en secuencias. La mayora de estas clases tienen asociado un objeto Stream que se pasa en el constructor como parmetro. Una caracterstica que tienen es que los respectivos mtodos Read() y Write() estn sobrecargados para poder aceptar otros datos como int, long o double. Sus implementaciones al final convierten los tipos de datos en una secuencia de bytes que se pasa al objeto Stream.
182
Ficheros y Streams
Las clase BinaryReader y BinaryWriter
Mtodo / Propiedad
BinaryReader BinaryWriter BaseStream Close Read ReadBoolean ReadChar ReadByte ReadDecimal ReadDouble ReadInt16/32/64 ReadString ReadBytes ReadChars Write
Descripcin
Constructores de ambas clases. Necesitan un Stream o un string con la ruta del fichero. Propiedad que devuelve la secuencia asociada al lector/escritor. Cierra el lector/escritor y libera todos los recursos. Lee un conjunto de caracteres y los almacena en un array
Lee N bytes de la secuencia actual en un array de bytes y hace avanzar la posicin actual en N bytes. Escribe un valor en la secuencia actual. 183
Ficheros y Streams
La clase StreamReader y StreamWriter
Mtodo / Propiedad
StreamReader StreamWriter
Descripcin
Constructores de ambas clases. Necesitan un Stream o un string con la ruta del fichero.
BaseStream
Read
ReadBlock
ReadLine ReadToEnd Write WriteLine
184
Ficheros y Streams
Ejemplo
using System.IO;
public class Cuenta { int numero; string titular; double saldo; public Cuenta(int num, string tit, double sald){ numero = num; titular = tit; saldo = sald; }
185
Ficheros y Streams
Ejemplo
// escritura de fichero Cuenta[] cuentas; //suponemos que la tabla ya tiene valores try { // creamos un stream de escritura en el fichero FileStream fs = new FileStream(cuentas.dat, FileMode.OpenOrCreate, FileAccess.Write); // creamos un escritor y asociamos su stream de escritura StreamWriter sw = new StreamWriter(fs); foreach(Cuenta cnt in cuentas){ // escribimos cada cuenta en una lnea sw.WriteLine({0},{1},{2}, cnt.numero, cnt.titular, cnt.saldo); } fw.close(); } catch (IOException ioe){ ConsoleWriteLine(Error en la escritura de ficheros); }
186
Ficheros y Streams
Ejemplo
// lectura de fichero try { // creamos un stream de lectura en el fichero FileStream fs = new FileStream(cuentas.dat, FileMode.Open, FileAccess.Read); // creamos un lector y asociamos su stream de lectura StreamReader sr = new StreamReader(fs); String currentLine = sr.ReadLine(); while (currentLine != null){ String[] values = currentLine.split(,) Console.WriteLine({0} {1} {2}, values[0], values[1], values[2]); currentLine = sr.ReadLine(); } sr.close(); } catch (IOException ioe){ ConsoleWriteLine(Error en la lectura de ficheros); }
187
Ficheros y Streams
Serializacin
En el ejemplo anterior hemos visto cmo leer y escribir datos de tipos simples en ficheros. El problema de operar de forma anterior es que no guardamos el tipo de datos en los ficheros. Por ejemplo, nadie nos dice que al leer un 3 este dato sea un int, un decimal o un string. En consecuencia, el programador debe saber de antemano los tipos de datos y la codificacin interna del fichero lo que a veces es imposible. A veces es ms sencillo leer o escribir directamente objetos y los lenguajes de programacin soportan este mecanismo, llamado serializacin.
188
Ficheros y Streams
Serializacin
La serializacin consiste en transformar un objeto en una secuencia de bytes conservando datos y a la vez los tipo de stos. Despus de que un objeto serializado se haya grabado en algn fichero, podr leerse del fichero y deserializarlo, es decir, que el tipo de informacin y los bytes que representan el objeto y sus datos puedan utilizarse para reconstruir el objeto en memoria. Adems, la serializacin es importante porque se puede usar para trasmitir objetos entre aplicaciones a travs de una red.
189
Ficheros y Streams
Serializacin de clases
Para declarar una clase como serializable hay que aadir el atributo [Serializable] o implementar la interfaz ISerializable en su definicin. [Serializable] class SerialA { class Serial B:A, ISerializable { int x; Serial A a; } } Hay que asegurar que cada atributo de clase est tambin serializado. Los tipos simples y los string estn ya serializados. Los tipos referencia deben ser tambin serializables as como sus clases base. Los arrays son tambin serializables por defecto, pero puede que sus objetos no lo sean.
190
Ficheros y Streams
Formateadores binarios
Para realizar la serializacin se utiliza un formateador binario BinaryFormatter ubicado en System.Runtime.Serialization.Formatters.Binary. El mtodo Serialize de dicha clase lleva a cabo la serializacin propiamente dicha (grabar el objeto en disco), indicando como parmetros el stream donde se va a grabar el objeto y el objeto en s. La parte complementaria consiste en reconstruir el objeto del stream en otro o en el mismo programa. El proceso es ahora inverso al anterior. En primer lugar se crea una secuencia de lectura asociada al archivo que contiene objetos. A continuacin se vuelve a usar el formateador con el mtodo Deserialize, que devuelve un object al que hay aplicarle downcasting.
191
Ficheros y Streams
Formateadores binarios
using System.Runtime.Serialization.Formatters.Binary;
class A { int a; double d; string msg; } // Serializacin BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream(miFichero.txt, FileMode.OpenOrCreate, FileAccess.Write); bf.Serialize(fs, new A(5, 7.2, Buenos das)); // Deserializacin BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream(miFichero.txt, FileMode.Open, FileAccess.Read); A miA = (A) bf.Deserialize(fs); Console.WriteLine(Valores de miA: {0}, {1}, {2}, miA.a, miA.d, miA.msg);
192
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
193
Multitarea en C#
Introduccin
Los ordenadores actuales pueden efectuar operaciones concurrentemente, siendo habitual en un sistema, por ejemplo, que se compile un programa, imprimir un fichero y recibir mensajes de correo sobre una red, todo simultneamente. Irnicamente, la mayora de los lenguajes de programacin ms antiguos no permiten a los programadores especificar actividades concurrentes. Ms bien, los lenguajes ofrecen solamente un conjunto de sentencias de control que posibilitan a los programadores ejecutar una accin a la vez, procediendo a la siguiente accin despus de que haya terminado la primera. Histricamente, el tipo de concurrencia ejecutada en los computadores de hoy, se ha implementado generalmente por llamadas a primitivas del sistema, disponibles slo a programadores de alta experiencia en la programacin de sistemas.
194
Multitarea en C#
Introduccin
La librera de clases de .NET Framework ofrece un conjunto de primitivas para la gestin de la concurrencia. Para llevar a cabo esta tarea se designan porciones de programa que se pueden ejecutar paralelamente con otras. Cada porcin se denomina hijo de ejecucin o thread. Esta forma de multitarea est disponible a todos los lenguajes de programacin de .NET (incluyendo C#, Visual Basic y Visual C++) ubicado en el espacio System.Threading. Un ejemplo del uso que se hace de la multitarea est en el propio comportamiento del recolector de basura (garbage collector) del CLR. Un hilo se ejecuta en segundo plano recogiendo las referencias de memoria dinmica que han dejado de usarse.
195
Multitarea en C#
Introduccin
Algunas aplicaciones pueden sacar partido del multiprocesamiento: Aplicaciones con procesos largos. Los procesos duraderos pueden ejecutarse en un segundo plano. Aplicaciones de sondeo y escucha. Se pueden aprovechar las esperas en rutinas como conectarse a un servidor, esperar por ver el contenido de un buzn de correo, etc. Aplicaciones grficas con botn Cancelar. En realidad, el propio GUI tiene este rasgo de comportamiento que convierte una buena aplicacin en una aplicacin destacable.
196
Multitarea en C#
Declaracin de threads
Para poder usar threads son necesarios los siguientes ingredientes: Un mtodo que devuelva void y que no tenga ningn parmetro o que tenga un nico de tipo object. Un delegado al que se le asignar el mtodo anterior. Dependiendo de los parmetros del mtodo se usarn los siguientes delegados: ThreadStart para los mtodos sin parmetros. ParametrizedThreadStart para los mtodos con parmetro object. Si se desean mltiples parmetros se deben encapsular en una coleccin, array o estructura. Un objeto de la clase Thread. El delegado se le tiene que pasar en el constructor con el mtodo ya asignado.
197
Multitarea en C#
Declaracin de threads
public void metodo(){ Console.WriteLine(Ejecutado metodo()); } public void metodo2(object o){ Console.WriteLine(Ejecutado metodo2({0}), o.ToString()); } //Delegado sin parmetros ThreadStart ts1 = new ThreadStart(this.metodo); //Delegado parametrizado ParametrizedThreadStart ts2 = new ParametrizedThreadStart(this.metodo2); //Declaramos los threads Thread thread1 = new Thread(ts1); Thread thread2 = new Thread(ts2); // Ejecutamos los threads thread1.Start(); thread2.Start(Hola! Soy un hilo parametrizado);
198
Multitarea en C#
Ciclo de vida
199
Multitarea en C#
Ciclo de vida
Unstarted. El hilo an no ha sido ejecutado. Es el estado inicial al crear una nueva instancia de Thread. El hilo permanece en estado Unstarted hasta que el programa llame al mtodo Start, que pone al hilo en estado Running, e, inmediatamente devuelve el control a la parte del programa que llam a Start. Running. El hilo se halla en ejecucin. El hilo se ejecuta en estado Running slo cuando el sistema operativo le asigne procesador. Cuando un hilo Running recibe un procesador la primera vez, comienza la ejecucin del mtodo indicado en su delegado ThreadStart.
200
Multitarea en C#
Ciclo de vida
Stopped. La ejecucin ha terminado de forma satisfactoria o bien el usuario ha pedido explcitamente que el hilo aborte su ejecucin. Un hilo Running entra al estado Stopped (o Aborted) cuando su delegado ThreadStart finaliza, lo que suele indicar que el hilo ha completado su tarea. Un programa puede forzar a un hilo que entre al estado Stopped llamando al mtodo Abort del objeto hilo. Lanzar una excepcin. Cuando un hilo est en estado Stopped y no hay referencias a ese objeto, el recolector de basura puede borrar el objeto de memoria. Blocked. Al hilo les es imposible usar el procesador aunque haya uno libre. Es un estado conceptual. Suele suceder cuando el hilo se halla esperando la finalizacin de una operacin de E/S del sistema operativo.
201
Multitarea en C#
Ciclo de vida
Suspended. La ejecucin del hilo se ha suspendido explcitamente por el programador. Se puede volver activarse y pasar al estado Running. WaitSleepJoin. El hilo se halla esperando a que un recurso se libere, est dormido o bien espera el final de ejecucin de otro hilo. Al salir de este estado vuelve a estar activo como Running. Si un hilo encuentra cdigo que no puede ejecutar (normalmente porque no se satisface una condicin), se llama al mtodo Wait. Una vez as, un hilo retornar de nuevo a Running cuando otro hilo invoque el mtodo Pulse (o PulseAll) de la clase Monitor. Un hilo en ejecucin puede llamar al mtodo Sleep y se quedar durmiendo durante un nmero de milisegundos (parmetro) y luego despertar. Mientras duermen los hilos no pueden usar procesador, incluso si lo hubiese disponible.
202
Multitarea en C#
Ciclo de vida
WaitSleepJoin (continuacin). Si un hilo no puede continuar ejecutndose (es dependiente) a menos que otro hilo termine, el hilo dependiente puede llamar al mtodo Join de Thread para juntar los dos hilos. Cuando se han juntado, el dependiente abandona el estado WaitSleepJoin y recupera su estado Running cuando el otro hilo finalice su ejecucin (entrando a Stopped). Cualquier hilo que entre al estado WaitSleepJoin por la llamada del mtodo Wait de Monitor o llamando al mtodo Sleep de Thread, tambin dejar el estado WaitSleepJoin y regresar al estado Running si el hilo que est durmiendo o esperando se interrumpe por otro hilo en el programa que invoque su mtodo Interrupt, de la clase Thread. Esto ocasiona una excepcin ThreadInterruptionException sobre el hilo interrumpido.
203
Multitarea en C#
Prioridades y planificacin
Cada hilo tiene una prioridad en el rango comprendido entre ThreadPriority.Highest (la ms alta) ThreadPriority.AboveNormal ThreadPriority.Normal ThreadPriority.BelowNormal (prioridad establecida por defecto) ThreadPriority.Lowest El S.O. Windows soporta el concepto de timeslicing, que hace posible que hilos de igual prioridad compartan la CPU, puedan alternar su ejecucin y ninguno monopolice su uso. Cada hilo recibe un breve tiempo de la CPU, denominado quantum, durante el cual el hilo puede ejecutarse. Al finalizar el quantum, el hilo ejecutable se desaloja del procesador (incluso si el hilo no ha finalizado su tarea), y su lugar lo ocupa el siguiente hilo de igual prioridad, si hay alguno.
204
Multitarea en C#
Prioridades y planificacin
La tarea del scheduler (o planificador) es mantener en ejecucin todos los hilos empezando con los de prioridad ms alta de forma que asegura que todos aquellos de un mismo nivel de prioridad consumen un quantum en un ciclo Round-Robin.
Hilos preparados
Prioridad Highest Prioridad AboveNormal Prioridad Normal Prioridad BelowNormal Prioridad Lowest
A C
D G
205
Multitarea en C#
Prioridades y planificacin
La prioridad de un hilo puede ser ajustada con la propiedad Priority, que acepta como valores los de la enumeracin ThreadPriority antes citada. Un hilo se ejecuta hasta que muere, se bloquea por E/S (u otra razn), llama a Sleep, Wait (de Monitor) o Join, es desalojado por otro hilo de prioridad superior o su quantum expira. Un hilo de prioridad ms alta que el que se est ejecutando puede llegar a ejecutarse (y por lo tanto, desalojar al primer hilo ejecutable) cuando Este hilo estaba durmiendo y se despierta. Al completar una E/S. Otro hilo ejecuta los mtodos Pulse o PulseAll que hacen liberar a otro hilo. Si continua su ejecucin (mtodo Resume) tras hallarse suspendido. Si completa la espera porque otro de alta prioridad estaba esperando (Join).
206
Multitarea en C#
Sincronizando threads
A veces, mltiples hilos en ejecucin operan sobre datos compartidos de forma que varios de ellos pueden leer esa informacin de modo simultneo sin mayor problema. Sin embargo, cuando esos datos se modifican por uno o ms threads, los resultados pueden ser indeterminados. Si un hilo est en el proceso de actualizar el dato y otro intenta actualizarlo tambin, el dato reflejar slo el ltimo cambio. Este problema se agrava cuando la informacin motivo de la actualizacin es una estructura de datos como un array, manipulada por varios threads, por ejemplo. Cada thread puede atacar a la vez un array pudiendo sobrescribir algunos datos.
207
Multitarea en C#
Sincronizando threads
Para prevenir este fallo, se puede dar a un hilo el acceso exclusivo en su cdigo para acceder a los datos compartidos. Durante ese tiempo, otros hilos que intenten manipular los datos, debern esperar. Cuando el hilo con el acceso exclusivo complete su operacin sobre los datos, los otros hilos que esperaban podrn entonces acceder. De esta manera, cada hilo que accede a los datos compartidos, evita que todos los otros hilos hagan lo mismo a la vez. Este proceso se denomina sincronizacin de hilos o exclusin mutua.
208
Multitarea en C#
Abrazos mortales
A veces es frecuente incurrir en el siguiente error comn por un mal diseo de la multitarea. Ocurre cuando un hilo en espera no puede continuar debido a que est esperando, directa o indirectamente, un segundo hilo, y ste segundo est esperando al primero. Esta situacin anmala se denomina abrazo mortal o deadlock. Si mltiples hilos esperan por un objeto compartido, otro hilo independiente podra llamar a PulseAll (o Pulse) como forma segura de que todos los hilos que esperan tengan la oportunidad de hacer su tarea. Si no se hace as, el aplazamiento indefinido puede dar lugar al abrazo mortal.
209
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
210
ADO.NET
Introduccin
Como sabemos, una base de datos es una coleccin de datos relacionados. Un SGBD (sistema gestor de base de datos) o DBMS (database management system) ofrece los mecanismos para almacenar, organizar, recuperar y modificar los datos a los usuarios que lo requieran. Hoy por hoy, las bases de datos ms populares son las de estructura relacional y el lenguaje SQL es el ms ampliamente utilizado con bases de datos relacionales para ejecutar consultas.
211
ADO.NET
Introduccin
Un lenguaje de programacin se conecta e interacta con una base de datos relacional por medio de un software que facilita la comunicacin entre el SGBD y el programa. C# se comunica con la base de datos y manipula la informacin a travs de ADO.NET. La versin actual de ADO.NET es la 2.0. Sin embargo, como se ver ms adelante, mucho del trabajo que se requiere para comunicar con una base de datos usando ADO.NET 2.0 lo lleva a cabo el IDE por s mismo. Es ms habitual trabajar con herramientas, asistentes, etc., lo que simplifica el proceso de conectar y manipular una base de datos. Es ms fcil trabajar con ADO.NET 2.0 que con el antiguo ADO.NET.
212
ADO.NET
Modelo de objetos
El modelo de objetos ADO.NET ofrece un API para el acceso a base de datos por parte de programas. ADO.NET se cre por el marco .NET para reemplazar al Microsofts ActiveX Data ObjectsTM (tecnologa ADO). Las caractersticas visuales del IDE y sus herramientas simplifican el proceso de utilizar una base de datos en los proyectos. Aunque no se necesite trabajar directamente con muchos objetos de ADO.NET para desarrollar aplicaciones simples, el conocimiento bsico de cmo funciona el modelo ADO.NET es importante para comprender el acceso a orgenes de datos con C#.
213
ADO.NET
Espacios de nombres
Existen tres nombres de espacios propios de ADO.NET: System.Data Espacio de nombres raz. Contiene las clases que tratan los datos de forma independiente al SGBD. System.Data.OleDb Contiene las clases para conectarse a cualquier fuente de datos usando la tecnologa ADO.NET 1.0 System.Data.SqlClient Contiene clase optimizadas para una conexin a un SGBD Microsoft SQL Server
214
ADO.NET
Conexiones
OleDbConnection y SqlConnection Representan conexiones a una fuente de datos. Mientras que la primera representa una conexin a una fuente de datos genrica, la segunda es especfica y optimizada para SQL Server. Estas clases llevan la pista de la ubicacin de la fuente de datos y contienen valores que indican cmo debe ser accedida. Las conexiones deben abrirse y cerrarse. Al usar una conexin es necesario especificar explcitamente una propiedad llamada ConnectionString. Esta cadena de conexin nos indica el lugar donde est ubicada la fuente de datos as como el usuario, contrasea. Etc. Vemoslo en la siguiente tabla.
215
ADO.NET
Conexiones
Parmetro
Provider DataSource UID PWD
Descripcin
El nombre o marca comercial del proveedor a utilizar (Jet, SQL u otros) Nombre de la fuente de datos (la base de datos) a la que nos conectaremos Un nombre de usuario vlido Password de acceso para el usuario Nombre del controlador utilizado como intermediario por la base de datos. No se requiere si un DSN ya lo tiene especificado Nombre de la red del servidor de base de datos.
DRIVER
SERVER
Por ejemplo, aqu se muestra un ejemplo de una cadena de conexin para una base de datos Microsoft Access (usado con OleDbConnection): Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Tfnos.mdb Otro ejemplo con una conexin a SQL Server (usado con SqlConnection): server=localhost; uid=itsMe; pwd=1234; database=northwind
216
ADO.NET
Objetos
DataTable Representa una tabla de datos. Contiene todos los valores de una tabla as como los metadatos (informacin de columnas, claves primarias y forneas, etc.) DataRow Representa una fila (registro) de una tabla. Una DataTable contiene una coleccin de DataRow. DataColumn Representa una columna de una tabla. Contiene los metadatos de dicha columna. Una DataTable contiene una coleccin de DataColumn. DataRelation Representa una relacin de clave fornea entre dos tablas. Se ha de especificar las dos columnas de las tablas que participan en la relacin.
217
ADO.NET
Dataset
La clase DataSet consiste en una cach de datos que un programa almacena temporalmente en la memoria local. Est formada por un conjunto de DataTables y sus relaciones. La estructura de un DataSet imita la estructura relacional de una base de datos. Un DataSet puede representar desde una tabla hasta toda un esquema de base de datos, aunque se recomienda un trmino intermedio.
218
ADO.NET
Modelo desconectado
La ventaja de la clase DataSet respecto a trabajar en sincrona con la base de datos es que se desconecta del origen de datos cuando la aplicacin no necesita una conexin persistente con la fuente de datos. El programa se conectar a la fuente de datos para llenar el DataSet con datos, pero se desconecta de la fuente inmediatamente tras recuperar los datos de la misma. A partir de entonces, el programa emplea la informacin almacenada en el DataSet accediendo a esta cach local de datos en lugar de los originales. Si el programa hace cambios en los datos del DataSet se volver a reconectar al origen para efectuar la actualizacin y volver a desconectar rpidamente. As el programa no requiere una conexin continuamente activa (persistente).
219
ADO.NET
Comandos y adaptadores
Junto con los DataSet se conjugan otros dos tipos de objetos para tratar ms amigablemente con las bases de datos. Los comandos (Command) son objetos que envan instrucciones a la base de datos, ya sean consultas de SQL (select, insert, update, delete u otras) o bien procedimientos almacenados. Se suelen crear implcitamente al general el DataSet aunque tambin se pueden explicitar Los adaptadores (Adapter) hacen de puente y de canal de comunicacin entre el origen de datos y el DataSet desconectado. Desacoplan el DataSet de la base de datos permitiendo mltiples orgenes de datos en un nico DataSet.
220
ADO.NET
Comandos y adaptadores
Los adaptadores se encargan de crear y gestionar la conexin (objeto Connection) con la fuente de datos origen. Suelen estar asociados a una tabla de la base de datos Por este motivo contienen cuatro comandos (objetos Command) para representar las consultas select, insert, update y delete relacionadas con la tabla. Al crear un adaptador se piden dos parmetros: Una cadena de conexin para conectarse a la fuente de datos. Una consulta Sql que representa la instruccin select sobre la tabla (se generar un comando). Para asociar un DataSet y rellenarlo con los datos se debe invocar el mtodo Fill() del adaptador.
221
ADO.NET
El componente DataGrid
Un DataGrid es una componente visual que permite de forma rpida modificar los registros de una tabla (es muy similar a la edicin de tablas con Access). Crear un DataGrid y asociarlo a una tabla es muy sencillo Buscar DataGridView en el Cuadro de Herramientas Datos Arrastrarlo al formulario para crearlo En la vista de Orgenes de datos, buscar la tabla que se quiera asociar al DataGrid. Arrastrar la tabla y soltarla dentro del DataGridView. ste ltimo cambiar sus columnas por las de la tabla.
222
ADO.NET
El componente DataGrid
BindingSource Funciona como puente entre la fuente de datos (DataSet) y el componente grfico (en este caso un DataGrid). Desacopla la lgica de datos de la manera de representarlo (interfaz grfica) Funciona de controlador entre el DataGrid y su navegador BindingNavigator Navegador situado encima del DataGrid. Permite avanzar y retroceder entre registros, as como crear y eliminarlos y aceptar cambios. Es la lgica de control del DataGrid. A nivel de implementacin no se comunica directamente con DataGridView, sin que lo hace a travs del BindingSource.
223
ADO.NET
Arquitectura de comunicacin
basedatos.mdb
TableAdapter
Actualiza la BD con los datos actuales en
DataSet
Contiene Encapsula
datos
BindingSource
Aplica cambios a los datos basados en la entrada de usuario a travs de Muestra los datos desde Navega / Manipula los datos a travs de
DataGridView
BindingNavigator
224
ADO.NET
Aadiendo nuevas consultas
El TableAdapter contiene dos mtodos que tratan la consulta SELECT * FROM Fill(dt) rellena un DataTable dt que responde a la query anterior. GetTable() devuelve una DataTable cuyos datos son los proporcionados por la consulta anterior. Pero se pueden especificar ms consultas a parte de las proporcionadas. El asistente de consultas lo permite y facilita. Hay que seguir los siguientes pasos: Explorador de soluciones EmpleadosDataSet.xsd. Clic derecho Ver diseador. Se mostrar un diagrama con las entidades y relaciones del DataSet. Seleccionar un TableAdapter. Clic derecho Agregar consulta Seleccionamos Usar Instrucciones SQL. Ahora escogemos el tipo de consulta a realizar (SELECT, INSERT, etc.) Escribimos la consulta o bien la generamos al estilo de Access.
225
ADO.NET
Aadiendo nuevas consultas
Una vez creada la consulta, le damos un nombre y finalizamos. El nombre que le hemos dado a la consulta sirve para nombrar los mtodos que se han creado de forma automtica. Si se trata de una select, genera dos mtodos: un Fill() y un Get() Si se trata de otra operacin (insert, update, delete), genera un mtodo respecto a la operacin. Estos mtodos se usarn a conveniencia del usuario invocndolos desde eventos u otros mtodos.
226
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
227
Patrones de diseo
Introduccin
Los patrones de diseo (Design Patterns) son la base para la bsqueda de soluciones a problemas comunes en el desarrollo de software y otros mbitos referentes al diseo de interaccin o interfaces. Un patrn de diseo es una solucin a un problema de diseo no trivial. Es efectiva. Ya se resolvi el problema satisfactoriamente en ocasiones anteriores). Es reutilizable. Se puede aplicar a diferentes problemas de diseo en distintas circunstancias. No son bibliotecas de clases, sino ms bien un esqueleto bsico que cada desarrollador adapta a las peculiaridades de su aplicacin.
228
Patrones de diseo
Introduccin
Los patrones se describen en forma textual, acompaada de diagramas y pseudocdigos. En este curso veremos su representacin en UML. Tuvieron un gran xito a partir de la publicacin del libro Design Patterns escrito por el GoF (Gang of Four: Gamma, Helm, Johnson, Vlissides), en el que se recogan 23 patrones de diseo clasificados en tres categoras.
229
Patrones de diseo
Niveles de patrones
En Pattern Oriented Software Architecture, Volume 1 ([Buschmann96]), se define una taxonoma como la que se muestra en la siguiente figura. Los patrones en cada grupo varan respecto a su nivel de detalle y abstraccin.
Es importante destacar que esta divisin no es absoluta ni totalmente comprensiva, dado que no incluye a otros patrones de amplia aceptacin y utilizacin como los de anlisis, integracin de aplicaciones, pruebas, etc.
230
Patrones de diseo
Ventajas
Son soluciones concretas. Un catlogo de patrones es un conjunto de recetas de diseo. Aunque hay clasificaciones de patrones, cada uno es independiente del resto. Son soluciones tcnicas. Dada una determinada situacin, los patrones indican cmo resolverla mediante orientacin a objetos. Hay patrones especficos para un determinado lenguaje y otros ms generales. Se aplican en situaciones muy comunes. Los patrones de diseo proceden de la experiencia y han demostrado su utilidad resolviendo problemas que aparecen frecuentemente en el diseo orientado a objetos
231
Patrones de diseo
Ventajas
Son soluciones simples. Indican cmo resolver un problema particular utilizando un pequeo nmero de clases relacionadas de forma determinada. No indican cmo disear un determinado sistema sino slo aspectos puntuales del mismo. Facilitan la reutilizacin de las clases y el propio diseo. Los patrones favorecen la reutilizacin de clases ya existentes y la programacin de clases reutilizables. La propia estructura del patrn es reutilizada cada vez que se aplica.
232
Patrones de diseo
Inconvenientes
El uso de un determinado patrn no se refleja claramente en el cdigo. A partir de la implementacin es difcil determinar qu patrn de diseo se ha utilizado. Referencias a self (o this). Muchos patrones utilizan la delegacin de operaciones y esto provoca el problema del self. Y yo quin era..? Es difcil reutilizar la implementacin de un patrn. Las clases del patrn son roles genricos, pero en la implementacin aparecen clases concretas. Los patrones suponen una sobrecarga de trabajo a la hora de implementar. Se usan ms clases, es necesario delegar mensajes, etc.
233
Patrones de diseo
Objetivos
Un patrn de diseo describe una estructura recurrente de componentes que se comunican para resolver un problema general de diseo en un contexto particular. Nombra, abstrae e identifica los aspectos clave de una estructura de diseo comn, siendo as tiles para crear un diseo orientado a objetos reusable. Identifica las clases e instancias participantes, sus roles, colaboraciones y la distribucin de responsabilidades.
234
Patrones de diseo
Elementos clave
Nombre Permite describir, en una o dos palabras, un problema de diseo junto con sus soluciones y consecuencias. Al dar nombres a los patrones estamos incrementando nuestro vocabulario de diseo, lo cual nos permite disear y comunicarnos con un mayor nivel de abstraccin (en lugar de hablar de clases individuales nos referimos a colaboraciones entre clases). Problema Describe cundo aplicar el patrn. Explica el problema y su contexto. A veces incluye condiciones que deben darse para que tenga sentido la aplicacin del patrn.
235
Patrones de diseo
Elementos clave
Solucin Describe los elementos que constituyen el diseo, sus relaciones, responsabilidades y colaboraciones. La solucin no describe un diseo o implementacin en concreto, sino que es ms bien una plantilla que puede aplicarse en muchas situaciones diferentes. Consecuencias Los resultados, as como ventajas e inconvenientes de aplicar el patrn
236
Patrones de diseo
Clasificacin segn propsito
Patrones de creacin. Se refieren a la creacin de instancias de las clases. Ejemplo: el patrn Singleton. Patrones estructurales Se refieren a las relaciones entre clases u objetos Ejemplo: los patrones Adaptador, Puente y Decorador Patrones de comportamiento Se refieren a la interaccin y cooperacin entre clases (algoritmos, etc.) Ejemplo: Los patrones Estado e Iterador
237
Patrones de diseo
Patrones segn su mbito
Patrones de clases Se refieren a relaciones de herencia (estticas) entre clases y subclases Ejemplo: el patrn Adaptador (versin para clases) Patrones de objetos Se refieren a relaciones de uso (dinmicas) entre objetos Ejemplo: el patrn Estado, el patrn Singular.
238
Patrones de diseo
Clasificacin final
De creacin Clase
Estructurales
De comportamiento
Factory Method
Abstract Factory Builder Prototype Singleton
Interpreter
Template Method Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor
mbito
Objeto
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
240
ASP.NET
Introduccin
ASP.NET es un framework para aplicaciones web usado por programadores para construir sitios web dinmicos, aplicaciones web y servicios web.
Es la tecnologa sucesora de ASP (Active Server Pages) y est construido sobre el CLR (Common Language Runtime), permitiendo a los programadores crear cdigo ASP.NET utilizando cualquier lenguaje de programacin admitido por el .NET Framework.
241
ASP.NET
Arquitectura
Global.asax Webconfig.xml
WebForms
BIN INTERNET Comp.
ASP.NET
Formularios Web
Se dividen en varios archivos: Diseo Cdigo Diseador
243
ASP.NET
Pginas maestras
Permiten estructurar el contenido del sitio Web y agrupar funcionalidades comunes. Contienen regiones donde sern cargadas las pginas de contenido.
Hay que tener en cuenta: Cada pgina de contenido se asigna que se carga un contenido se invoca tambin a los mtodos de la MasterPage. Cada vez que se carga un contenido se invoca tambin a los mtodos de la MasterPage. La pgina que se renderiza es el resultado de la unin del cdigo de la Master y el conjunto de formularios mostrados
244
ASP.NET
Pginas maestras
La pgina maestra tiene el siguiente aspecto:
Definicin de la pgina maestra Cdigo HTML comn Definicin del hueco contenedor
El contentPlaceHolder define el hueco contenedor de las pginas que sern cargadas con esta Master. Una Master puede contener varios contentPlaceHolder.
Inicialmente un formulario slo puede cargarse en una Master o cambiar su Master en tiempo de ejecucin
245
ASP.NET
Pginas maestras
El formulario Web tiene el siguiente aspecto:
Pgina maestra Padre Fichero de clase Clase de la pgina de contenido Referencia a la clase maestra Identificador del receptculo de contenido
ASP.NET
Pginas maestras
Si una Master tiene varios huecos y la pgina no rellena todos ellos se respeta el contenido que exista en la Master.
247
ASP.NET
Flujo de ejecucin con pginas maestras
El orden de ejecucin con pginas maestras se inicia en la pgina Web para continuar ejecutando el cdigo de la pgina maestra
248
ASP.NET
Modelo Code Inline
El modelo code inline o modelo de cdigo interno es aqul cdigo, incrustado directamente en la pgina ASP.NET.
<%@ Page Language="C#" %> <html> <script runat="server" language="C#"> void Click(Object sender, EventArgs e) { Etiqueta.Text = Texto.Text.ToString(); } </script> <body> <form id="Formulario" runat="server"> <asp:textbox id="Texto" text=Hola" runat="server"></asp:textbox> <asp:button id="Boton" text="Input" OnClick="Click" runat="server"> </asp:button> <asp:label id="Etiqueta" runat="server"></asp:label> </form> </body> </html>
249
ASP.NET
Modelo Code Behind
El modelo de code behind o modelo de cdigo subyacente hace referencia al cdigo de una pgina ASP.NET contenido en un archivo de clases independiente. Esto permite separar con claridad el Lenguaje de marcado de hipertexto (HTML) y la lgica de presentacin.
Hay que tener en cuenta que la pgina de cdigo subyacente hereda de la clase Page, que reside en el espacio de nombres System.Web.UI. El hecho de heredar de la clase Page proporciona a la pgina de cdigo subyacente acceso a los objetos intrnsecos de ASP.NET, como Request y Response. Adems, la herencia de la clase Page proporciona un marco para controlar los eventos de los controles de la pgina ASP.NET.
250
ASP.NET
Modelo Code Behind
CodeBehind.aspx
<%@ Language="C#" Inherits=CodeBehind.Class %> <html> <body> <form id="Formulario" runat="server"> <asp:textbox id="Texto" text=Hola" runat="server"></asp:textbox> <asp:button id="Boton" text="Input" OnClick="Click" runat="server"> </asp:button> <asp:label id="Etiqueta" runat="server"></asp:label> <form> </body> </html>
251
ASP.NET
Modelo Code Behind
CodeBehind.cs
using using using using System; System.Web; System.Web.UI; System.Web.UI.WebControls;
namespace MiCodigoAux { public class MiClase : Page { protected System.Web.UI.WebControls.Label MiEtiqueta; protected System.Web.UI.WebControls.Button MiBoton; protected System.Web.UI.WebControls.TextBox MiCuadroDeTexto; public void Click(Object sender, EventArgs e) { MiEtiqueta.Text = MiCuadroDeTexto.Text.ToString(); } } }
252
ASP.NET
Controles Web Controles de exploracin
Desde la versin 2.0 de ASP.NET se incluyen controles de exploracin que facilitan la creacin, personalizacin y mantenimiento de los mens de desplazamiento. Los controles de exploracin son:
Menu Permite definir mens dinmicos y enlace a orgenes de datos. Contiene un men principal y submens. TreeView Muestra una jerarqua de datos en rbol.
253
ASP.NET
Controles Web Controles de exploracin
SiteMapPath
Muestra el camino de navegacin del usuario y la ubicacin de la pgina actual. El control utiliza los datos proporcionados por el objeto SiteMap proporciona muchas opciones para personalizar el aspecto de los vnculos. Obtiene los datos de desplazamiento de un mapa del sitio. Este datos incluyen informacin sobre las pginas del sitio Web, como la direccin URL, el ttulo, la descripcin y la ubicacin en la jerarqua de exploracin. El mapa del sitio se puede especificar en un fichero web.Sitemap.
<siteMap> <siteMapNode title="Home" description="Home" url="~/default.aspx" > <siteMapNode title="Services" description="Services url="~/Services.aspx"> <siteMapNode title="Training" description="Training" url="~/Training.aspx" /> <siteMapNode title="Consulting" description="Consulting" url="~/Consulting.aspx"/> </siteMapNode> </siteMapNode> </siteMap>
254
ASP.NET
Controles Web Controles de validacin
Los controles de validacin permiten comprobar los valores introducidos dentro del formulario. La validacin puede realizarse tanto en cliente como en servidor. Los controles de validacin incluidos son:
RegularExpressionValidator Somete los datos introducidos en el control asociado para comprobar que cumplen con la expresin regular. Muy til para validar direcciones de correo electrnico, documentos de identidad, nmeros de telfono, cdigos postales, etc. RequiredFieldValidator Obliga a introducir algn valor en el control asociado.
255
ASP.NET
Controles Web Controles de validacin
RangeValidator
Comprueba que los datos introducidos en el control asociado estn dentro de los lmites superior e inferior especificados. CompareValidator Permite comparar los datos introducidos en el control asociado con otro control o con un valor constante. CustomValidator Verifica la validez de los datos introducidos en el control asociado a travs de una funcin de validacin especfica.
ValidationSummary
No es un control de validacin sino ms bien de informacin. Se usa en conjuncin con otros controles de validacin para mostrar el listado de errores de validacin que se ha producido en un formulario.
256
ASP.NET
Controles Web Controles de validacin
Es importante mencionar que cuando se realiza la validacin en cliente (con controles AJAX o controles ASP.NET) existe una serie de variables y funciones de validacin en lenguaje de script que disparan o cancelan las validaciones que es til conocer.
Page_ClientValidate() fuerza la validacin de la pgina. Dispara todos los validadotes que estn activos en la pgina y muestra los resultados de validacin. Tambin informa la variable de script Page_IsValid que devuelve trae o false en funcin del xito de la validacin
257
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
258
AJAX
Introduccin
Provoca un cambio de filosofa en las pginas Web, tanto a nivel de usuario como a nivel de desarrollo.
Aporta al desarrollo Web las siguientes caractersticas: Dinamiza la navegacin Web, se aproxima a las aplicaciones de escritorio. Permite cargar contenidos en segundo plano Mejora del aspecto (look&feel) considerable. Mejora del intercambio de informacin con el servidor:
AJAX
Introduccin
Es un conjunto de tecnologas combinadas que permiten la comunicacin asncrona entre el cliente y el servidor. Se basa en cuatro tecnologas existentes:
XML utilizado comnmente para intercambiar datos entre el cliente y el servidor
DOM Document Object Model, como JavaScript y Jscript que cubre la interfaz de programacin en cliente.
XHTML para la presentacin y el diseo de la pgina Web El objeto XMLHttpRequest, que permite el intercambio de datos asncrono con el servidor Web.
260
AJAX
Introduccin
El flujo de navegacin con componentes AJAX cambia frente al modelo de navegacin anterior:
Modelo anterior Modelo nuevo
261
AJAX
Introduccin
Bajo un modelo no basado en AJAX el servidor intercambia con el cliente todo el contenido de la pgina.
A travs de AJAX se carga la pgina completa al inicio y en cada evento que realiza el cliente asociado a AJAX se enva slo la informacin solicitada, no toda la pgina.
262
AJAX
Configurando un sitio AJAX
Se pueden crear dos tipos de sitios basados en AJAX: Con funcionalidad de servidor Con funcionalidad de cliente y de servidor
Para crear un sitio con funcionalidad AJAX de servidor basta con crear una aplicacin Web y asignar un control ScriptManager.
El control ScriptManager debe estar asignado a cada pgina que contenga controles AJAX. Esto puede hacerse de dos formas: Una control o pgina primaria (por ejemplo una MasterPage) contiene el control ScriptManager y las pginas o controles contenidos un control ScriptManagerProxy Cada pgina con contenido AJAX contiene un solo control ScriptManager.
263
AJAX
Configurando un sitio AJAX
Para crear un sitio con funcionalidad AJAX de cliente es necesario realizar los mismos pasos que en la configuracin de servidor y adems algunas instalaciones y configuraciones.
Para poder utilizar controles de cliente basados en AJAX es necesario instalar ASP.NET AJAX Extensions.
Tras la instalacin podemos descargar el catlogo de controles de cliente disponible desde la pgina oficial de ASP.NET AJAX. Los controles basados en AJAX estn en constante evolucin, por lo que hay que descargar la ltima versin
Cada kit de herramientas est etiquetado con una versin del cambio, donde se describen las nuevas funcionalidades incorporadas y los errores corregidos.
264
AJAX
Configurando un sitio AJAX
Una vez descargada y descomprimida la coleccin de controles de AJAX es necesario integrarlos en nuestro sitio Web.
265
AJAX
Configurando un sitio AJAX
Tambin es necesario integrar los controles dentro de la ventana de herramientas de Visual Studio. En la ventana de herramientas creamos una nueva pestaa llamada AJAX toolkit, pulsamos con el botn secundario dentro de esta pestaa y seleccionamos Choose Items
266
AJAX
Configurando un sitio AJAX
Localizamos el ensamblado AjaxControlToolkit.dll
Una vez realizados todos los pasos se mostrar la lista de controles dentro del panel. Ahora tenemos preparado el proyecto para incorporar los controles AJAX de cliente.
267
AJAX
Controles de servidor
Para trabajar con la funcionalidad de AJAX es necesario utilizar una serie de controles de servidor y de cliente. A continuacin se enumeran los controles de servidor:
ScriptManager Administra el script de cliente para las pginas ASP.NET. Permite la representacin parcial de la pgina y las llamadas a servicios Web de forma asncrona. Algunas propiedades son: EnablePartialRendering Habilita la representacin parcial de los UpdatePanel.
EnableScriptGlobalization
Las funciones de JavaScript globalizadas, como el mtodo Date.localeFormat, muestran la informacin especfica de la referencia cultural del cliente.
268
AJAX
Controles de servidor
Timer
Permite actualizar la pgina dentro de un intervalo especificado. Utilizado con controles UpdatePanel se puede actualizar slo una parte de la pgina cada cierto tiempo.
269
AJAX
Controles de servidor
UpdatePanel
Es un contenedor que permite actualizar su contenido de forma parcial, sin cargar el resto de la pgina. Debe utilizarse junto con un control ScriptManager. Los controles UpdatePanel se pueden utilizar de forma jerrquica provocando la actualizacin de controles en cascada, dependiendo de la propiedad UpdateMode. UpdateMode puede ser always, siempre actualiza el contenido para cada postback, o puede ser conditional, entonces se actualizar si se invoca el mtodo Update() del panel, un panel padre tiene su propiedad ChildrenAsTrigger habilitada. Los desencadenadores permiten asociar un evento concreto a la actualizacin de un UpdatePanel.
270
AJAX
Controles de servidor
UpdateProgress
Informa de las actualizaciones parciales que suceden en un UpdatePanel. Slo se muestra el contenido cuando un evento provoca la actualizacin parcial del UpdatePanel asociado.
271
AJAX
Controles de servidor
Este ejemplo muestra una pgina con dos listas desplegables. La primera muestra un tipo de producto y en funcin de esta seleccin se cargan los subtipos en la segunda lista. La actualizacin de la segunda lista se realiza de forma parcial en la pgina mediante un UpdatePanel lanzado con el evento SelectedIndexChanged de la primera lista:
Declaracin del control ScriptManager
El UpdatePanel se actualizar slo al disparar el evento asociado La actualizacin del control DropDownList2 es parcial al estar contenido en el UpdatePanel Se asocia al disparador el evento SelectedIndexChanged del control DropDownList1
272
AJAX
Controles de servidor
El cdigo fuente asociado a la pgina no vara y ejecuta como el modelo antiguo, pero slo se enva al cliente los datos solicitados.
273
AJAX
Controles de cliente
Existe gran variedad de controles y cada da surgen nuevos. A continuacin comentaremos algunos de ellos.
Accordion Muestra la informacin en recuadros que se repliegan. Autocomplete Es un recuadro de texto que propone palabras en funcin de lo escrito a travs de una lista desplegable
274
AJAX
Controles de cliente
Calendar
Un control de calendario CollapsiblePanel Panel contrable, permite ocultar el contenido dejando espacio a otras zonas de la pgina. DragPanel Este panel puede ser arrastrado dentro de la pgina.
275
AJAX
Controles de cliente
MaskedEdit
Un recuadro de texto con mscara de formato HtmlEditor Un control para edicin de texto en formato HTML
ColorPicker
Recuadro de seleccin de color.
276
AJAX
Controles de cliente
ValidatorCallOut
Muestra los errores de validacin en una vieta. Tabs Control de pestaas
ResizeableControl
Permite redimensionar el contenido dentro del control
277
AJAX
Controles de cliente
ReorderList
Permite ordenar los elementos de la lista arrastrando y soltando. NumericUpDown Control asociado a un TextBox que aumenta o disminuye el valor del TextBox
278
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
279
LINQ
Introduccin
Language-Integrated Query (LINQ) es un conjunto de caractersticas que agrega capacidades de consulta eficaces a la sintaxis de C#.
LINQ incluye patrones estndar y de fcil aprendizaje para consultar y actualizar datos, y su tecnologa se puede extender para utilizar potencialmente cualquier tipo de almacn de datos.
LINQ es una innovacin introducida en .NET Framework 3.5 que elimina la distancia que separa el mundo de los objetos y el mundo de los datos.
280
LINQ
Introduccin
Tradicionalmente, las consultas con datos se expresan como cadenas sencillas, sin comprobacin de tipos en tiempo de compilacin.
Es necesario aprender un lenguaje de consultas diferente para cada tipo de origen de datos: bases de datos SQL, documentos XML, servicios Web diversos, etc.
LINQ convierte una consulta en una construccin de lenguaje de primera clase en C#.
Las consultas se escriben para colecciones de objetos fuertemente tipadas, utilizando palabras clave del lenguaje y operadores con los que se est familiarizado.
281
LINQ
Orgenes de datos
Existen diferentes variantes dependiendo del origen de datos a utilizar: LINQ to Objects: Permite realizar consultas sobre colecciones que implementen las interfaces IEnumerable o IEnumerable<T> as como gestionar los datos que estn almacenados en una coleccin de este tipo. LINQ to XML: Permite trabajar con datos XML que se almacena en la memoria. Proporciona la funcionalidad que el Document Object Model (DOM) suministra, junto con el apoyo de las expresiones de consulta LINQ. LINQ to SQL: Utilizado para trabajar con datos que se almacenan en una base de datos SQL Server.
282
LINQ
Arquitectura
VB.NET 9.0
C# 3.0
Otros
LINQ a XML
LINQ a SQL
LINQ a Dataset
LINQ a Entidades
LINQ a XML
283
LINQ
LINQ To Objects
Representa una nueva forma de ver las colecciones. De la manera convencional, es necesario escribir bucles foreach complejos que especifican cmo recuperar los datos de una coleccin. En el enfoque de LINQ, se escribe cdigo declarativo que describe lo que se desea recuperar.
Las consultas LINQ ofrecen tres ventajas principales respecto a los bucles foreach tradicionales: Son ms concisas y legibles, sobre todo al filtrar varias condiciones. Proporcionan funcionalidad eficaz de filtrado, ordenacin y agrupacin con cdigo de aplicacin mnimo. Se pueden trasladar a otros orgenes de datos con pocas o ningunas modificaciones. En general, cuanto ms compleja sea la operacin que se desee realizar con los datos, mayor ser el nmero de ventajas al utilizar LINQ en lugar de las tcnicas de iteracin tradicionales.
284
LINQ
LINQ To XML
Proporciona una interfaz de programacin XML en memoria que aprovecha las caractersticas de .NET Language-Integrated Query (LINQ) Framework.
Utiliza las caractersticas ms recientes del lenguaje .NET Framework y es comparable a una actualizada y rediseada interfaz de programacin XML para el Modelo de objetos de documento (DOM).
285
LINQ
LINQ a XML Jerarqua de clases
XDeclaration
XObjects
XNamespace
XName
XNode
XAttribute
XCData
XText
XComment
XContainer
Xdocument Type
Xprocessing Instruction
XDocument
XElement
286
LINQ
LINQ To XML
Generando un rbol:
XElement contacts = new XElement ("Contacts", new XElement ("Contact", new XElement ("Name", "Patrick Hines"), new XElement ("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement ("phone", "425-555-0145", new XAttribute("Type", "Work")), new XElement ("Address", new XElement ("Street1", "123 Main St"), new XElement ("City", "Mercer Island"), new XElement ("State", "WA"), new XElement ("Postal", "68042") ) ) );
287
LINQ
LINQ To XML
Este fragmento de cdigo muestra como agregar nodos a un fichero XML:
XmlDocument doc = new XmlDocument(); XmlElement name = doc.CreateElement("Name"); name.InnerText = "Patrick Hines"; doc.AppendChild(name);
288
LINQ
LINQ To XML
Este fragmento de cdigo muestra como eliminar nodos a un fichero XML:
root.Element(Parent1").Element (child1").Remove(); root.Element("Parent3").Elements().Remove();
289
LINQ
LINQ To XML
Este fragmento de cdigo muestra una consulta sencilla dentro de un fichero XML para obtener una tabla con el resultado.
290
LINQ
LINQ To SQL
Permite tratar los datos procedentes de base de datos relacionales como objetos.
Las consultas en LINQ se traducen a SQL se ejecutan en base de datos. Los resultados se convierten de nuevo en objetos para realizar su tratamiento. Para realizar el mapeo de las tablas o procedimientos de la base de datos con nuestro proyecto debemos integrar una clase Linq to Sql. Al incorporar la clase al proyecto se generan 3 ficheros: LinqDb.dbml el archivo xml que define el mapeo. LinqDb.dbml.layout el archivo xml utilizado por el diseador de Visual Studio. LinqDb.designer.cs. - archivo de cdigo donde se definen las clases y el contexto. Una vez definida la conexin, utilizando el diseador grfico se genera el mapeo de tablas que seleccionemos y las clases necesarias para utilizar los objetos conectados a las tablas.
291
LINQ
LINQ To SQL
En el siguiente fragmento se muestra como consultar una tabla para mostrar los datos por pantalla:
DataContext db = new DataContext(@"c:\Northwnd.mdf");
Table<Customer> Customers = db.GetTable<Customer>(); var query1 = from cust in Customers where cust.City == "London" select cust; foreach (var cust in query1) { Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City); }
292
LINQ
LINQ To SQL
Para aadir una conexin de datos desde SQL a travs de LINQ hay que seguir los siguientes pasos:
Desde el proyecto en el que queremos agregar la conexin agregamos un nuevo elemento: Seleccionamos la plantilla de LINQ to SQL, asignamos un nombre y aadimos. Se crearn 3 ficheros dentro de nuestro proyecto.
293
LINQ
LINQ To SQL
Para crear la conexin que utilizar LINQ accedemos a las herramientas y seleccionamos Conectar con base de datos
Configuramos los datos de conexin a la base de datos y seleccionamos la base de datos.
294
LINQ
LINQ To SQL
Podemos arrastrar directamente las tablas dentro del fichero DBML donde se crearn las clases de datos correspondientes.
Al guardar se crearn automticamente las clases asociadas para mapear los objetos desde la base de datos.
295
LINQ
LINQ To SQL
El fichero designer.cs asociado al fichero dbml contiene las definiciones de las clases creadas y una clase DataContext que utilizaremos para realizar las consultas con LINQ.
296
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
297
298
299
300
301
302
303
304
Mensajera
HTTP Channel
Activacin y alojamiento
WAS
Avalon
.EXE
NT Service
COM +
305
307
309
310
311
312
313
314
315
316
Mensaje SOAP Nivel de interoperabilidad. Estilo de documento. Formato de mensaje. Estructura de mensaje.
317
318
319
320
321
Mecanismo de descubrimiento
322
323
324
ndice
1. Qu es .NET Framework? 2. Orgenes de C# 12. Uso de excepciones 13. Estructuras de datos
3. Caractersticas de C#
4. Sintaxis bsica 5. Arrays 6. Clases, objetos y constructores
7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones
18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation
325
Enterprise Library
Introduccin
Microsoft Enterprise Library es una coleccin de componentes de software reutilizables (bloques de aplicacin) diseado para ayudar a los desarrolladores de software en el desarrollo empresarial, tales como validaciones, acceso a datos, manejo de excepciones, y muchos otros.
326
Enterprise Library
Objetivos
Tener en cuenta el feedback recibido para los application blocks existentes. Proporcionar nuevos application blocks para dar soporte a retos adicionales en el proceso de desarrollo de software. Soportar la integracin con las nuevas caractersticas ms relevantes del .NET Framework 4.0. Aumentar la experiencia acerca de actividades claves del desarrollo. Simplificar el desarrollo de nuevos application blocks. Mantener la compatibilidad con versiones anteriores.
327
Enterprise Library
Configuracin
Incluye una herramienta de configuracin que puede integrarse como plugin a Visual Studio y que tambin se puede ejecutar como una aplicacin independiente. Usar esta herramienta es la mejor forma para configurar Enterprise Library pues presenta una interfaz fcil de usar y que adems valida las configuraciones. El hecho que pueda usarse como una aplicacin la transforma en una herramienta de administracin para el personal que opera los servidores de produccin.
328
Enterprise Library
Configuracin
Todos los bloques son configurables. Controla como el bloque trabaja con la aplicacin. Especifica cuales bloques se van a utilizar. Bloques pueden ser utilizados con (o sin) archivos de configuracin. Los Factories objects construyen objetos de bloque utilizando datos de los archivos de configuracin. La configuracin es almacenada en archivos estndar XML (.config ) de manera predeterminada. Es posible utilizar Configuration Sources alternativos. System, File, Manageable y SQL.
329
Enterprise Library
Configuracin
Las herramientas de configuracin elimina la necesidad de editar los archivos de configuracin. Rpidamente se aade la configuracin predeterminada de un bloque. Propiedades y providers fuertemente tipados (Strongly typed). La configuracin el validada antes de almacenar los cambios. Se permite encriptar los archivos de configuracin. Es posible especificar configuraciones que son nicas para diferentes entornos (desarrollo, test, produccin, etc.). Incorpora un editor integrado a Visual Studio y tambin incorpora una consola de configuracin externa.
330
Enterprise Library
Arquitectura
331
Enterprise Library
Bloques de aplicacin
Los bloques de aplicacin son un nuevo concepto en el .NET framework; es una iniciativa que implica la construccin de pequeos bloques de aplicacin bajo ciertas especificaciones, con el fin de proveer servicios transversales a las aplicaciones de negocio, como por ejemplo el acceso a datos, logging, instrumentacin o simplemente el mismo acceso a la configuracin. Existen varios bloques de aplicacin construidos y la documentacin adecuada para que cada uno pueda construir sus propios bloques. Todo esto ha sido enmarcado bajo el Microsoft Enterprise Library. Cada bloque de Enterprise Library puede ser extendido para ser adaptado a las necesidades particulares de un proyecto. Los bloques presentan puntos de extensin bien definidos mediante interfaces y clases base que el usuario debe implementar. Estas extensiones son incorporadas a la aplicacin usando el archivo de configuracin en el cual se explicita el ensamblado y nombre de clase de la extensin.
332
Bloques de aplicacin
Cach
Es la implementacin de un sistema de gestin de la cach con polticas de recoleccin y expiracin. Su principal caracterstica es permitir persistencia, por ejemplo una base de datos. El bloque se encarga de mantener sincronizado el cache en memoria y la copia almacenada, cuando la aplicacin se reinicia el cache no se pierde, es recuperado desde el lugar de almacenamiento.
333
Bloques de aplicacin
Criptografa
Facilita la incorporacin de funciones de criptografa presentando una interfaz nica que permite realizar encriptacin y hashing de datos con diversos algoritmos de clave simtrica. Adems incluye un sistema para administrar y distribuir las claves de encriptacin.
334
Bloques de aplicacin
Acceso a datos
Facilita uso de ADO.NET, presenta una interfaz con mtodos simples para las tareas mas comunes de acceso a datos. Incorpora un mecanismo de descubrimiento y caching de parmetros de procedimientos almacenados. Permite escribir cdigo agnstico compatible con mltiples bases de datos.
335
Bloques de aplicacin
Manejo de excepciones
Permite simplificar y estructurar el manejo de excepciones. El cdigo que va en la clausula catch delega el manejo de la excepcin al bloque. Mediante configuracin es posible elegir diferentes comportamientos de tratamiento tales como: logging, reemplazar la excepcin y envolver la excepcin.
336
Bloques de aplicacin
Logging
Implementa funcionalidad de logging a diferentes destinos tales como: Registro de eventos Archivo de texto plano Base de datos Email MSMQ WMI Es posible configurar filtros, formatos, mltiples destinos y categoras.
337
Bloques de aplicacin
Inyeccin
Implementa funcionalidad de Programacin Orientada a Aspectos. Mediante un mecanismo de intercepcin permite extender la funcionalidad de mtodos y propiedades sin modificar el cdigo fuente. Usualmente se utiliza para incorporar funcionalidad transversal como logging, autorizacion, intrumentacion, transacciones y caching. La funcionalidad transversal es aplicada como pliticas definidas en el archivo de configuracin en el cual se determina mediante wildcards a que mtodos y propiedades se aplicara que funcionalidad.
338
Bloques de aplicacin
Seguridad
Estandariza el cdigo necesario para realizar autorizacin, (determinar si un usuario tiene acceso a un recurso). Puede operar con Authorization Manager (AZMAN) o simples reglas definidas en el archivo de configuracin. Tambin incluye funcionalidad de caching de identidades que facilita la Implementacin de un sistema de tickets para evitar el impacto de rendimiento de autenticar un usuario cada vez que llama un mtodo.
339
Bloques de aplicacin
Unity
Es un contenedor de inyeccin de dependencias (Dependecy Injection). Soporta inyeccin de constructores, propiedades y mtodos. Facilita el desarrollo de aplicaciones modulares y extensibles. Tambin implementa un mecanismo de intercepcin para incorporar funcionalidad transversal.
340
Bloques de aplicacin
Validacin
Facilita la incorporacin de lgica de validacin a una aplicacin. Muchas de las reglas de validacin comunes son encapsuladas en clases reutilizables como: largo de string, rango de un numero o fecha y expresin regular. Estas reglas se pueden utilizar en el cdigo y tambin ser asignadas a propiedades de clases mediante atributos o usando el archivo de configuracin. Incluye conectores que hacen posible automatizar la validacin de controles de formularios Windows Forms, ASP.NET y parmetros de operaciones WCF.
341
everis.com
342