Vous êtes sur la page 1sur 342

Microsoft .

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

objetivos de la universidad corporativa


Incrementar el alineamiento entre la formacin y la estrategia de negocio de la compaa.
Incrementar la calidad del plan de formacin y la adecuacin a las necesidades de las nuevas carreras profesionales. Explicitar el valor de la formacin de everis ya no solo como complemento a nuestra carrera profesional, sino en si misma a travs del acceso a titulaciones acadmicas. Potenciar y facilitar la formacin adicional de los profesionales de everis a travs del acceso a determinadas titulaciones con reconocido prestigio en el mundo acadmico. Potenciar la visin global como compaa multinacional. Potenciar la imagen corporativa.

objetivos del curso


Conocer la plataforma Microsoft .NET y su framework de desarrollo
Conocer la estructura, elementos y sintaxis del lenguaje Aprender los tres paradigmas de la programacin orientada a objetos aplicados a C# Ser capaz de disear programas orientados a trabajar con la consola Utilizar el potencial de las estructuras dinmicas de datos. Sacar provecho de las facilidades suministradas por los ficheros y streams. Estudiar el mecanismo de la multitarea aportada por C#. Realizar aplicaciones que accedan a Bases de Datos con ADO.NET y LINQ Utilizar el polimorfismo con clases abstractas e interfaces. Aplicar patrones de diseo en nuestras aplicaciones. Realizar aplicaciones basadas en ASP.NET, WCF y AJAX Sacar provecho de las facilidades suministradas por la Enterprise Library
4

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

Ficheros de cdigo fuente (C#, VB.NET, C++)

Compiladores MSIL

Ficheros en lenguaje 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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

private short throw ushort

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

Hola a todos!, 123, 0x3 y -7, Me llaman \Pepn\

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

else if(<condicinN>){ <instrucciones> } else { <instrucciones> }

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> }

do{ <instrucciones> while(<condicin>);

Ejemplo: int a = 10; while(a > 0){ Console.WriteLine(a); a--; }

Ejemplo: char c = \0; Do{ c = Console.Read(); }while(c != q);

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

56

Clases, objetos y constructores


Conceptos bsicos
Un objeto es un agregado de datos y mtodos que permiten manipular dichos datos. Los programas son conjuntos de objetos que interactan los unos con los otros. Una clase es la definicin de las caractersticas concretas de una determinada tipologa de objetos. Es decir, cules son los datos y mtodos de los que van a disponer todos los objetos de ese tipo Hablar de clases equivale a hablar de tipos de datos. Al ser C# un lenguaje orientado a objetos puro, siempre se trabaja con objetos y clases

57

Clases, objetos y constructores


Sintaxis y definicin
class <nombreClase> { <miembros> } Los <miembros> de una clase son los datos y mtodos de los que van a disponer los objetos de la misma. Ejemplo class MiClase { int a; double b; //ms datos y mtodos } En C# hay varios tipos de miembros, pero ahora slo vamos a considerar los atributos y los mtodos.

58

Clases, objetos y constructores


Atributos
Un atributo es un dato comn a todos los objetos de una determinada clase. Se deben definir en la zona de declaracin de miembros y tienen la siguiente sintaxis: <tipoatributo> <nombreatributo> Donde <tipoatributo> es un tipo simple u otro objeto y <nombreatributo> un identificador vlido. Ejemplo: class Persona { string Nombre; int Edad; string NIF; }

59

Clases, objetos y constructores


Atributos
Para acceder a un atributo se utiliza la siguiente sintaxis: <nombreObjeto>.<nombreatributo> Por ejemplo, para acceder al atributo Edad de un objeto Persona llamado p y cambiar su valor por 20 sera: p.Edad = 20; En realidad <nombreObjeto> no tiene por qu ser necesariamente el identificador de un objeto. Una expresin que devuelva un referencia no nula de un objeto tambin es vlida (en caso contrario se producira una excepcin).

60

Clases, objetos y constructores


Atributos
Se puede inicializar un atributo en el momento de su declaracin a travs de una asignacin: int valor = 9; Si no se da un valor, el compilador asigna automticamente un valor por defecto al atributo. Esto es debido a que C# no permite dejar atributos sin inicializar por motivos de seguridad. Valores por defecto de C#:
Enteros Decimales Lgicos 0 0.0 false Caracteres Cadenas Objetos \0 null null

61

Clases, objetos y constructores


Mtodos
Un mtodo es un conjunto de instrucciones encapsuladas a las que se asocia un nombre. Se deben definir en la zona de declaracin de miembros y tienen la siguiente sintaxis: <tipoDevuelto> <nombreMtodo> ([<parmetros>]) {
<instrucciones>

} 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

Clases, objetos y constructores


Mtodos y parmetros
Los mtodos pueden devolver un objeto como resultado de las instrucciones ejecutadas y el tipo de dato a devolver ha de ser el mismo que el indicado en <tipoDevuelto>. Si no se ha de devolver nada, se indica void, pero si se devuelve algo es obligatorio incluir la sentencia return al finalizar el mtodo. Opcionalmente pueden recibir un listado de objetos, <parmetros>, a los que podr acceder durante la ejecucin de las instrucciones. Al declarar un parmetro se ha de indicar el tipo y un nombre identificador. Ejemplo: int maximo (int a, int b){ return a > b ? a : b; }

63

Clases, objetos y constructores


Atributos estticos
Un atributo esttico de una determinada clase es un atributo cuyo valor es el mismo para todos los objetos de la clase, es decir, compartido para cualquier objeto que pertenezca a esta clase. En consecuencia, estos atributos no estn asociados a un objeto concreto sino a la clase en s misma. Se declaran como cualquier otro atributo pero aadiendo la palabra static al inicio: static int numero; Los accesos a atributos estticos son un poco diferentes respecto de los normales ya que en vez especificar el objeto hay que especificar la clase del objeto: int a = MiClase.numero;

64

Clases, objetos y constructores


Mtodos estticos
El concepto y uso de mtodos estticos es anlogo al de los atributos: son operaciones a nivel de clase. Se declaran anteponiendo la palabra static antes del nombre del mtodo. Como son operaciones de clase, no pueden usarse atributos ni mtodos no estticos ya que estos corresponden a un objeto concreto. Dentro de un mtodo, todo miembro esttico puede ser escrito directamente, sin anteponer el nombre de la clase. class C { static int a; int b; static void f(){ a = 6; //S! b = 4; //No! Estamos accediendo a un atributo no esttico } }
65

Clases, objetos y constructores


Uso de la palabra reservada this
Dentro de cualquier mtodo de un objeto siempre es posible hacer referencia al propio objeto usando la referencia this. Su uso principal es el de resolver ambigedades cuando un parmetro u otro elemento tiene el mismo nombre que un atributo. class C { int a;
C(int a){ a = a; parmetro this.a = a; } }

//No! //Ok!

Ambigedad

entre

atributo

66

Clases, objetos y constructores


Concepto de constructor
Un constructor de un tipo de datos o clase es un mtodo especial que contiene las instrucciones a ejecutar cada vez que se cree un nuevo objeto de ese tipo. Se usan para tareas como inicializacin de atributos sobre todo cuando stos no son constantes o se requieren operaciones ms complejas como aperturas de ficheros, acceso a redes, etc. Siempre se ejecutan despus de haberse inicializado todos los atributos (de forma explcita o implcita a travs de valores por defecto). Tienen un gran diferencia respecto el resto de mtodos: no se heredan. Los constructores no devuelven el objeto en s mismo, sino una referencia a l.

67

Clases, objetos y constructores


Sintaxis de constructor
Los constructores tienen una sintaxis muy parecida a los mtodos, salvo que el nombre ha de ser el mismo que el de la clase y nunca tienen valor de retorno (ni void): <nombreTipo> ([<parmetros>]) { <instrucciones> } Ejemplo: Persona(string Nombre){
//instrucciones } Al constructor se le llama en el momento de creacin del objeto usando la directiva new: Persona p = new Persona();

68

Clases, objetos y constructores


Sobrecarga y llamadas entre constructores
Se pueden definir varios constructores para una clase siempre y cuando difieran en nmero de parmetros y/o en tipos (por ejemplo no podemos tener dos constructores cuyos parmetros sean int e int respectivamente). Tambin se pueden realizar llamadas desde un constructor a otros constructores usando la partcula this() tras la definicin del constructor:
class A { A (int altura): this(altura,0.0){} //llamamos al segundo constructor A (int altura, double peso){} } Si en vez de llamar a un constructor propio de la clase lo queremos hacer de su clase padre, hemos de usar base en vez de this.

69

Clases, objetos y constructores


Constructor por defecto
Todas las clases deben tener constructor. En caso que el programador no defina uno, el compilador crea uno por defecto con la siguiente signatura: public <nombreClase>():base(){} Si el programador define un constructor, el compilador ignora aadir el constructor por defecto, por lo que se recomienda aadirlo manualmente en este caso. Mucho cuidado con los temas de herencia dentro de los constructores. Dejar que una subclase tenga constructor por defecto y su clase base no, dara un error de compilacin.

70

Clases, objetos y constructores


Constructor de tipo
El constructor de tipo es similar a los normales, salvo que se usa en el mbito esttico. En su definicin debe incluir el modificador static: static <nombreTipo>() { <instrucciones> } Estos constructores se llaman cuando la CLR carga por primera vez en memoria la informacin de la clase. Destacar que no debe tener ningn parmetro ni inicializador

71

Clases, objetos y constructores


Concepto de destructor
El destructor es un mtodo sin parmetros que se invoca en el momento anterior a que el recolector de basura lo destruya y libere la memoria que ocupaba. Es til para liberar recursos tales como ficheros o conexiones a bases de datos. Slo se llama cuando se detecta que no existen referencias a ese objeto ni en la pila, ni en memoria ni dentro de otros objetos. Su sintaxis es la siguiente: ~<tipoClase>(){ <instrucciones> } Los destructores se ejecutan en cadena, es decir, tras la ejecucin del destructor se ejecuta el de la clase base. Si el programador no especifica uno, el compilador se encarga de crear uno por defecto

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

public class RunClass {


public static void Main(){ Cls miCls = new Cls(); cls.F(); //Error! Ambigedad entre implementaciones. IfaceA ia = miCls; int k = ia.F() //Se IfaceA ejecuta la implementacin para

}
}

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

82

Mtodos, propiedades, eventos y delegados


Parmetros por valor y por referencia
C# distingue dos tipos de datos Tipos por valor: se accede directamente al valor del dato. Nmeros (enteros y reales), booleanos, caracteres, estructuras y enumeraciones son tipos simples. Tipos por referencia: se accede a los datos a travs de una direccin de memoria (referencia o puntero). Todos los objetos excepto los citados anteriormente son de tipo por referencia. A su vez, C# distingue dos tipos de paso de parmetros entre mtodos. Paso por valor: el parmetro es una copia del valor que almacena la variable donde est definido. Si se modifica el valor del parmetro dentro del mtodo no se ve afectado el original. Es el paso por defecto. Paso por referencia: el parmetro es la direccin de memoria donde est ubicada la variable. Si se modifica el valor del parmetro dentro del mtodo se ve modificado a la vez en el original. Debe declararse explcitamente al declarar la cabecera del mtodo mediante la palabra ref.
83

Mtodos, propiedades, eventos y delegados


Parmetros por valor y por referencia
Paso de parmetros Por valor Por referencia

Por valor Tipo de datos

El parmetro es una copia del valor de un elemento. No se ve alterado el valor original.

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

void f(ref int x){}

Mtodos, propiedades, eventos y delegados


Parmetros de salida
Un parmetro de salida es aqul que debe ser modificado obligatoriamente en el cuerpo del mtodo ya que se espera recoger un valor de l. Dicha modificacin ha de realizarse antes de cualquier lectura de su valor Los parmetros de salida se pasan implcitamente por referencia ya sean de tipo valor o referencia. Para declarar un parmetro de salida, basta con aadir la palabra out en la declaracin del parmetro. Asimismo, se ha de usar esta palabra en cada llamada al mtodo void f(int x, out int y, out object z){} //definicin int unX; int unY; Object unZ; f(unX, out unY, out unZ); //llamada

85

Mtodos, propiedades, eventos y delegados


Parmetros de salida
Se le pueden pasar como valores variables no inicializadas ya que garantizamos su inicializacin al final del mtodo. A su vez no se permiten literales como parmetros de salida. public void f(out int x, out int y, out int z){...} int x = 5; int y; f(out x, out y, out 6); //x e y son correctos, pero 6 no!! Los parmetros de salida permiten disear mtodos que devuelvan mltiples objetos: un objeto se devolvera como valor de retorno y el resto, como parmetros de salida.

86

Mtodos, propiedades, eventos y delegados


Nmero de parmetros indefinido
C# permite mtodos que puedan tomar un nmero indeterminado de parmetros, pero para ello es necesario cumplir ciertos requisitos: El parmetro ha de ser una tabla unidimensional o dentada. Ha de ser el ltimo de la lista de parmetros del mtodo y se le debe aadir la palabra reservada params en la definicin. Al llamar al mtodo, los tipos de los parmetros han de ser del mismo tipo que la tabla. Si se desea un comportamiento genrico, basta con declarar una tabla de tipo Object (polimorfismo). No se pueden usar los modificadores out ni ref con estos parmetros

87

Mtodos, propiedades, eventos y delegados


Nmero de parmetros indefinido
public void f(char c, params int[] ps){...} f(a); //Ok! Se pueden pasar 0 parm. indefinidos f(b,1,4,5); //Ok! f(c,3,Hola); //No! Hola es String y se espera int f(d, new int[]{1,9,6}); //Ok! Los mtodos con parmetros indefinidos tienen la prioridad ms baja cuando existe sobrecarga de mtodos. public void g(int x, int y){} public void g(params int[] ps){} g(2,3); //el primer mtodo tiene prioridad sobre el //segundo

88

Mtodos, propiedades, eventos y delegados


Sobrecarga con tipos de parmetros
Los modificadores ref y out forman parte de la signatura de un mtodo. En consecuencia, estos dos modificadores cuentan a la hora de sobrecargar mtodos. public class Sobrecarga { public void f(int x){} public void f(out int x){} } La clase es correcta ya que el compilador interpreta signaturas distintas para los dos mtodos: el primero tiene un parmetro de entrada y el segundo, de salida. Slo hay una restriccin: que la nica diferencia entre la signatura de dos mtodos sea que un determinado parmetro sea ref y el otro, out.

89

Mtodos, propiedades, eventos y delegados


Mtodos externos
Un mtodo externo es aqul cuya implementacin no se da en el fichero fuente en el que se declara ya que est escrito en otro lenguaje de programacin. Debido a que su implementacin es ajena al programa, el mtodo no tiene cuerpo y hay que aadirle la palabra extern en su declaracin extern <nombreMtodo>([<parmetros>]); Los mtodos externos no se pueden definir como abstractos a la vez, pero s virtuales y con los modificadores de visibilidad vistos. En el siguiente ejemplo se usa un mtodo externo definido en un DLL del sistema que realiza una llamada a sistema para copiar un fichero origen en una de destino.

90

Mtodos, propiedades, eventos y delegados


Mtodos externos
// Aqu est definido DllImport
using System.Runtime.InteropServices; public class Externo{ [DllImport(kernel32)] public static extern void CopyFile(string fuente, string destino); public static void Main(){ CopyFile(fuente.dat, destino.dat); } }
91

Mtodos, propiedades, eventos y delegados


Propiedades
Una propiedad es una fusin entre el concepto de atributo y el de mtodo. Externamente se accede a ella como si de un atributo visible se tratase, pero a nivel interno puede ejecutar cdigo en cada asignacin y/o lectura de su valor. Las propiedades no almacenan datos, sino slo se utilizan como si los almacenase. En la prctica se usan para encapsular el acceso a atributos privados y emularlos como si fueran pblicos. Cuando se asigna un valor, realizar una validacin de datos y guardarlo en un atributo privado. Cuando se lee el valor, se devuelve ese atributo privado.

92

Mtodos, propiedades, eventos y delegados


Propiedades
<tipoDatos> <nombrePropiedad> { set { <cdigoEscritura> } get { <cdigoLectura> } } Al asignar un valor a la propiedad se ejecuta cdigoEscritura y al leerla, cdigoLectura. En el fragmento set se incluye el parmetro implcito value, que es el valor que se solicita asignar. Es del mismo tipo de datos que la propiedad. El fragmento get debe devolver una expresin del mismo tipo que la propiedad. No es necesario definir en cada propiedad los dos bloques. As podemos tener propiedades de slo lectura o de slo escritura.
93

Mtodos, propiedades, eventos y delegados


Propiedades
private Date fnac;
public Date fechaNacimiento{ //propiedad lect/escr set{ fnac = value; } get{ return fnac; } public int edad{ //propiedad solo lect get{ //coger fnac y hacer la diferencia en aos respecto //la fecha actual de sistema. return diferencia; } }
94

Mtodos, propiedades, eventos y delegados


Modificadores de propiedades
Al igual que los atributos, las propiedades admiten todos los modificadores de visibilidad de C# (public, private, protected e internal). A su vez las propiedades se pueden definir como abstractas (abstract). Careceran de cuerpo los bloques get y set y sera tarea de las subclases redefinirlas (override). public abstract int sueldo{ get; set; } Se permiten otros modificadores de herencia y polimorfismo tales como virtual, new y sealed.

95

Mtodos, propiedades, eventos y delegados


Acceso e implementacin de propiedades
El acceso a una propiedad es anlogo al de un atributo pblico del mismo tipo. //suponemos una propiedad x tipo int en una clase A A a = new A(); int b = a.x; //Lectura. Se ejecuta get a.x++; //Escritura. Se ejecuta set La implementacin interna de una propiedad consiste en que el compilador aade dos mtodos con las instrucciones de los bloques get y set. As, el ejemplo anterior se traducira como: public int get_x(){} y public void set_x(int value){} Mucho cuidado con definir mtodos del estilo get_<prop> y set_<prop> ya que generaran un error de compilacin si definimos una propiedad del mismo nombre.

96

Mtodos, propiedades, eventos y delegados


Delegados
Un delegado es un tipo de clase especial cuyos objetos almacenan una o ms referencias a mtodos de tal manera que a travs del objeto sea posible ejecutar en cadena los mtodos aadidos. Resultan tiles en cualquier caso en el cual interesa pasar mtodos como parmetros de otros mtodos o bien cuando queramos tener objetos con mtodos que cambien durante la ejecucin del programa. Son el mecanismo bsico en el que se basa la escritura de aplicaciones con ventanas de la plataforma .NET. Por ejemplo, si tenemos un objeto de la clase Button (que simboliza los botones estndar de Windows), definimos un campo de tipo delegado que permita almacenar mtodos que se ejecuten cuando hagamos clic en l.

97

Mtodos, propiedades, eventos y delegados


Declaracin de delegados
Los delegados son miembros de una clase y se declaran de la siguiente forma:
<modifs> delegate ([<parmetros>]); <tipoRetorno> <nombreDelegado>

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

Mtodos, propiedades, eventos y delegados


Uso de delegados
Crear un nuevo delegado se realiza con la palabra new (como los objetos) seguido de un nico parmetro que es solamente del nombre de la funcin (sin parmetros). Delegado miDelegado = new Delegado(F); //F es un mtodo Si el mtodo no es compatible con el delegado, se lanza una excepcin en tiempo de ejecucin durante la creacin del delegado. Finalmente, para ejecutar el mtodo almacenado del delegado basta con invocarlo con los parmetros que admita. Si un delegado miDelegado admitiera mtodos con dos parmetros enteros, entonces se llamara as: miDelegado(4,7);

99

Mtodos, propiedades, eventos y delegados


Uso de delegados
public class A{
//1. Declaracin del delegado public delegate void Mensajero(String mensaje); public void lanzarMensaje(String mensaje){ Console.WriteLine(mensaje); } public static void Main(){ //2. Instanciacin del delegado con el mtodo Mensajero mens = new Mensajero(lanzarMensaje); //3. Ejecucin del delegado mens(Hello, World!); }

}
100

Mtodos, propiedades, eventos y delegados


Delegados mltiples
Los delegados pueden contener varias referencias a diferentes mtodos. Para aadir un nuevo mtodo a la lista se usa el operador += seguido del new del objeto de tipo delegado con su funcin. Para quitarlo, basta con usar -= //suponemos que tenemos un delegado mens de la clase Mensajero deleg += new Mensajero(Console.WriteLine); Al ejecutarse el delegado se invocarn los mtodos en el orden al que fueron asignados secuencialmente. Dentro de un delegado cabe cualquier tipo de mtodo, ya sea esttico o privado. En este ltimo caso nos podemos encontrar que otra clase ajena ejecute el delegado. Esto no viola el principio de encapsulacin ya que la clase no accede directamente al mtodo, sino el delegado. Si un delegado tiene asociado ms de un mtodo y stos devuelven un valor, se devuelve el valor del ltimo mtodo invocado.

101

Mtodos, propiedades, eventos y delegados


Delegados mltiples
public delegate void Trigonometric(double value); public void writeSin(double value){ Console.WriteLine(sin({0})= {1},value,Math.Sin(value)); } public void writeCos(double value){ Console.WriteLine(cos({0})= {1},value,Math.Cos(value)); } public void writeTan(double value){ Console.WriteLine(tan({0})= {1},value,Math.Tan(value)); } public static void Main(){ Trigonometric td = new Trigonometric (writeSin); td += writeCos; td += writeTan; td(0.0); }

102

Mtodos, propiedades, eventos y delegados


Eventos
Un evento es anlogo a lo que la propiedad es a la clase, es decir, permite controlar la forma a la que se accede a los delegados y dan la posibilidad de asociar cdigo a ejecutar cada vez que se aada o quite un mtodo del delegado. Se declaran como un atributo pero anteponiendo la palabra event al nombre del tipo (que debe ser de tipo delegate) . <modificadores> event <tipoDelegado> <nombreEvento>; public event Mensajero eventoMensaje; Se les trata como delegados dentro de la clase donde estn definidos, pero desde fuera deben cumplir ciertas restricciones: Slo de puede operar con ellos con += y -=. No se permite llamar a los mtodos almacenados desde l mismo. As se obliga a que la llamada tenga que hacerse a travs de un mtodo definido en la clase donde proviene el evento y as dotarle de cierto control.

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

122

Redefinicin de operadores e indizadores


Concepto de redefinicin
Se ha visto que C# cuenta con un buen nmero de operadores con una sintaxis clara e intuitiva para realizar las operaciones bsicas aritmtica, lgicas y propias del lenguaje. El comportamiento de estos operadores viene predefinido dentro del lenguaje cuando se aplican a ciertos tipos de datos. Por ejemplo, el operador + entre dos int devuelve su suma, mientras que si son string devuelve su concatenacin. Sin embargo, tambin se permite que el programador pueda definir el significado de la mayora de estos operadores cuando se apliquen a objetos de clases que l haya definido. A este proceso se le llama redefinicin de operadores.

123

Redefinicin de operadores e indizadores


Utilidad de las redefiniciones
El objetivo de redefinir operadores es hacer ms claro y legible el cdigo, no hacerlo ms corto. Supongamos que tenemos una clase Complejo que trata nmeros complejos: Complejo c1 = new Complejo(1,3); //c1 = 1 + 3i Complejo c2 = new Complejo(2,-1); //c2 = 2 i Complejo c3 = c1.suma(c2); //c3 = 2 + 2i Complejo c4 = c1 + c2; //c4 = 2 + 2i pero ms legible Es importante tener en cuenta que se debera dar un significado intuitivo a los operadores y muy parecido al que tienen en origen ya que de otra manera complicara entender el cdigo. Es buena prctica definir un mtodo que funcione de forma equivalente al operador para que lenguajes que no soporten redefinicin puedan aplicar las operaciones.

124

Redefinicin de operadores e indizadores


Sintaxis bsica y restricciones
Por regla general, toda redefinicin de operador es un mtodo esttico y pblico cuyo nombre es el smbolo del operador a definir precedido de la palabra operator y cuyos parmetros son los operandos. public static <tipoRetorno> operator <smbolo>([<operandos>]){ <instrucciones> } No se permite que los operadores devuelvan void . Dentro de los operandos al menos uno debe ser de la misma clase en la que se define el operador. Si el operador es unario, es obligatorio lo anterior. No pueden alterarse las reglas de precedencia, asociatividad, ubicacin y nmero de operandos. No se permite definir nuevos operadores incluso como combinacin de los ya existentes.

125

Redefinicin de operadores e indizadores


Sintaxis bsica y restricciones
public class Complejo { public float r; //parte real public float im; //parte imaginaria //constructor public Complejo(float r, float im) { this.r = r; this.im = im; } //operador de suma public static Complejo operator +(Complejo c1, Complejo c2){ return new Complejo (c1.r + c2.r, c1.im + c2.im); } //operador de producto public static Complejo operator *(Complejo c1, Complejo c2){ float r = c1.r * c2.r c1.im * c2.im; float im = c1.r * c2.im + c1.im * c2.r; return new Complejo(r,im); } }
126

Redefinicin de operadores e indizadores


Redefinicin de operadores unarios
Operadores redefinibles: ! + - ~ ++ -- true false Slo tienen un nico parmetro, que ha de ser de la misma clase donde se define el operador. Los operadores ++ y -- deben devolver un objeto del mismo tipo que el operando. Esta devolucin se comporta de manera distinta dependiendo de la aplicacin: Si es de forma prefija, se devuelve la expresin de return. Si es de forma postfija, el compilador ignora el return y devuelve el objeto original que se pas como parmetro. Es muy recomendable no modificar nada del parmetro original para no alterar el funcionamiento de este operador

127

Redefinicin de operadores e indizadores


Redefinicin de los operadores true y false
Se usan cuando un objeto concreto representa el valor lgico cierto (true) o falso (false). Su redefinicin ha de devolver siempre un tipo bool. Si se redefine uno de ellos, necesariamente el otro debe ser redefinido tambin. Estos operadores no pueden usarse directamente en el cdigo fuente, sino que se usan en expresiones condicionales como si de un valor booleano se tratase. public static bool operator false(Complejo cm){ return cm.r == 0.0 && cm.im == 0.0; } public static bool operator true(Complejo cm){ return cm.r != 0.0 || cm.im != 0.0; } //uso en una condicion Complejo num = new Complejo(1.0,1.0); if(num) return El nmero no es cero;
128

Redefinicin de operadores e indizadores


Redefinicin de operadores binarios
Operadores redefinibles: + - * / % & | ^ << >> == != < > <= >= Al menos un parmetro debe ser de la misma clase donde se ha redefinido el operador. Si un operador tiene complementario, se han de redefinir ambos. Es decir, si se redefine , <= se debe redefinir tambin >=. No se puede redefinir el operador de asignacin, pero los operadores compuestos +=, -=, *=, etc. se redefinen implcitamente al redefinir +, -, *, etc. respectivamente. Tampoco es posible redefinir los operadores && y ||, pero se simula redefiniendo los operadores true, false, & y |. Esta imposibilidad se debe al tratamiento perezoso que el compilador hacer con && y ||.

129

Redefinicin de operadores e indizadores


Concepto de indizador
Un indizador es la redefinicin del operador de acceso a tablas ([]) dentro de un tipo de datos definido por el usuario. Resultan tiles cuando disponemos de clases que almacenan colecciones de objetos y su acceso se desea realizar como si de una tabla se tratara. Los indizadores, como las propiedades, permiten ejecutar cdigo cada vez que se desea leer y escribir un elemento de una posicin concreta definida por los ndices. Los ndices no tienen por qu ser valores enteros, pudiendo definirse varios en una misma clase, difiriendo en nmero de ndices o en sus tipos.

130

Redefinicin de operadores e indizadores


Sintaxis de indizadores
A la hora de definir un indizador se usa una sintaxis parecida a la de las propiedades: <modificadores> <tipoDatos> this[<ndices>]{ get{ <instrucciones lectura> } set{ <instrucciones escritura> } } Donde tipoDatos es el valor de retorno e ndices son los diferentes ndices para acceder a los elementos.

131

Redefinicin de operadores e indizadores


Restricciones de acceso a indizadores
Para su correcto funcionamiento, los indizadores deben cumplir ciertas restricciones: El nombre que se le da al indizador ha de ser this, pues carece sentido dar otro nombre puesto que un indizador no se accede a travs de su nombre sino aplicando el operador [] a un objeto. No se admiten los modificadores ref, out o params en la declaracin de los ndices y al menos ha de existir un parmetro ndice. No se pueden definir indizadores estticos, slo de objetos. Para acceder a un indizador se utiliza exactamente la misma sintaxis que el acceso a tablas excepto que los ndices no tienen por qu ser valores enteros. //suponemos un indizador que acepta ndices de tipo String t[Pepe] = t[Juan];

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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.

Lista ordenada por clave de tipo genrico.


Pila genrica. Cola genrica.
155

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)

Comprueba si un dato est en la coleccin. La bsqueda es lineal.

Object Peek()

Devuelve el objeto situado en la cima de la pila sin eliminarlo.

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)

Comprueba si el parmetro clave est en el diccionario.


Comprueba si el parmetro valor est en el diccionario Quita la primera aparicin del elemento que se indique. Si no se encuentra devuelve false. 168

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

Copia un fichero en otro nuevo.


Crea un fichero y devuelve su FileStream asociado Crea un fichero de texto devolviendo un StreamWriter. Borra el fichero indicado. Devuelve true si el fichero especificado existe y false si no Devuelve un objeto DateTime con la fecha de creacin del fichero Devuelve un DateTime con la fecha del ltimo acceso al fichero Devuelve un DateTime con la fecha de la ltima modificacin Mueve un fichero a otra ubicacin dada como argumento Devuelve un FileStream con los permisos de lectura/escritura indicados. Devuelven un FileStream, StreamReader o FileStream respectivamente. 178

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

Devuelve true si existe el directorio especificado.


Devuelve un array de string con los nombres de los subdirectorios del directorio indicado. Devuelve un array de string con los nombres de los ficheros del directorio. Devuelve un objeto DateTime representando la fecha y hora de creacin del directorio. Devuelve un DateTime con la fecha del ltimo acceso. Devuelve un DateTime con la fecha del ltimo cambio hecho en el directorio. Mueve el directorio a otro lugar. 179

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

Read ReadByte Write WriteByte Close Seek Flush

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 un dato de la secuencia y lo transforma en un tipo bsico.

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

Propiedad que devuelve la secuencia asociada al lector/escritor.


Lee el siguiente carcter o conjunto de caracteres de la secuencia de entrada. Lee el nmero mximo de caracteres especificado por la variable count de la secuencia actual y escribe los datos en buffer, empezando en index. Lee una lnea de caracteres de la secuencia actual y devuelve los datos como un string. Lee la secuencia desde la posicin actual hasta el final de la secuencia. Escribe en la secuencia. Escribe algunos datos que especifican los parmetros sobrecargados, seguidos de un terminador de lnea.

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

Ejecuta comandos SQL contra

TableAdapter
Actualiza la BD con los datos actuales en

Pone los resultados de las consultas de la BD 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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

Adapter (de clase)


Adapter (de objetos) Bridge Composite Decorator Facade Flyweight Proxy

Interpreter
Template Method Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor

Tabla 1: Clasificacin de patrones de diseo del GoF.


239

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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.

Base de datos Servicios WEB


242

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

La pgina maestra tiene su propia directiva de definicin.

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

Cada formulario Web define en su directiva Page la referencia a la Master.

El contentPlaceHolderID define el hueco donde ser mostrada la pgina.


Las referencias a la clase maestra permiten hacer referencia a objetos de esta pgina. Si una Master tiene varios huecos y la pgina no rellena todos ellos se respeta el contenido que exista en la Master.
246

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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:

Mejora los tiempos de respuesta


Se reduce el flujo de datos global (mejora de comunicaciones) La parte del servidor reduce los tiempos de procesamiento
259

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

.NET Language Integrated Query


LINQ a Objetos LINQ a ADO.NET
LINQ a ADO.NET LINQ a ADO.NET LINQ a ADO.NET

LINQ a XML

LINQ a SQL

LINQ a Dataset

LINQ a Entidades

LINQ a XML

<libro> <titulo/> <autor/> <precio/> </libro>

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);

Algunos mtodos de la clase XElement para editar son:

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();

Algunos mtodos de la clase XElement para eliminar son:

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

297

Windows Comunication Foundation


Introduccin
Windows Communication Foundation es una plataforma para crear aplicaciones distribuidas. Podramos definirlo tambin como el modelo de programacin unificado para crear aplicaciones distribuidas.
Las aplicaciones distribuidas se vuelven cada da ms complejas, y es primordial que nuestros negocios estn conectados. Esta globalizacin informtica requiere la interaccin y la conectividad entre diferentes plataformas e incontables dispositivos. Windows Communication Foundation fue concebido con el objetivo de simplificar el desarrollo de aplicaciones distribuidas. Una de sus principales caractersticas es que cuenta con un modelo de programacin unificado. Es la unificacin de numerosas capacidades que antes podamos encontrar en distintas tecnologas. Esto nos libra de tener que estar utilizando ms de una tecnologa para cumplir satisfactoriamente los requerimientos. De este modo, los desarrolladores harn una tarea de una nica manera.

298

Windows Comunication Foundation


Tipos de programas de mensajes
Los programas se comunican a travs del intercambio de mensajes. Tenemos tres distintos tipos de programas de mensajes. Programas cliente Programas servicio Programas intermediarios

299

Windows Comunication Foundation


Programas cliente
Son los programas que inician los mensajes. Por ejemplo, un programa que enva un mensaje a un servicio para realizar una accin especfica. Los clientes, a su vez, tambin pueden recibir mensajes; por ejemplo, un servicio podra enviarle una respuesta a un cliente. Un cliente determina cundo un servicio se conecta y cundo se comunica con l.

300

Windows Comunication Foundation


Programas servicio
Son programas que reaccionan a un mensaje. Un servicio procesa determinada accin cuando arriba un mensaje. ste tambin podra devolver una respuesta como en el ejemplo anterior, pero, a diferencia de un cliente, el servicio no controla la comunicacin. No sabe cundo un cliente va a enviarle un mensaje, ni cunto durar el intercambio, ni cul ser el volumen de comunicacin.

301

Windows Comunication Foundation


Programas intermediarios
Una comunicacin entre un cliente y un servicio puede producirse a travs de otro programa; cuando esto sucede se est utilizando un programa intermediario. Para los clientes y los servicios, el programa intermediario es totalmente invisible. ste puede desempear distintas acciones: Comportarse como firewall. Actuar como un gateway. Desviar un mensaje. Monitorear una comunicacin. No tenemos que confundir un intermediario con un cliente. Los intermediarios no consumen mensajes, sino que son un pasaje al destinatario.

302

Windows Comunication Foundation


Mensajes
La estructura de un mensaje es sencilla. Est compuesto por un sobre que contiene dos partes principales: encabezado y cuerpo. El cuerpo es el que contiene la carga fundamental del mensaje. El encabezado posee informacin que es de utilidad para las aplicaciones que realizan el intercambio. Un mensaje puede contener ms de un encabezado, pero slo puede contener un cuerpo. Los mensajes son representados como XML. Estn cubiertos por un sobre SOAP especficamente de versin 1.1 o 1.2. Si bien SOAP y XML estn fuertemente relacionados con el transporte HTTP, estos mensajes son independientes del transporte.
Sobre SOAP Encabezado Cuerpo

303

Windows Comunication Foundation


Activacin y alojamiento
Esta capa es donde se alojan (hosting) los servicios. Una de las grandes ventajas de esta capa es que nos da la posibilidad de elegir entre varios entornos para el alojamiento. Si el alojamiento se realiza sobre IIS, tenemos la posibilidad de registrar nuestros servicios para que la activacin de stos se produzca automticamente la primera vez que un cliente accede a ellos. Esto quiere decir que si un mensaje llega a un servicio que no est activo, ste se activar automticamente. En IIS tambin tenemos la ventaja de contar siempre con la ltima versin, ya que si el servicio es actualizado, IIS publicar automticamente la nueva versin.

304

Windows Comunication Foundation


Arquitectura
Aplicacin Contratos Service runtime
Throtting Behavior Data Contract Message Contract Service Contract Policy & Binding

Error Behavior Transaction Behavior

Metadata Behavior Activation Behavior

Instance Behavior Concurrency Behavior

Inspection Facilities Cmd / Control Facilities

Mensajera
HTTP Channel

SOAP Security Channel TCP Channel UDP Channel

SOAP Reliability Channel X-Proc Channel Queue Channel

Text / XML Encoder Binary Encoder

Activacin y alojamiento

WAS

Avalon

.EXE

NT Service

COM +

305

Windows Comunication Foundation


Arquitectura
Activacin y alojamiento Encargada de garantizar el funcionamiento sobre distintos entornos, ya sea sobre Internet Information Services IIS, un EXE, un servicio de NT, Avalon o COM+. Mensajera sta es la responsable de la comunicacin entre los servicios, es quien provee la infraestructura de comunicacin. A su vez, se encarga de brindar seguridad entre los mensajes y maneja la cola (encolado de servicios). Service Runtime Permite ejecutar y cargar nuestros servicios. Tambin administra los behaviors, maneja la concurrencia, instancias de nuevos servicios, etc. Contratos Es donde los servicios sern descriptos. Es la capa visible para las aplicaciones.
306

Windows Comunication Foundation


Mensajera
La capa de mensajera es la que provee la infraestructura de comunicacin. Esto se permite a travs de numerosos canales seguros para el transporte. Es aqu donde tambin manejaremos la seguridad del servicio y donde podremos personalizar la seguridad de los mensajes. Una importante caracterstica de esta capa es que nos permite crear mensajes garantizados. Mediante gestores de errores, que controlan tanto la persistencia como la duplicacin, etc., podemos lograr un intercambio de mensajes confiables, teniendo la posibilidad, por ejemplo, de recuperar el estado previo de un mensaje luego de una comunicacin fallida. Accediendo a los gestores que se encuentran en esta capa, es posible enviar y recibir mensajes certificados. Esto quiere decir que slo los recibir un destinatario seguro, y ste, a su vez, verificar el emisor del mensaje. Otra caracterstica que encontramos en esta capa es el manejo del encolado de mensajes, es decir, la administracin de la cola.

307

Windows Comunication Foundation


Service Runtime
El Service Runtime es el responsable de cargar los servicios y ejecutarlos. Esta capa que maneja la ejecucin de todos los servicios tambin controla los behaviors. El behavior de error controla los errores que se producen en el servicio, y los captura e informa al cliente. El behavior de concurrencia controla la sincronizacin de los threads. Por ejemplo, este behavior podra indicar qu threads no son seguros. El behavior de instancias maneja la cantidad de instancias que fueron creadas de un servicio para un cliente determinado. El behavior de trottling nos permite poner lmites a las conexiones, sesiones y threads. Por ejemplo, de esta manera podramos establecer que se permita una sola instancia por cliente. El behavior de transacciones administra las transacciones producidas en el servicio. Esta capa tambin nos permite desarrollar nuestros propios behaviors. Esto nos otorga flexibilidad a la hora de desarrollar servicios.
308

Windows Comunication Foundation


Contratos
En esta capa es donde se describen los servicios: su estructura, sus acciones, de qu manera se enlazan o la estructura de datos. Dentro de esta capa podemos distinguir cuatro tipos de contratos: El Data Contract El Message Contract El Service Contract Policy & Binding. Un servicio debe contener, al menos, un Service Contract. Un servicio debe contener, al menos, un binding (enlace) para ser accesible, y puede contener mltiples enlaces.

309

Windows Comunication Foundation


Contratos Data Contract
Define las estructuras de datos personalizadas del servicio; por ejemplo, si tenemos un conjunto de datos denominado cliente y queremos envirselo a nuestro servicio para que realice una operacin, previamente deber estar definida la estructura de datos Cliente. Esto se debe a que las estructuras de datos son enviadas y recibidas entre los servicios con un esquema XML.

[DataContract] public class ClaseResp { [DataMember] public string idProducto; }

310

Windows Comunication Foundation


Contratos Message Contract
Define el formato del mensaje enviado y recibido por una operacin de un servicio. Por ejemplo, qu datos se esperan en el cuerpo del mensaje o qu datos en el encabezado.

311

Windows Comunication Foundation


Contratos Service Contract
Describe qu es lo que hace el servicio. Dentro del Service Contract se encuentran nombres que definen acciones; este conjunto de nombres se denomina service operations u operaciones del servicio. Siguiendo con nuestro ejemplo de manejo de clientes, nuestro servicio podra contener en esta capa un Service Contract llamado ObtenerSaldo, donde se realizara la accin de obtener el saldo del cliente.

[ServiceContract] interface IMiServicio { [OperationContract] ClaseResp MiMetodo(ClaseReq) }

312

Windows Comunication Foundation


Contratos Policy & Binding
Aqu se describe cmo se conectar nuestro servicio con el exterior. En este contrato se especificarn los detalles de transporte, requerimientos de seguridad y confiabilidad, o formatos de codificacin.

313

Windows Comunication Foundation


Web Services - Introduccin
Los Web Services son una pieza fundamental en la arquitectura de aplicaciones orientadas a servicios. Su diseo est basado en la interoperabilidad. Protocolos de comunicacin estndar. Formatos de representacin de datos estndar. Lenguajes de descripcin estndar. Mecanismos de descubrimiento estndar. Las tecnologas de invocacin remota (Web Services/Remoting) son bloques de construccin de SOA (Services-Oriented Architecture). Los Web Services representan una revolucin basada en XML de tecnologas distribuidas.

314

Windows Comunication Foundation


Web Services - Introduccin
WCF provee interoperabilidad entre distintas plataformas. Esto se logra gracias a la utilizacin de protocolos estndar. WCF puede interactuar e integrarse de manera sencilla con Web Services sin necesidad de utilizar cdigos complejos o de realizar grandes cambios. WCF provee: Comunicacin entre distintas plataformas. Utilizacin de protocolos estndar. Fcil integracin. Compatibilidad con la primera generacin de Web Services.

315

Windows Comunication Foundation


Web Services Que son los Web Services?
Aplicaciones o servicios que Se comunican por protocolos abiertos de Internet. Procesan los mensajes XML empaquetados en SOAP. Describen los mensajes usando un esquema XML. Proveen una descripcin de su interfaz con WSDL. Pueden ser descubiertos va UDDI.

316

Windows Comunication Foundation


Web Services - Interoperabilidad
Los mensajes SOAP ofrecen distintas elecciones de parametrizacin. Para que los sistemas puedan integrarse uniformemente, debe existir un acuerdo en los parmetros utilizados.

Mensaje SOAP Nivel de interoperabilidad. Estilo de documento. Formato de mensaje. Estructura de mensaje.

317

Windows Comunication Foundation


Web Services - Interoperabilidad
Nivel de interoperabilidad
Los bindings estndar proveen distintos niveles de interoperabilidad. El binding BasicProfile interoperability es provisto por el BasicProfile binding. ste permite comunicacin independiente entre distintas plataformas y compatibilidad con la primera generacin de Web Services .NET (asmx). Muchos bindings como ste brindan interoperabilidad, pero a costa de resignar importantes ventajas como transacciones confiables.

318

Windows Comunication Foundation


Web Services - Interoperabilidad
Estilo del documento
La descripcin de los mensajes se puede representar de distintas maneras en WSDL (Web Services Description Language). sta puede ser Document Format o RPC Format. Document Format tiene dos variantes: document/wrapped, donde el contenido se encuentra contenido en un elemento contenedor; y document/bare, donde no existe un elemento contenedor.

319

Windows Comunication Foundation


Web Services - Interoperabilidad
Formato de mensaje
Los mensajes pueden tener dos formatos: Literal o Encoded. En formato Literal, el cuerpo del mensaje corresponde a un esquema XML. El formato Encoded utiliza codificacin SOAP. El formato predeterminado es Literal.

320

Windows Comunication Foundation


Web Services - Interoperabilidad
Estructura del mensaje
Dado que existen varias maneras de guardar informacin en mensajes SOAP, es necesario sobrescribir la estructura predeterminada de los mensajes que provee WCF para alcanzar un mayor nivel de interoperabilidad. Es para esto que se utilizan los Message Contracts, los cuales se encargan de describir qu parte del mensaje va en el encabezado, qu parte en el cuerpo, etc.

321

Windows Comunication Foundation


Web Services Perfil bsico
Los mensajes se conforman de un empaquetado SOAP compuesto por XML estndar. Cuentan con un esquema XSD, y sus endpoints son descriptos en el WSDL.
UDDI WSDL XSD SOAP XML 1.0 + Namespaces
Lenguajes de definicin Estndares de comunicacin Registro de endpoints Descripcin del endpoint Portable type system Empaquetado Mensajes serializados

Mecanismo de descubrimiento

322

Windows Comunication Foundation


Web Services Limitaciones del perfil bsico
El perfil bsico (XSD, SOAP, WSDL, UDDI) permite una comunicacin bsica. Intercambios XML simples. Entre fronteras heterogneas y servicios autnomos. Compartiendo esquemas que permiten abstracciones tiles. La mayora de las aplicaciones distribuidas necesitan ms para cubrir las necesidades del escenario con el que se enfrentan.

323

Windows Comunication Foundation


Web Services Plataforma .NET
ASMX es la plataforma actual de WS Soporta el perfil bsico de servicios simples. No implementa WS-*. WSE 3.0 es una extensin Puede usarse para extender el comportamiento de ASMX. Puede usarse sin ASMX. Provee soporte a varias especificaciones WS-*. WCF es la siguiente generacin de WS Provee una solucin completa WS-.

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

14. Ficheros y Streams


15. Multitarea en C# 16. ADO.NET 17. Patrones de diseo

7. Interfaces
8. Mtodos, propiedades, eventos y delegados 9. Estructuras y enumeraciones

18. ASP.NET
19. AJAX 20. LINQ 21. Windows Comunication Foundation

10. Espacios de nombres


11. Redefinicin de operadores e indizadores

22. Enterprise Library

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

Vous aimerez peut-être aussi