Вы находитесь на странице: 1из 312

Curso de Desarrollo web con Visual Studio 2005

En este curso se tratan todas las cuestiones fundamentales que le permitirn crear
aplicaciones web con Visual Studio 2005. Al final del curso sabr todo lo necesario
para crear sus propias aplicaciones Web orientadas a datos y con multitud de
caractersticas avanzadas.
Este curso le enseara entre otras cosas:
Cmo crear aplicaciones web con Visual Studio 2005
A utilizar controles web y controles HTML
Los mtodos bsicos de acceso a base de datos.
Los controles enlazados a datos.
A manejar las sesiones desde ASP.NET.
El modo de crear aplicaciones con un interfaz de usuario consistente y fcil de
personalizar.
Control de acceso de usuarios.
Cmo exponer funcionalidad a otras aplicaciones mediante servicios Web.
Es recomendable que el alumno disponga de nociones de programacin Web en otras
plataformas web como ASP, si bien no es indispensable. Para facilitar la transicin de
los programadores de ASP y Visual Basic 6 al nuevo entorno, en el contenido se hace
mencin a las diferencias con los lenguajes VBScript y VB6. Si no los conoce
simplemente haga caso omiso de esos comentarios.
Le recomendamos tambin que vea la aplicacin MSDN Video, que desarrollaremos al
finalizar el curso y de la que podr consultar su cdigo fuente y videos explicativos.
Disfrute del curso!
Acerca del autor
Jose Alarcn Agun
ASP/ASP.NET MVP
Jos Manuel es ingeniero superior industrial y especialista
universitario en consultora de empresa. Es autor de varios libros,
habiendo publicado hasta la fecha cerca de 300 artculos sobre
informtica e ingeniera en publicaciones especializadas. Es
colaborador habitual de MSDN y de las ms importantes revistas
del sector como PC World, dotnetMania o Windows TI Magazine.
En la actualidad es socio de Grupo Femxa, "soluciones al servicio
del conocimiento", siendo tambin su responsable tcnico. A
travs de Krasis [www.krasis.com], la empresa tecnolgica del
grupo, dirige para sus diferentes clientes proyectos y productos
orientados a la comunicacin, la mejora de procesos y los
sistemas de teleformacin.
Puede usted visitar su Blog sobre tecnologa .NET en www.jasoft.org.
www.detodoprogramacion.com

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y
ms Gratis para el Conocimiento...!
www.detodoprogramas.com
Vistanos y comprubalo



Material para los amantes de la Programacin Java,
C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,
CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas
www.detodoprogramacion.com
Visitanos

Libros Universitarios, Contabilidad, Matemticas, obras literarias,
Administracin, ingeniera y mas



Contenido
Este mdulo presenta con carcter general la plataforma .NET y cmo sta se
diferencia de otros sistemas de desarrollo tradicionales, como ASP.
Leccin 1: Introduccin a la plataforma .NET
o Qu es la plataforma .NET?
o El entorno de ejecucin CLR
Leccin 2: El lenguaje intermedio y el CLS
o El lenguaje intermedio
o La especificacin comn de los lenguajes .NET
o El sistema de tipos comunes
Leccin 3: La biblioteca de clases de .NET
o La BCL
o Los espacios de nombres
Leccin 4: Acceso a datos con ADO.NET
o ADO.NET
o La arquitectura de ADO.NET
o Capa conectada de datos
o Capa desconectada
Leccin 5: Aplicaciones Windows Forms
o Introduccin
Leccin 6: Aplicaciones Web Forms
o Introduccin

www.detodoprogramacion.com


Introduccin a la plataforma .NET
Simplificando mucho las cosas para poder dar una definicin corta y comprensible, se
podra decir que la plataforma .NET es un amplio conjunto de bibliotecas de
desarrollo que pueden ser utilizadas por otras aplicaciones para acelerar
enormemente el desarrollo y obtener de manera automtica caractersticas avanzadas
de seguridad, rendimiento, etc...
En realidad .NET es mucho ms que eso ya que ofrece un entorno gestionado de
ejecucin de aplicaciones, nuevos lenguajes de programacin y compiladores, y
permite el desarrollo de todo tipo de funcionalidades: desde programas de consola o
servicios Windows hasta aplicaciones para dispositivos mviles, pasando por
desarrollos de escritorio o para Internet. Son estos ltimos de los que nos
ocuparemos en este curso. Pero antes conviene conocer los fundamentos en los que
se basa cualquier aplicacin creada con .NET, incluyendo las que nos interesan.
El entorno de ejecucin CLR
.NET ofrece un entorno de ejecucin para sus aplicaciones conocido como Common
Language Runtime o CLR. La CLR es la implementacin de Microsoft de un estndar
llamado Common Language Infrastructure o CLI. ste fue creado y promovido por la
propia Microsoft pero desde hace aos es un estndar reconocido mundialmente por
el ECMA.
El CLR/CLI esencialmente define un entorno de ejecucin virtual independiente en el
que trabajan las aplicaciones escritas con cualquier lenguaje .NET. Este entorno
virtual se ocupa de multitud de cosas importantes para una aplicacin: desde la
gestin de la memoria y la vida de los objetos hasta la seguridad y la gestin de
subprocesos.
www.detodoprogramacion.com
Todos estos servicios unidos a su independencia respecto a arquitecturas
computacionales convierten la CLR en una herramienta extraordinariamente til
puesto que, en teora, cualquier aplicacin escrita para funcionar segn la CLI puede
ejecutarse en cualquier tipo de arquitectura de hardware. Por ejemplo Microsoft
dispone de implementacin de .NET para Windows de 32 bits, Windows de 64 bits e
incluso para Windows Mobile, cuyo hardware no tiene nada que ver con la
arquitectura de un ordenador comn.







































www.detodoprogramacion.com


El Lenguaje Intermedio y el CLS
Al contrario que otros entornos, la plataforma .NET no est atada a un determinado
lenguaje de programacin ni favorece a uno determinado frente a otros. En la
actualidad existen implementaciones para varias decenas de lenguajes que permiten
escribir aplicaciones para la plataforma .NET. Los ms conocidos son Visual Basic
.NET, C# o J#, pero existen implementaciones de todo tipo, incluso de COBOL!.
Lo mejor de todo es que cualquier componente creado con uno de estos lenguajes
puede ser utilizado de forma transparente desde cualquier otro lenguaje .NET.
Adems, como ya se ha comentado, es posible ejecutar el cdigo .NET en diferentes
plataformas y sistemas operativos.
Cmo se consigue esta potente capacidad?
Dentro de la CLI, existe un lenguaje llamado IL (Intermediate Language o Lenguaje
Intermedio) que est pensado de forma independiente al procesador en el que se
vaya a ejecutar. Es algo parecido al cdigo ensamblador pero de ms alto nivel y
creado para un hipottico procesador virtual que no est atado a una arquitectura
determinada.
Cuando se compila una aplicacin escrita en un lenguaje .NET cualquiera (da igual
que sea VB, C# u otro de los soportados), el compilador lo que genera en realidad es
un nuevo cdigo escrito en este lenguaje intermedio. As, todos los lenguajes .NET se
usan como capa de ms alto nivel para producir cdigo IL.
Un elemento fundamental de la CLR es el compilador JIT (just-in-time). Su cometido
es el de compilar bajo demanda y de manera transparente el cdigo escrito en
lenguaje intermedio a lenguaje nativo del procesador fsico que va a ejecutar el
cdigo.
www.detodoprogramacion.com
Al final, lo que se ejecuta es cdigo nativo que ofrece un elevado rendimiento. Esto es
cierto tambin para las aplicaciones Web escritas con ASP.NET y contrasta con las
aplicaciones basadas en ASP clsico que eran interpretadas, no compiladas, y que
jams podran llegar al nivel de desempeo que ofrece ASP.NET.
La siguiente figura muestra el aspecto que tiene el cdigo intermedio de una
aplicacin sencilla y se puede obtener usando el desemsamblador que viene con la
plataforma .NET.

Figura 1.1. Cdigo en lenguaje intermedio obtenido con ILDASM.exe
La especificacin comn de los lenguajes y el sistema de tipos
comunes
Para conseguir la interoperabilidad entre lenguajes no slo llega con el lenguaje
intermedio, sino que es necesario disponer de unas "reglas del juego" que definan un
conjunto de caractersticas que todos los lenguajes deben incorporar. A este conjunto
regulador se le denomina Common Language Specification (CLS) o, en castellano,
especificacin comn de los lenguajes.
www.detodoprogramacion.com
Entre las cuestiones que regula la CLS se encuentran la nomenclatura, la forma de
definir los miembros de los objetos, los metadatos de las aplicaciones, etc... Una de
las partes ms importantes de la CLS es la que se refiere a los tipos de datos.
Si alguna vez ha programado la API de Windows o ha tratado de llamar a una DLL
escrita en C++ desde Visual Basic 6 habr comprobado lo diferentes que son los tipos
de datos de VB6 y de C++. Para evitar este tipo de problemas y poder gestionar de
forma eficiente y segura el acceso a la memoria, la CLS define un conjunto de tipos
de datos comunes (Common Type System o CTS) que indica qu tipos de datos se
pueden manejar, cmo se declaran y se utilizan stos y de qu manera se deben
gestionar durante la ejecucin.
Si nuestras bibliotecas de cdigo utilizan en sus interfaces hacia el exterior datos
definidos dentro de la CTS no existirn problemas a la hora de utilizarlos desde
cualquier otro cdigo escrito en la plataforma .NET.
Cada lenguaje .NET utiliza una sintaxis diferente para cada tipo de datos. As, por
ejemplo, el tipo comn correspondiente a un nmero entero de 32 bits
(System.Int32) se denomina Integer en Visual Basic .NET, pero se llama int en C#.
En ambos casos representan el mismo tipo de datos que es lo que cuenta.
Nota:
En ASP 3.0 se suele usar VBScript como lenguaje de programacin. En
este lenguaje interpretado, al igual que en VB6, un Integer representaba
un entero de 16 bits. Los enteros de 32 bits eran de tipo Long. Es un
fallo muy comn usar desde Visual Basic .NET el tipo Integer pensando
que es de 16 bits cuando en realidad es capaz de albergar nmeros
mucho mayores. Tngalo en cuenta cuando empiece a programar.
Existen tipos por valor (como los enteros que hemos mencionado o las
enumeraciones) y tipos por referencia (como las clases). En el siguiente mdulo se
profundiza en todas estas cuestiones.

Ver vdeo 1 de esta leccin (Lenguaje intermedio)












www.detodoprogramacion.com


La biblioteca de clases de .NET
Todo lo que se ha estado comentando hasta ahora en el curso constituye la base de la
plataforma .NET. Si bien es muy interesante y fundamental, por s mismo no nos
servira de mucho para crear programas si debisemos crear toda la funcionalidad
desde cero.
Obviamente esto no es as, y la plataforma .NET nos ofrece infinidad de
funcionalidades "de fbrica" que se utilizan como punto de partida para crear las
aplicaciones. Existen funcionalidades bsicas (por ejemplo todo lo relacionado con la
E/S de datos o la seguridad) y funcionalidades avanzadas en las que se fundamentan
categoras enteras de aplicaciones (acceso a datos, creacin de aplicaciones Web...).
Toda esta funcionalidad est implementada en forma de bibliotecas de funciones que
fsicamente se encuentran en diversas DLL (bibliotecas de enlazado dinmico). A su
conjunto se le denomina Base Classes Library (Biblioteca de clases base o BCL) y
forman parte integral de la plataforma .NET, es decir, no se trata de aadidos que se
deban obtener o adquirir aparte.
La siguiente figura ilustra a vista de pjaro la arquitectura conceptual de la plataforma
.NET. En ella se pueden observar los elementos que se han mencionado en apartados
anteriores (lenguajes, CLR, CLS...) y en qu lugar de se ubican las bibliotecas de
clases base:
www.detodoprogramacion.com

Figura 1.2. Distintos elementos de la plataforma .NET y cmo se relacionan
entre s.
Resulta muy til para comprender lo explicado hasta ahora. No se preocupe si hay
elementos que no conoce, ms adelante los estudiaremos todos.
Todo lo que se encuentra en la BCL forma parte de la plataforma .NET. De hecho
existe tal cantidad de funcionalidad integrada dentro de estas bibliotecas (hay
decenas de miles de clases) que el mayor esfuerzo que todo programador que se
inicia en .NET debe hacer es el aprendizaje de las ms importantes. De todos modos
Visual Studio ofrece mucha ayuda contextual (documentacin, Intellisense...) y una
vez que se aprenden los rudimentos resulta fcil ir avanzando en el conocimiento de
la BCL a medida que lo vamos necesitando.
Los espacios de nombres
Dada la ingente cantidad de clases que existen debe haber algn modo de
organizarlas de un modo coherente. Adems hay que tener en cuenta que podemos
adquirir ms funcionalidades (que se traducen en clases) a otros fabricantes, por no
mencionar que crearemos continuamente nuevas clases propias.
Para solucionar este problema existen en todos los lenguajes .NET los espacios de
nombres o namespaces.
Un espacio de nombres no es ms que un identificador que permite organizar de
modo estanco las clases que estn contenidas en l as como otros espacios de
nombres.
www.detodoprogramacion.com
As, por ejemplo, todo lo que tiene que ver con el manejo de estructuras de datos
XML en la plataforma .NET se encuentra bajo el espacio de nombres System.Xml. La
funcionalidad fundamental para crear aplicaciones Web est en el espacio de nombres
System.Web. ste a su vez contiene otros espacios de nombres ms especializados
como System.Web.Caching para la persistencia temporal de datos,
System.Web.UI.WebControls, que contiene toda la funcionalidad de controles Web
para interfaz de usuario, etc...

Ver vdeo 1 de esta leccin (Utilizacin de las clases base)



































www.detodoprogramacion.com


Acceso a datos con ADO.NET
El acceso a fuentes de datos es algo indispensable en cualquier lenguaje o plataforma
de desarrollo. La parte de la BCL que se especializa en el acceso a datos se denomina
de forma genrica como ADO.NET.
Si usted ha programado con Visual Basic 6.0 o con ASP, ha empleado en su cdigo
con total seguridad la interfaz de acceso a datos conocida como ADO (ActiveX Data
Objects), puede que combinado con ODBC (Open Database Connectivity). Si adems
es usted de los programadores con solera y lleva unos cuantos aos en esto es
probable que haya usado RDO o incluso DAO, todos ellos mtodos mucho ms
antiguos.
ADO.NET ofrece una funcionalidad completamente nueva, que tiene poco que ver con
lo existente hasta la fecha en el mercado. Sin embargo, con el nimo de retirar
barreras a su aprendizaje, Microsoft denomin a su nuevo modelo de acceso a datos
con un nombre similar y algunas de sus clases recuerdan a objetos de propsito
anlogo en el vetusto ADO.
ADO.NET es un modelo de acceso mucho ms orientado al trabajo desconectado de
las fuentes de datos de lo que nunca fue ADO. Si bien este ltimo ofreca la
posibilidad de desconectar los Recordsets y ofreca una forma de serializacin de estos
a travs de las diferentes capas de una aplicacin, el mecanismo no es ni de lejos tan
potente como el que nos ofrece ADO.NET.
El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos
es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de
datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets
su funcionalidad va mucho ms all como se ver en el correspondiente mdulo.
www.detodoprogramacion.com
Arquitectura de ADO.NET
El concepto ms importante que hay que tener claro sobre ADO.NET es su modo de
funcionar, que se revela claramente al analizar su arquitectura:

Figura 1.3.- Arquitectura de ADO.NET
Existen dos capas fundamentales dentro de su arquitectura: la capa conectada y la
desconectada.
Capa conectada
La primera de ellas contiene objetos especializados en la conexin con los orgenes de
datos. As, la clase genrica Connection se utiliza para establecer conexiones a los
orgenes de datos. La clase Command se encarga de enviar comandos de toda ndole
al origen de datos. Por fin la clase DataReader est especializada en leer los
resultados de los comandos mientras se permanece conectado al origen de datos.
La clase DataAdapter hace uso de las tres anteriores para actuar de puente entre la
capa conectada y la desconectada.
Estas clases son abstractas, es decir, no tienen una implementacin real de la que se
pueda hacer uso directamente. Es en este punto en donde entran en juego los
proveedores de datos. Cada origen de datos tiene un modo especial de
comunicarse con los programas que los utilizan, adems de otras particularidades que
se deben contemplar. Un proveedor de datos de ADO.NET es una implementacin
www.detodoprogramacion.com
concreta de las clases conectadas abstractas que hemos visto, que hereda de stas y
que tiene en cuenta ya todas las particularidades del origen de datos en cuestin.
As, por ejemplo, las clases especficas para acceder a SQL Server se llaman
SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se
encuentran bajo el espacio de nombres System.Data.SqlClient. Es decir, al
contrario que en ADO clsico no hay una nica clase Connection o Command que se
use en cada caso, si no que existen clases especializadas para conectarse y recuperar
informacin de cada tipo de origen de datos.
Nota:
El hecho de utilizar clases concretas para acceso a las fuentes de datos
no significa que no sea posible escribir cdigo independiente del origen
de datos. Todo lo contrario. La plataforma .NET ofrece grandes
facilidades de escritura de cdigo genrico basadas en el uso de herencia
e implementacin de interfaces. De hecho la versin 2.0 de .NET ofrece
grandes novedades especficamente en este mbito.
Existen proveedores nativos, que son los que se comunican directamente con el
origen de datos (por ejemplo el de SQL Server o el de Oracle), y proveedores
"puente", que se utilizan para acceder a travs de ODBC u OLEDB cuando no existe
un proveedor nativo para un determinado origen de datos.
Nota:
Estos proveedores nativos, si bien muy tiles en determinadas
circunstancias, ofrecen un rendimiento menor debido a la capa
intermedia que estn utilizando (ODBC u OLEDB). Un programador novel
puede sentir la tentacin de utilizar siempre el proveedor puente para
OLEDB y as escribir cdigo compatible con diversos gestores de datos
de forma muy sencilla. Se trata de un error y siempre que sea posible es
mejor utilizar un proveedor nativo.
Capa desconectada
Una vez que ya se han recuperado los datos desde cualquier origen de datos que
requiera una conexin sta ya no es necesaria. Sin embargo sigue siendo necesario
trabajar con los datos obtenidos de una manera flexible. Es aqu cuando la capa de
datos desconectada entra en juego. Adems, en muchas ocasiones es necesario tratar
con datos que no han sido obtenidos desde un origen de datos relacional con el que
se requiera una conexin. A veces nicamente necesitamos un almacn de datos
temporal pero que ofrezca caractersticas avanzadas de gestin y acceso a la
informacin.
Por otra parte las conexiones con las bases de datos son uno de los recursos ms
escasos con los que contamos al desarrollar. Su mala utilizacin es la causa ms
frecuente de cuellos de botella en las aplicaciones y de que stas no escalen como es
debido. Esta afirmacin es especialmente importante en las aplicaciones Web en las
que se pueden recibir muchas solicitudes simultneas de cualquier parte del mundo.
www.detodoprogramacion.com
Finalmente otro motivo por el que es importante el uso de los datos desconectado de
su origen es la transferencia de informacin entre capas de una aplicacin. stas
pueden encontrarse distribuidas por diferentes equipos, e incluso en diferentes
lugares del mundo gracias a Internet. Por ello es necesario disponer de algn modo
genrico y eficiente de poder transportar los datos entre diferentes lugares, utilizarlos
en cualquiera de ellos y posteriormente tener la capacidad de conciliar los cambios
realizados sobre ellos con el origen de datos del que proceden.
Todo esto y mucho ms es lo que nos otorga el uso de los objetos DataSet. Es obvio
que no se trata de tareas triviales, pero los objetos DataSet estn pensados y
diseados con estos objetivos en mente. Como podremos comprobar ms adelante en
este curso es bastante sencillo conseguir estas funcionalidades tan avanzadas y
algunas otras simplemente usando de manera adecuada este tipo de objetos.
Nota:
Otra interesante caracterstica de los DataSet es que permiten gestionar
simultneamente diversas tablas (relaciones) de datos, cada una de un
origen diferente si es necesario, teniendo en cuenta las restricciones y
las relaciones existentes entre ellas.
Los DataSet, como cualquier otra clase no sellada de .NET, se pueden extender
mediante herencia. Ello facilita una tcnica avanzada que consiste en crear tipos
nuevos de DataSet especializados en la gestin de una informacin concreta (por
ejemplo un conjunto de tablas relacionadas). Estas nuevas tipos clases se denominan
genricamente DataSet Tipados, y permiten el acceso mucho ms cmodo a los
datos que representan, verificando reglas de negocio, y validaciones de tipos de datos
ms estrictas.





















www.detodoprogramacion.com


Aplicaciones Windows Forms
Las aplicaciones de escritorio son aquellas basadas en ventanas y controles comunes
de Windows que se ejecutan en local. Son el mismo tipo de aplicaciones que antes
construiramos con Visual Basic 6 u otros entornos similares.
En la plataforma .NET el espacio de nombres que ofrece las clases necesarias para
construir aplicaciones de escritorio bajo Windows se denomina Windows Forms. Este
es tambin el nombre genrico que se le otorga ahora a este tipo de programas
basados en ventanas.
Windows Forms est constituido por multitud de clases especializadas que ofrecen
funcionalidades para el trabajo con ventanas, botones, rejillas, campos de texto y
todo este tipo de controles habituales en las aplicaciones de escritorio.
Visual Studio ofrece todo lo necesario para crear visualmente este tipo de programas,
de un modo similar aunque ms rico al que ofreca el entorno de desarrollo integrado
de Visual Basic.
www.detodoprogramacion.com

Figura 1.4.- Diseador de interfaces de aplicaciones de escritorio con
Windows Forms en Visual Studio 2005.
Al contrario que en VB6, .NET proporciona control sobre todos los aspectos de las
ventanas y controles, no dejando nada fuera del alcance del programador y otorgando
por lo tanto la mxima flexibilidad. Los formularios (ventanas) son clases que heredan
de la clase base Form, y cuyos controles son miembros de sta. De hecho se trata
nicamente de cdigo y no es necesario (aunque s muy recomendable) emplear el
diseador grfico de Visual Studio para crearlas.
Este es el aspecto que presenta parte del cdigo que genera la interfaz mostrada en
la anterior figura:
www.detodoprogramacion.com

Figura 1.5.- Cdigo autogenerado por Visual Studio para crear la interfaz de
la figura anterior.
Al contrario que en Visual Basic tradicional, en donde siempre existan instancias por
defecto de los formularios que podamos usar directamente, en .NET es necesario
crear un objeto antes de poder hacer uso de los formularios:
Dim frm As New MiFormulario
frm.Show()
Todos los controles heredan de una clase Control por lo que conservan una serie de
funcionalidades comunes muy interesantes, como la capacidad de gestionarlos en el
diseador (movindolos, alinendolos...), de definir mrgenes entre ellos o hacer que
se adapten al tamao de su contenedor.
Este tipo de aplicaciones se salen del mbito de este curso por lo que no se
profundizar ms en ellas.






www.detodoprogramacion.com


Aplicaciones Web Forms
Tradicionalmente las aplicaciones Web se han desarrollado siguiendo un modelo mixto
que intercalaba cdigo HTML y JavaScript propio de pginas Web (parte cliente), junto
con cdigo que se ejecutara en el servidor (parte servidora). Este modelo contrastaba
por completo con el modelo orientado a eventos seguido por las principales
herramientas de desarrollo de aplicaciones de escritorio.
En el modelo orientado a eventos se define la interfaz de usuario colocando controles
en un contenedor y se escribe el cdigo que actuar como respuesta a las
interacciones de los usuarios sobre estos controles. Si conoce el diseador de VB6 o
de Windows Forms mencionado en el apartado anterior sabe exactamente a qu nos
referimos.
Hacer esto en una aplicacin de escritorio no tiene mayor dificultad ya que todo el
cdigo se ejecuta en el mismo lugar. La principal caracterstica de las aplicaciones
Web sin embargo es que se la interfaz de usuario (lo que los usuarios de la aplicacin
ven) se ejecuta en un lugar diferente al cdigo de la aplicacin que reside en un
servidor. Para mayor desgracia estas aplicaciones se basan en el uso del protocolo
HTTP que es un protocolo sin estado y que no conserva la conexin entre dos
llamadas consecutivas.
Por ejemplo, el siguiente cdigo ilustra el cdigo que es necesario escribir en ASP
para disponer de una pgina que rellena una lista de seleccin con unos cuantos
nombres (podran salir de una base de datos y an sera ms complicado), y que
dispone de un botn que escribe un saludo para el nombre que se haya elegido de la
lista.
www.detodoprogramacion.com

Figura 1.6.- Cdigo ASP sencillo que genera una lista de seleccin y saluda al
presionar un botn.
Obviamente se podra haber simplificado sin enviar el formulario al servidor usando
JavaScript en el cliente para mostrar el saludo, pero la intencin es ilustrar la mezcla
de cdigo de cliente y de servidor que existe en este tipo de aplicaciones.
Las principales desventajas de este tipo de codificacin son las siguientes:
1. No existe separacin entre el diseo y la lgica de las aplicaciones. Si
queremos cambiar sustancialmente la apariencia de la aplicacin Web lo
tendremos bastante complicado puesto que el cdigo del servidor est
mezclado entre el HTML.
2. En ASP clsico no existe el concepto de control para la interfaz de usuario.
Lo nico que hay es HTML y JavaScript que se deben generar desde el servidor.
En el ejemplo de la figura para generar un control de lista con unos elementos
no podemos asignar una propiedad de la lista (porque no existe tal lista), sino
que tenemos que crear un bucle que genere los elementos HTML necesarios
para generarla. Tampoco disponemos de un diseador visual que nos permita
gestionar los controles y elementos HTML existentes, y menos cuando stos se
encuentran mezclados con el cdigo del servidor.
www.detodoprogramacion.com
3. No disponemos de forma de detectar en el servidor que se ha realizado
algo en el cliente. El cliente se encuentra desconectado desde el momento en
que se termina de devolver la pgina. Slo se recibe informacin en el servidor
cuando se solicita una nueva pgina o cuando se enva un formulario tal y como
se hace en el ejemplo, debindonos encargar nosotros de averiguar si la
peticin es la primera vez que se hace o no, y de dar la respuesta adecuada. En
cualquier caso es mucho menos intuitivo que el modelo de respuesta a eventos
de una aplicacin de escritorio.
4. No existe constancia del estado de los controles de cada pgina entre
las llamadas. En cada ejecucin de la pgina tendremos que recrear
completamente la salida. Por ejemplo si presionamos el botn Di Hola
tenemos que escribir adems de la etiqueta Hola, nombre el resto de la
pantalla, incluyendo la lista con todos los nombres dejando seleccionado el
mismo que hubiese antes. Si estos nombres viniesen de una base de datos esto
puede ser todava ms ineficiente y tendremos que buscar mtodos alternativos
para generarlos ya que en ASP tampoco se deben almacenar en los objetos de
sesin y/o aplicacin Recordsets resultado de consultas.
5. No existe el concepto de Propiedad de los controles. En una aplicacin
Windows asignamos el texto de un campo usando una propiedad (por ejemplo
Text1.Text = "Hola") y sta se asigna y permanece en la interfaz sin que
tengamos que hacer nada. En una aplicacin Web clsica tenemos que
almacenarlas en algn sitio (una variable de sesin o un campo oculto) para
conservarlas entre diferentes peticiones de una misma pgina.
6. Los controles complejos no tienen forma de enviar sus valores al
servidor. Si intentamos crear una interfaz avanzada que utilice tablas y otros
elementos que no son controles de entrada de datos de formularios de HTML
tendremos que inventarnos mecanismos propios para recoger esos datos y
enviarlos al servidor.
La principal aportacin de ASP.NET al mundo de la programacin es que ha llevado a
la Web el paradigma de la programacin orientada a eventos propia de aplicaciones
de escritorio, ofreciendo:
Separacin entre diseo y lgica.
Componentes de interfaz de usuario, tanto estndar como de terceras empresas
o propios.
Diseadores grficos.
Eventos.
Estado.
Enlazado a datos desde la interfaz.
Esto como se ver marca un antes y un despus en la programacin para Internet.

Ver vdeo 1 de esta leccin (Diseador de formularios Web)




www.detodoprogramacion.com


Nota: Para mayor simplicidad los videos de este mdulo estn realizados con aplicaciones de
consola. Si quiere reproducir los ejemplos mostrados en estos videos en una aplicacin web
puede modificar las instrucciones Console.WriteLine por Response.Write.
Contenido

Leccin 1: El sistema de tipos
o Tipos primitivos
o Variables y constantes
o Enumeraciones
o Arrays (matrices)
Leccin 2: Clases y estructuras
o Clases
o Definir una clase
o Instanciar una clase
o Estructuras
o Accesibilidad
o Propiedades
o Interfaces
Leccin 3: Manejo de excepciones
o Manejo de excepciones
Leccin 4: Eventos y delegados
o Eventos
o Definir y producir eventos en una clase
o Delegados
www.detodoprogramacion.com
o Definir un evento bien informado
Leccin 5: Atributos
o Atributos


Ver video de introduccin (Crear un proyecto de consola)




































www.detodoprogramacion.com


Introduccin
En esta primera leccin veremos los tipos de datos que .NET Framework pone a
nuestra disposicin, as mismo veremos las diferencias con respecto a los tipos de
datos de VBScript/VB6 y las equivalencias entre los tipos de ambos entornos, de esta
forma nos resultar ms fcil familiarizarnos. Aunque no debemos olvidar que en .NET
los tipos de datos tienen un tratamiento, en algunos casos, especial que pueden
llevarnos a confusin, por tanto en los casos que pueda existir esa posibilidad de
funcionamiento diferente, veremos ejemplos de cmo los manejbamos en
VBScript/VB6 y cmo tendremos que usarlos desde Visual Basic .NET.
A continuacin daremos un repaso a conceptos bsicos o elementales sobre los tipos
de datos, que si bien nos sern familiares, es importante que lo veamos para poder
comprender mejor cmo estn definidos y organizados los tipos de datos en .NET y de
paso veremos las equivalencias con respecto a VBScript/VB6.

Tipos de datos de .NET
Visual Basic .NET est totalmente integrado con .NET Framework, por tanto los tipos
de datos que podremos usar con este lenguaje sern los definidos en este "marco de
trabajo", por este motivo vamos a empezar usando algunas de las definiciones que
nos encontraremos al recorrer la documentacin que acompaa a este lenguaje de
programacin.
En los siguientes enlaces tenemos los temas a tratar en esta primera leccin del
mdulo sobre las caractersticas del lenguaje Visual Basic .NET
www.detodoprogramacion.com
Tipos primitivos
o Sufijos o caracteres y smbolos identificadores para los tipos
o Tipos por valor y tipos por referencia
Variables y constantes
o Consejo para usar las constantes
o Declarar variables
o Declarar variables y asignar el valor inicial
o El tipo de datos Char
o Obligar a declarar las variables con el tipo de datos
o Aplicar Option Strict On a un fichero en particular
o Aplicar Option Stict On a todo el proyecto
o Ms opciones aplicables a los proyectos
Enumeraciones: Constantes agrupadas
o El nombre de los miembros de las enumeraciones
o Los valores de una enumeracin no son simples nmeros
Arrays (matrices)
o Declarar e inicializar un array
o Cambiar el tamao de un array
o Eliminar el contenido de un array
o Los arrays son tipos por referencia






















www.detodoprogramacion.com


Tipos primitivos
Veamos en la siguiente tabla los tipos de datos definidos en .NET Framework y los
alias utilizados en Visual Basic 2005, as como el equivalente de VBScript/VB6.
.NET Framework VB.NET VBScript/VB6
System.Boolean Boolean Boolean *
System.Byte Byte Byte
System.Int16 Short Integer
System.Int32 Integer Long
System.Int64 Long N.A.
System.Single Single Single
System.Double Double Double
System.Decimal Decimal Currency *
System.Char Char N.A. (ChrW)
System.String String String *
System.Object Object Variant / Object *
System.DateTime Date Date *

System.SByte SByte N.A.
System.UInt16 UShort N.A.
System.UInt32 UInteger N.A.
System.UInt64 ULong N.A.
Tabla 1.1. Tipos de datos y equivalencia entre lenguajes
www.detodoprogramacion.com
En la columna de equivalencias con VBScript/VB6 tenemos algunos indicados con
N.A., estos tipos no tienen equivalencia. Por otro lado, los marcados con un asterisco
(*) no tienen equivalencia directa, pero el o los tipos indicados seran los que ms se
aproximaran.
El caso del tipo String es un caso especial, realmente un String de .NET es casi como
uno de VBScript/VB6, con la diferencia de que las cadenas en .NET son inmutables.
Esto quiere decir que una vez que se han creado no se pueden modificar, y en caso
de que queramos cambiar el contenido, .NET se encarga de usar la anterior y crear
una nueva cadena. Por tanto si usamos las cadenas para realizar concatenaciones
(unin de cadenas para crear una nueva), el rendimiento es inferior incluso al que
tenamos en VBScript/VB6. Existe una clase en .NET que es ideal para estos casos y
cuyo rendimiento es superior al de VBScript/VB6: la clase StringBuilder que ya
hemos visto someramente en un vdeo del mdulo anterior.
Las ltimas filas mostradas en la tabla son tipos especiales que si bien son parte del
sistema de tipos comunes (CTS) no forman parte de la Common Language
Specification (CLS), es decir la especificacin comn para los lenguajes "compatibles"
con .NET. Por tanto, si queremos crear aplicaciones que puedan interoperar con todos
los lenguajes de .NET, no debemos usar estos tipos como valores de devolucin de
funciones ni como tipo de datos usado en los argumentos de las funciones,
propiedades o procedimientos pblicos.
Los tipos mostrados en la tabla 1 son los tipos primitivos de .NET y por extensin de
Visual Basic 2005, es decir son tipos "elementales" para los cuales cada lenguaje
define su propia palabra clave equivalente con el tipo definido en el CTS de .NET
Framework. Todos estos tipos primitivos podemos usarlos tanto por medio de los
tipos propios de Visual Basic, los tipos definidos en .NET o bien como literales. Por
ejemplo, podemos definir un nmero entero literal indicndolo con el sufijo I: 12345I
o bien asignndolo a un valor de tipo Integer o a un tipo Sytem.Int32 de .NET. La
nica excepcin de los tipos mostrados en la tabla 1 es el tipo de datos Object, este
es un caso especial del que nos ocuparemos en la prxima leccin.
Sufijos o caracteres y smbolos identificadores para los tipos
Cuando usamos valores literales numricos en Visual Basic 2005, el tipo de datos que
por defecto le asigna el compilador es el tipo Double. Si nuestra intencin es utilizar
sin embargo un tipo de datos diferente, podemos indicarlo aadiendo una letra como
sufijo al tipo. Por ejemplo para indicar que queremos considerar un valor entero
podemos usar la letra I o el signo %, de igual forma, un valor de tipo entero largo
(Long) lo podemos indicar usando L o &, en la siguiente tabla podemos ver los
caracteres o letra que podemos usar como sufijo en un literal numrico para que el
compilador lo identifique sin ningn lugar a dudas.
Tipo de datos Smbolo Carcter
Short N.A. S
Integer % I
Long & L
Single ! F
Double # R
www.detodoprogramacion.com
Decimal @ D
UShort N.A. US
UInteger N.A. UI
ULong N.A. UL
Tabla 1.2. Sufijos para identificar los tipos de datos
El uso de estos caracteres nos puede resultar de utilidad particularmente para los
tipos de datos que no se pueden convertir en un valor doble.
Por ejemplo, si queremos asignar este valor literal a un tipo Decimal:
12345678901234567890, tal como vemos en la Figura 2, el IDE de Visual Studio
2005 nos indicar que existe un error de desbordamiento (Overflow) ya que esa cifra
es muy grande para usarlo como valor Double, pero si le agregamos el sufijo D o @
ya no habr dudas de que estamos tratando con un valor Decimal.



Figura 2.1. Error de desbordamiento al intentar asignar un valor Double a
una variable Decimal

Tipos por valor y tipos por referencia
Los tipos de datos de .NET los podemos clasificar en dos grupos:
Tipos por valor
Tipos por referencia
Los tipos por valor son tipos de datos cuyo valor se almacena en la pila o en la
memoria "cercana", como los numricos que hemos visto. Podemos decir que el
acceso al valor contenido en uno de estos tipos es directo, es decir se almacena
directamente en la memoria reservada para ese tipo y cualquier cambio que hagamos
lo haremos directamente sobre dicho valor. De igual forma cuando copiamos valores
de un tipo por valor a otro, estaremos haciendo copias independientes.
www.detodoprogramacion.com
Por otro lado, los tipos por referencia se almacenan en el "montculo" (heap) o
memoria "lejana". A diferencia de los tipos por valor, los tipos por referencia lo nico
que almacenan es una referencia (o puntero) al valor asignado. Si hacemos copias de
tipos por referencia, realmente lo que copiamos es la referencia propiamente dicha,
pero no el contenido.
Estos dos casos los veremos en breve con ms detalle.

Ver video 1 de esta leccin (Tipos de datos primitivos)
Ver video 2 de esta leccin (Tipos por valor y por referencia)

































www.detodoprogramacion.com


Variables y constantes
Disponer de todos estos tipos de datos no tendra ningn sentido si no los pudiramos
usar de alguna otra forma que de forma literal. Y aqu es donde entran en juego las
variables y constantes.
Consejo para usar las constantes
Siempre que tengamos que indicar un valor constante, ya sea para indicar el mximo
o mnimo permitido en un rango de valores o para comprobar el trmino de un bucle,
deberamos usar una constante en lugar de un valor literal. De esta forma si ese valor
lo usamos en varias partes de nuestro cdigo, si en un futuro decidimos que dicho
valor debe ser diferente, nos resultar ms fcil realizar un solo cambio que cambiarlo
en todos los sitios en los que lo hemos usado. Adems de que de esta forma nos
aseguramos de que el cambio se realiza adecuadamente y no tendremos que
preocuparnos de las consecuencias derivadas de no haber hecho el cambio en todos
los sitios que deberamos.
Pero esto no es algo nuevo, las constantes se definen de la misma forma que en
VBScript/VB6, salvo que ahora podemos obligarnos a indicar el tipo de datos que esa
constante va a contener. Esto lo veremos en la siguiente seccin.
Declarar variables
La declaracin de las variables en Visual Basic 2005 se hace de la misma forma que
en VBScript/VB6/VB6, o casi, las excepciones vienen dadas, como hemos comentado
antes, de la posibilidad de obligar a definir el tipo de cada variable y de cmo
podemos definir ms de una variable en una misma instruccin Dim.
www.detodoprogramacion.com
Para no embrollar mucho la cosa, veamos ejemplos de cmo definir o declarar
variables siguiendo las buenas costumbres, es decir, indicando siempre el tipo de
datos de la variable.
En VB6 era posible definir ms de una variable en una misma instruccin Dim, aunque
dependiendo de cmo hiciramos esa declaracin poda ser que, normalmente para
nuestro pesar, que no todas las variables fuesen del tipo que "supuestamente"
habamos querido indicar.
Por ejemplo, con esta declaracin:
Dim a, b, c As Integer
A primera vista estamos declarando tres variables de tipo Integer, pero realmente
solo declara con el tipo indicado a la ltima variable, las otras dos, se declaran con
tipo Variant o el tipo de datos predefinido (que es el que tiene por defecto todas las
variables en VBScript/VB6 para ASP clsico).
En Visual Basic 2005 al usar esa misma lnea de cdigo estamos declarando tres
variables de tipo Integer, esto es algo que debemos tener en cuenta, sobre todo si
nuestra intencin era hacer precisamente lo que VB6, haca, es decir, declarar dos
variables de tipo Variant y una de tipo Integer.
Declarar variables y asignar el valor inicial
En Visual Basic 2005 tambin podemos inicializar una variable con un valor distinto al
predeterminado, que en los tipos numricos es un cero, en las fechas es el 1 de enero
del ao 1 a las doce de la madrugada (#01/01/0001 12:00:00AM#) y en la
cadenas es un valor nulo (Nothing), para hacerlo, simplemente tenemos que indicar
ese valor, tal como veremos es muy parecido a como se declaran las constantes. Por
ejemplo:
Dim a As Integer = 10
En esa misma lnea podemos declarar y asignar ms variables, pero todas deben
estar indicadas con el tipo de datos:
Dim a As Integer = 10, b As Integer = 25
Por supuesto, el tipo de datos puede ser cualquiera de los tipos primitivos:
Dim a As Integer = 10, b As Integer = 25, s As String = "Hola"
Aunque para que el cdigo sea ms legible, y fcil de depurar, no deberamos mezclar
en una misma instruccin Dim ms de un tipo de datos.
Nota:
Es importante saber que en las cadenas de Visual Basic 2005 el valor de
www.detodoprogramacion.com
una variable de tipo String no inicializada NO es una cadena vaca como
ocurra en VBScript/VB6, sino un valor nulo (Nothing).
El tipo de datos Char
En Visual Basic 2005 podemos declarar valores de tipo Char, este tipo de datos es un
carcter Unicode y podemos declararlo y asignarlo a un mismo tiempo. El problema
con el que nos podemos encontrar es a la hora de indicar un carcter literal.
Si bien en VBScript/VB6 no existe el tipo de datos Char, si podemos convertir un valor
numrico en un carcter (realmente en una cadena) o bien podemos convertir un
carcter en su correspondiente valor numrico.
Dim c As String
c = Chr(65)
Dim n As Integer
n = Asc("A")
En Visual Basic 2005 tambin podemos usar esas mismas funciones, aunque en el
caso de Chr, el valor que devuelve esta funcin es un valor de tipo Char, no de tipo
String como ocurre en VBScript/VB6, pero debido a que un valor de tipo Char se
puede convertir en una cadena, podemos hacer una asignacin como la mostrada en
el cdigo anterior sin ningn tipo de problemas.
Si nuestra intencin es asignar un valor Char a una variable, adems de la funcin
Chr, podemos hacerlo con un literal, ese valor literal estar encerrado entre comillas
dobles, (al igual que una cadena), aunque para que realmente sea un carcter
debemos agregarle una c justo despus del cierre de las comillas dobles:
Dim c As Char = "A"c

Obligar a declarar las variables con el tipo de datos
La obligatoriedad, a la que hacamos referencia anteriormente, de declarar las
variables y constantes con el tipo de datos adecuado, la podemos aplicar a todo el
proyecto o a un mdulo en particular. Para ello tenemos que usar la instruccin
Option Strict On, una vez indicado, se aplicar a todo el cdigo, no solo a las
declaraciones de variable, constantes o al tipo de datos devuelto por las funciones y
propiedades, sino tambin a las conversiones y asignaciones entre diferentes tipos de
datos.
No debemos confundir Option Strict con el clsico Option Explicit de VB. Este
ltimo, al igual que en VBScript/VB6, nos obliga a declarar todas las variables,
mientras que el primero lo que hace es obligarnos a que esas declaraciones tengan un
tipo de datos.
www.detodoprogramacion.com
Tanto una como la otra tienen dos estados: conectado o desconectado dependiendo
de que agreguemos On u Off respectivamente.
Como recomendacin para buenas prcticas, debemos "conectar" siempre estas dos
opciones, si bien Option Explicit On ya viene como valor por defecto, cosa que no
ocurre con Option Strict, que por defecto est desconectado.

Aplicar Option Strict On a un fichero en particular
Cuando en VBScript/VB6 agregbamos un nuevo formulario, mdulo BAS o mdulo de
clase, se agregaba automticamente la instruccin Option Explicit, en Visual Basic
2005 esta opcin est predefinida y no se agrega a ningn mdulo, pero eso no
significa que no se aplique, aunque siempre podemos escribir esas instrucciones (con
el valor On al final) en cada uno de los mdulos o ficheros de cdigo que agreguemos
a nuestro proyecto. Lo mismo podemos hacer con Option Strict On, en caso de que
nos decidamos a hacerlo, esas lneas de cdigo deben aparecer al principio del fichero
y solamente pueden estar precedidas de comentarios (instrucciones REM o lneas
iniciadas con una comilla simple).
En la Figura 2 mostrada anteriormente tenemos una captura del editor de Visual Basic
2005 en la que hemos indicado que queremos tener comprobacin estricta.

Aplicar Option Strict On a todo el proyecto
Tambin podemos hacer que Option Strict funcione igual que Option Explicit, es decir,
que est activado a todo el proyecto, en este caso no tendramos que indicarlo en
cada uno de los ficheros de cdigo que formen parte de nuestro proyecto, si bien
solamente ser aplicable a los que no tengan esas instrucciones. Aclaremos esto
ltimo: si Option Strict (u Option Explicit) est definido de forma global al proyecto,
podemos desactivarlo en cualquiera de los ficheros, para ello simplemente habra que
usar esas declaraciones pero usando Off en lugar de On. De igual forma, si ya est
definido globalmente y lo indicamos expresamente, no se producir ningn error. Lo
importante aqu es saber que siempre se usar el estado indicado en cada fichero,
independientemente de cmo lo tengamos definido para el mbito del proyecto.
Para que siempre se usen estas asignaciones en todo el proyecto, vamos a ver cmo
indicarlo en el entorno de Visual Studio 2005.
Abrimos Visual Studio 2005 y una vez que se haya cargado, (no hace falta crear
ningn nuevo proyecto, de este detalle nos ocuparemos en breve), seleccionamos la
opcin Herramientas>Opciones... se mostrar un cuadro de dilogo y del panel
izquierdo seleccionamos la opcin Proyectos y soluciones, la expandimos y
seleccionamos Valores predeterminados de VB y veremos ciertas opciones, tal
como podemos comprobar en la Figura 2.2:
www.detodoprogramacion.com

Figura 2.2. Opciones de proyectos (opciones mnimas)

Nota:
La figura mostrada corresponde a la versin Visual Web Developer de
Visual Studio. El contenido de su pantalla variar dependiendo de la
versin de Visual Studio 2005 de la que disponga.
De la lista despegable Option Strict, seleccionamos On. Por defecto ya estarn
seleccionadas las opciones On de Option Explicit y Binary de Option Compare,
por tanto no es necesario realizar ningn cambio ms, para aceptar los cambios y
cerrar el cuadro de dilogo, presionamos el botn Aceptar.
Nota:
Aunque en esta captura muestre: C:\vbexpB1 en Default project
location, salvo que lo cambiemos, aparecer el path por defecto dentro
de Mis documentos.
Como podemos observar, aparecen pocas opciones, si bien podemos hacer que se
muestren todas las disponibles, para hacerlo, debemos marcar la casilla que est en
la parte inferior izquierda en la que podemos leer: Mostrar todas las
configuraciones, al seleccionar esa opcin nos mostrar un nmero mayor de
opciones, tal como podemos ver en la Figura 2.3:
www.detodoprogramacion.com


Figura 2.3. Opciones de proyectos (todas las opciones)
Desde este momento el compilador de VB se volver estricto en todo lo relacionado a
las declaraciones de variables y conversiones, tal como vemos en la Figura 2.4 al
intentar declarar una variable sin indicar el tipo de datos.


Figura 2.4. Aviso de Option Strict al declarar una variable sin tipo

www.detodoprogramacion.com
Nota:
Una de las ventajas del IDE (Integrated Development Environment,
entorno de desarrollo integrado) de Visual Studio 2005 es que nos avisa
al momento de cualquier fallo que cometamos al escribir el cdigo, este
"pequeo" detalle, aunque alguna veces puede llegar a parecer
fastidioso, nos facilita la escritura de cdigo, ya que no tenemos que
esperar a realizar la compilacin para que tengamos constancia de esos
fallos.

Ms opciones aplicables a los proyectos
Aunque en estos mdulos no trataremos a fondo el entorno de desarrollo, ya que la
finalidad de este curso es tratar ms en el cdigo propiamente dicho, vamos a
mostrar otro de los sitios en los que podemos indicar que se haga una comprobacin
estricta de tipos y, como veremos, tambin podremos forzar algunas "nuevas
peculiaridades" de Visual Basic 2005, todas ellas relacionadas con el tema que
estamos tratando.
Cuando tengamos un proyecto cargado en el IDE de Visual Studio, (pronto veremos
cmo crear uno), podemos mostrar las propiedades del proyecto, para ello
seleccionaremos del men Proyecto la opcin Propiedades de
<NombreDelProyecto> y tendremos un cuadro de dilogo como el mostrado en la
Figura 2.5.
www.detodoprogramacion.com
www.detodoprogramacion.com

Figura 2.5. Ficha Compilar de las opciones del proyecto actual
Seleccionando la ficha Compilar, adems de las tpicas opciones de Option Strict,
Option Explicit y Option Compare, (estas asignaciones solo sern efectivas para el
proyecto actual), tendremos cmo queremos que reaccione el compilador si se cumple
algunas de las condiciones indicadas. Entre esas condiciones, tenemos algo que
muchos desarrolladores de Visual Basic siempre hemos querido tener: Que nos avise
cuando una variable la hemos declarado pero no la utilizamos (Variable local no
utilizada). Al tener marcada esta opcin (normalmente como una Advertencia), si
hemos declarado una variable y no la usamos en el cdigo, (siempre que no le
hayamos asignado un valor al declararla), nos avisar, tal como podemos ver en la
Figura 2.6:


Figura 2.6. Aviso de variable no usada


Ver video 1 de esta leccin (Declarar variables)
Ver video 2 de esta leccin (Definir constantes)










www.detodoprogramacion.com


Enumeraciones: Constantes agrupadas
Una enumeracin es un grupo de constantes que estn relacionadas entre s y que
queremos utilizar para restringir el rango de posibles valores para una variable o
parmetro.
En Visual Basic 2005 las enumeraciones pueden ser de cualquier tipo numrico
entero, incluso enteros sin signo, aunque el valor predefinido es el tipo Integer.
Podemos declarar una enumeracin de varias formas:
1- Simplemente indicando el nombre de la enumeracin y el de sus valores:
Enum Colores
Rojo
Verde
Azul
End Enum
En este primer caso, el tipo de datos de cada miembro de la enumeracin ser
Integer.
2- Indicando el tipo de datos que realmente se utilizar:
Enum Colores As Long
www.detodoprogramacion.com
Rojo
Verde
Azul
End Enum
En este segundo caso, el valor mximo que podemos asignar a los miembros de una
enumeracin ser el que pueda contener un tipo de datos Long.
3- Indicando el atributo FlagsAttibute, (realmente no hace falta indicar el sufijo
Attribute cuando usamos los atributos) de esta forma podremos indicar unos valores
concretos para los miembros de la enumeracin. Se usa tambin para indicar valores
que se pueden "sumar" o complementar entre s, pero sin perder el nombre, en breve
veremos qu significa esto de "no perder el nombre".
<Flags()> _
Enum Colores As Byte
Rojo = 1
Verde = 2
Azul = 4
End Enum

Nota:
Los atributos los veremos con ms detalle en otra leccin de este mismo
mdulo.

El nombre de los miembros de las enumeraciones
Tanto si indicamos o no el atributo Flags a una enumeracin, la podemos usar de esta
forma:
Dim c As Colores = Colores.Azul Or Colores.Rojo
Es decir, podemos "sumar" los valores definidos en la enumeracin.
Como hemos comentado, las enumeraciones son constantes con nombres, pero esta
definicin se queda algo corta. De hecho, podemos saber "el nombre" de un valor de
una enumeracin, para ello tendremos que usar el mtodo ToString, (el cual se usa
www.detodoprogramacion.com
para convertir en una cadena cualquier valor numrico).
Por ejemplo, si tenemos la siguiente asignacin:
Dim s As String = Colores.Azul.ToString
La variable s contendr la palabra "Azul" no el valor 4.
Esto es aplicable a cualquier tipo de enumeracin, se haya o no usado el atributo
FlagsAttribute.
Una vez aclarado este comportamiento de las enumeraciones en Visual Basic 2005,
veamos que es lo que ocurre cuando sumamos valores de enumeraciones a las que
hemos aplicado el atributo Flags y a las que no se lo hemos aplicado. Empecemos por
este ltimo caso.
Si tenemos este cdigo:
Enum Colores As Byte
Rojo = 1
Verde = 2
Azul = 4
End Enum

Dim c As Colores = Colores.Azul Or Colores.Rojo

Dim s As String = c.ToString
El contenido de la variable s ser "5", es decir, la representacin numrica del valor
contenido: 4 + 1, ya que el valor de la constante Azul es 4 y el de la constante Rojo
es 1.
Pero si ese mismo cdigo lo usamos de esta forma (aplicando el atributo Flags a la
enumeracin):
<Flags()> _
Enum Colores As Byte
Rojo = 1
Verde = 2
Azul = 4
www.detodoprogramacion.com
End Enum

Dim c As Colores = Colores.Azul Or Colores.Rojo

Dim s As String = c.ToString
El contenido de la variable s ser: "Rojo, Azul", es decir, se asignan los nombres de
los miembros de la enumeracin que intervienen en ese valor, no el valor "interno".
Los valores de una enumeracin no son simples nmeros
Los miembros de las enumeraciones realmente son valores de un tipo de datos entero
(en cualquiera de sus variedades) tal como podemos comprobar en la Figura 2.7:


Figura 2.7. Los tipos subyacentes posibles de una enumeracin

Por tanto cabe pensar que podemos usar cualquier valor para asignar a una variable
declarada como una enumeracin, al menos si ese valor est dentro del rango
adecuado. Es decir, en el ejemplo de la figura usar un 1 en lugar de Colores.Rojo.
En Visual Basic 2005 esto no es posible, al menos si lo hacemos de forma "directa" y
con Option Strict conectado, ya que recibiremos un error indicndonos que no
podemos convertir, por ejemplo, un valor entero en un valor del tipo de la
enumeracin. En la Figura 2.8 podemos ver ese error al intentar asignar el valor 3 a
una variable del tipo Colores (definida con el tipo predeterminado Integer).
www.detodoprogramacion.com

Figura 2.8. Error al asignar un valor "normal" a una variable del tipo Colores
El error nos indica que no podemos realizar esa asignacin, pero el entorno integrado
de Visual Studio 2005 tambin nos ofrece alternativas para que ese error no se
produzca, esa ayuda se obtiene presionando el signo de admiracin que tenemos
justo donde est el cursor del mouse, pero no solo nos dice cmo corregirlo, sino que
tambin nos da la posibilidad de que el propio IDE se encargue de hacerlo, tal como
podemos apreciar en la Figura 2.9.


Figura 2.9. Opciones de correccin de errores
Lo nico que tendramos que hacer es presionar la sugerencia de correccin, que en
este caso es la nica que hay, pero en otros casos pueden ser varias las opciones y
tendramos que elegir la que creamos adecuada.
El cdigo final (una vez corregido) quedara de la siguiente forma:
Dim c As Colores = CType(3, Colores)
CType es una de las formas que nos ofrece Visual Basic 2005 de hacer conversiones
entre diferentes tipos de datos, en este caso convertimos un valor entero en uno del
tipo enumerado Colores.
Si compilamos y ejecutamos la aplicacin, sta funcionar correctamente.
Es posible que usando CType no asignemos un valor dentro del rango permitido. En
este caso, el valor 3 podramos darlo por bueno, ya que es la suma de 1 y 2 (Rojo y
www.detodoprogramacion.com
Verde), pero qu pasara si el valor asignado es, por ejemplo, 15? En teora no
deberamos permitirlo.
Estas validaciones podemos hacerlas de dos formas:
1- Con la clsica solucin de comprobar el valor indicado con todos los valores
posibles.
2- Usando funciones especficas del tipo Enum. Aunque en este ltimo caso, solo
podremos comprobar los valores definidos en la enumeracin.
En el siguiente ejemplo podemos hacer esa comprobacin.
Sub mostrarColor(ByVal c As Colores)
' comprobar si el valor indicado es correcto
' si no est definido, usar el valor Azul
If [Enum].IsDefined(GetType(Colores), c) = False Then
c = Colores.Azul
End If
Console.WriteLine("El color es {0}", c)
End Sub
Este cdigo lo que hace es comprobar si el tipo de datos Colores tiene definido el
valor contenido en la variable c, en caso de que no sea as, usamos un valor
predeterminado.
Nota:
La funcin IsDefined slo comprueba los valores que se han definido en
la enumeracin, no las posibles combinaciones que podemos conseguir
sumando cada uno de sus miembros, incluso aunque hayamos usado el
atributo FlagsAttribute.

Ver video 1 de esta leccin (Enumeraciones 1)
Ver video 2 de esta leccin (Enumeraciones 2)
Ver video 3 de esta leccin (Enumeraciones 3)
Ver video 4 de esta leccin (Enumeraciones 4)





www.detodoprogramacion.com


Arrays (matrices)
Los arrays (o matrices) tambin es algo que podamos usar en VBScript/VB6, si bien
la forma en que se almacena en la memoria y la forma en que podemos usarlas en
Visual Basic 2005 ha cambiado.
En Visual Basic 2005 la declaracin de un array la haremos de la misma forma que en
VBScript/VB6, en el siguiente ejemplo declaramos un array de tipo String llamado
nombres:
Dim nombres() As String
Al igual que en VBScript/VB6, podemos indicar el nmero de elementos que
contendr el array:
Dim nombres(10) As String
Tal como ocurre en VBScript/VB6, al realizar esta declaracin lo que conseguimos es
definir un array de 11 elementos: desde cero hasta 10. Si bien, en VB6 tenemos la
posibilidad de indicar cual es el valor del ndice inferior predeterminado de los arrays,
podemos elegir entre cero y uno mediante la instruccin Option Base indicando a
continuacin un 0 o un 1. En Visual Basic 2005 no existe esa instruccin. Es ms en
Visual Basic 2005 todos los arrays deben tener como ndice inferior el valor cero.
Otra posibilidad que tenamos en VBScript/VB6 era indicar el rango de ndices que
podamos asignar, esto lo logrbamos usando la clusula To al definir un array, por
ejemplo:
www.detodoprogramacion.com
Dim nombres(10 To 25) As String
Pero esta declaracin es ilegal en Visual Basic 2005, por el hecho de que los arrays
de .NET siempre deben tener el valor cero como ndice inferior.
Lo que si podemos hacer en Visual Basic 2005 es usar To para indicar el valor mximo
del ndice, aunque no tiene la misma "potencia" que en VBScript/VB6, al menos de
esta forma el cdigo resultar ms legible:
Dim nombres(0 To 10) As String

Declarar e inicializar un array
Lo que no podemos hacer en VBScript/VB6 era declarar un array y al mismo tiempo
asignarle valores.
En Visual Basic 2005 esto lo hacemos indicando los valores a asignar justo despus de
la declaracin y encerrndolos entre llaves:
Dim nombres() As String = {"Pepe", "Juan", "Luisa"}
Con el cdigo anterior estamos creando un array de tipo String con tres valores cuyos
ndices van de cero a dos.
Si el array es bidimensional (o con ms dimensiones), tambin podemos inicializarlos
al declararlo, pero en este caso debemos usar doble juego de llaves:
Dim nombres(,) As String = {{"Juan", "Pepe"}, {"Ana", "Eva"}}
En este cdigo tendramos un array bidimensional con los siguientes valores:
nombres(0,0)= Juan
nombres(0,1)= Pepe
nombres(1,0)= Ana
nombres(1,1)= Eva
Cambiar el tamao de un array
Para cambiar el tamao de un array, al igual que en VBScript/VB6, usaremos la
instruccin ReDim, pero a diferencia de VBScript/VB6 no podemos usar ReDim para
definir un array, en Visual Basic 2005 siempre hay que declarar previamente los
arrays antes de cambiarles el tamao.
Lo que tambin podemos hacer en Visual Basic 2005 es cambiar el tamao de un
array y mantener los valores que tuviera anteriormente, para lograrlo debemos usar
ReDim Preserve.
www.detodoprogramacion.com
Si bien tanto ReDim como ReDim Preserve se pueden usar en arrays de cualquier
nmero de dimensiones, en los arrays de ms de una dimensin solamente podemos
cambiar el tamao de la ltima dimensin.
Eliminar el contenido de un array
Una vez que hemos declarado un array y le hemos asignado valores, es posible que
nos interese eliminar esos valores de la memoria, para lograrlo, podemos hacerlo de
tres formas:
1. Redimensionando el array indicando que tiene cero elementos, aunque en el
mejor de los casos, si no estamos trabajando con arrays de ms de una
dimensin, tendramos un array de un elemento, ya que, como hemos
comentado anteriormente, los arrays de .NET el ndice inferior es cero.
2. Usar la instruccin Erase. Al igual que en VBScript/VB6, Erase elimina
totalmente el array de la memoria.
3. Asignar un valor Nothing al array. Esto funciona en Visual Basic 2005 pero no
en VBScript/VB6, debido a que en Visual Basic 2005 los arrays son tipos por
referencia
Los arrays son tipos por referencia
Como acabamos de ver, en Visual Basic 2005 los arrays son tipos por referencia, y tal
como comentamos anteriormente, los tipos por referencia realmente lo que contienen
son una referencia a los datos reales no los datos propiamente dichos.
Cual es el problema?
Vemoslo con un ejemplo y as lo tendremos ms claro.
Dim nombres() As String = {"Juan", "Pepe", "Ana", "Eva"}

Dim otros() As String

otros = nombres

nombres(0) = "Antonio"
En este ejemplo definimos el array nombres y le asignamos cuatro valores. A
continuacin definimos otro array llamado otros y le asignamos lo que tiene
nombres. Por ltimo asignamos un nuevo valor al elemento cero del array nombres.
Si mostramos el contenido de ambos arrays nos daremos cuenta de que realmente
solo existe una copia de los datos en la memoria, y tanto nombres(0) como
otros(0) contienen el nombre "Antonio". En VBScript/VB6 cada array era
independiente del otro y esa asignacin a nombres(0) no afectaba al valor contenido
en otros(0).
www.detodoprogramacion.com
Qu ha ocurrido?
Que debido a que los arrays son tipos por referencia, solamente existe una copia de
los datos y tanto la variable nombres como la variable otros lo que contienen es una
referencia (o puntero) a los datos.
Si realmente queremos tener copias independientes, debemos hacer una copia del
array nombres en el array otros, esto es fcil de hacer si usamos el mtodo CopyTo.
ste mtodo existe en todos los arrays y nos permite copiar un array en otro
empezando por el ndice que indiquemos. El nico requisito es que el array de
destino debe estar inicializado y tener espacio suficiente para contener los elementos
que queremos copiar.
En el siguiente cdigo de ejemplo hacemos una copia del contenido del array
nombres en el array otros, de esta forma, el cambio realizado en el elemento cero
de nombres no afecta al del array otros.
Dim nombres() As String = {"Juan", "Pepe", "Ana", "Eva"}

Dim otros() As String

ReDim otros(nombres.Length)

nombres.CopyTo(otros, 0)

nombres(0) = "Antonio"

Adems del mtodo CopyTo, los arrays tienen otros miembros que nos pueden ser de
utilidad, como por ejemplo la propiedad Length usada en el ejemplo para saber
cuantos elementos tiene el array nombres.
Para averiguar el nmero de elementos de un array, tambin podemos usar la funcin
UBound, que es la que nos serva en VBScript/VB6 para saber esa informacin.
Sin embargo, el uso de la funcin LBound, (que sirve para averiguar el ndice inferior
de un array), no tiene ningn sentido en Visual Basic 2005, ya que todos los arrays
siempre tienen un valor cero como ndice inferior.
Para finalizar este tema, solo nos queda por decir, que los arrays de Visual Basic 2005
realmente son tipos de datos derivados de la clase Array y por tanto disponen de
todos los miembros definidos en esa clase, aunque de esto hablaremos en la prxima
leccin, en la que tambin tendremos la oportunidad de profundizar un poco ms en
los tipos por referencia y en como podemos definir nuestros propios tipos de datos,
tanto por referencia como por valor.
www.detodoprogramacion.com


Ver video 1 de esta leccin (Agregar proyectos a una solucin, Arrays)
Ver video 2 de esta leccin (Arrays 2)
Ver video 3 de esta leccin (Arrays 3)






































www.detodoprogramacion.com


Introduccin
En la leccin anterior vimos los tipos de datos predefinidos en .NET Framework, en
esta leccin veremos cmo podemos crear nuestros propios tipos de datos, tanto por
valor como por referencia.
Tambin tendremos ocasin de ver los distintos niveles de accesibilidad que podemos
aplicar a los tipos, as como a los distintos miembros de esos tipos de datos. De los
distintos miembros que podemos definir en nuestros tipos, nos centraremos en las
propiedades para ver en detalle los cambios que han sufrido con respecto a las clases
de VBScript/VB6. Tambin veremos temas relacionados con la programacin
orientada a objetos (POO) en general y de forma particular los que ataen a las
interfaces.
Clases y estructuras
Clases: Tipos por referencia definidos por el usuario
o Las clases: El corazn de .NET Framework
La herencia: Caracterstica principal de la Programacin Orientada
a Objetos
Encapsulacin y Polimorfismo: Dos viejos conocidos de VB
Object: La clase base de todas las clases de .NET
o Definir una clase
Una clase especial: Module
Los miembros de una clase
Caractersticas de los mtodos y propiedades
Accesibilidad, mbito y miembros compartidos
Parmetros y parmetros opcionales
www.detodoprogramacion.com
Array de parmetros opcionales (ParamArray)
Sobrecarga de mtodos y propiedades
Parmetros por valor y parmetros por referencia
o Instanciar: Crear un objeto en la memoria
Declarar y asignar en un solo paso
El constructor: El punto de inicio de una clase
Constructores parametrizados
Cuando Visual Basic 2005 no crea un constructor
automticamente
El destructor: El punto final de la vida de una clase
Estructuras: Tipos por valor definidos por el usuario
o Definir una estructura
o Constructores de las estructuras
o Destructores de las estructuras
o Los miembros de una estructura
o Cmo usar las estructuras
Accesibilidad y mbito
o mbito
mbito de bloque
mbito de procedimiento
mbito de mdulo
mbito de espacio de nombres
o La palabra clave Global
o Accesibilidad
Accesibilidad de las variables en los procedimientos
o Las accesibilidades predeterminadas
o Anidado de tipos
Los tipos anidables
El nombre completo de un tipo
Importacin de espacios de nombres
Alias de espacios de nombres
Propiedades
o Definir una propiedad
o Propiedades de solo lectura
o Propiedades de solo escritura
o Diferente accesibilidad para los bloques Get y Set
o Propiedades predeterminadas
Sobrecarga de propiedades predeterminadas
Interfaces
o Qu es una interfaz?
o Qu contiene una interfaz?
o Una interfaz es un contrato
o Las interfaces y el polimorfismo
o Usar una interfaz en una clase
o Acceder a los miembros implementados
o Saber si un objeto implementa una interfaz
o Implementacin de mltiples interfaces
o Mltiple implementacin de un mismo miembro
www.detodoprogramacion.com
o Dnde podemos implementar las interfaces?
o Un ejemplo prctico usando una interfaz de .NET









































www.detodoprogramacion.com


Clases: Tipos por referencia definidos por el usuario
Tal como vimos en la leccin anterior, los tipos de datos se dividen en dos grupos:
tipos por valor y tipos por referencia. Los tipos por referencia realmente son clases,
de la cuales debemos crear una instancia para poder usarlas. Esa instancia o copia, se
crea siempre en la memoria lejana (heap) y las variables lo nico que contienen es
una referencia a la direccin de memoria en la que el CLR (Common Language
Runtime, motor en tiempo de ejecucin de .NET), ha almacenado el objeto recin
creado.
Al igual que ocurre en VBScript/VB6, tambin podemos crear nuestras propias clases
en Visual Basic 2005, aunque como veremos tanto la forma de definirlas como de
instanciarlas ha cambiado un poco. Aunque ese cambio es solo, digamos, en la forma,
ya que en el fondo es lo mismo, siempre salvando las distancias, ya que como
veremos, las clases de Visual Basic 2005 pueden llegar a ser mucho ms verstiles y
potentes que las de VBScript/VB6.
Antes de entrar en detalles sintcticos, veamos la importancia que tienen las clases
en .NET Framework y como repercuten en las que podamos definir nosotros usando
Visual Basic 2005.
Las clases: el corazn de .NET Framework
Prcticamente todo lo que podemos hacer en .NET Framework lo hacemos mediante
clases. La librera de clases de .NET Framework es precisamente el corazn del propio
.NET, en esa librera de clases est todo lo que podemos hacer dentro de este marco
de programacin; para prcticamente cualquier tarea que queramos realizar existen
clases, y si no existen, las podemos definir nosotros mismos, bien ampliando la
funcionalidad de alguna clase existente mediante la herencia, bien implementando
www.detodoprogramacion.com
algn tipo de funcionalidad previamente definida o simplemente crendolas desde
cero.
La herencia: Caracterstica principal de la Programacin Orientada a Objetos
El concepto de Programacin Orientada a Objetos (POO) es algo intrnsico al propio
.NET Framework, por tanto es una caracterstica que todos los lenguajes basados en
este "marco de trabajo" tienen de forma predeterminada, entre ellos el Visual Basic
2005. De las caractersticas principales de la POO tenemos que destacar la herencia,
que en breve podemos definir como una caracterstica que nos permite ampliar la
funcionalidad de una clase existente sin perder la que ya tuviera previamente. Gracias
a la herencia, podemos crear una nueva clase que se derive de otra. Esta nueva clase
puede cambiar el comportamiento de la clase base (de la cual hereda) y/o ampliarlo,
de esta forma podemos adaptar la clase original a nuestras necesidades.
El tipo de herencia que .NET Framework soporta es la herencia simple, es decir, solo
podemos usar una clase como base de la nueva, si bien, como veremos ms adelante,
podemos agregar mltiples interfaces. La herencia nos permitir aprovechar la
funcionalidad de muchas de las clases existentes en la plataforma .NET.
Encapsulacin y Polimorfismo: Dos viejos conocidos de VB
La encapsulacin y el polimorfismo son otras dos caractersticas de la programacin
orientada a objetos. Aunque estas dos no nos resultarn desconocidas, ya que desde
la versin 5.0 de Visual Basic y VBScript estaban a nuestra disposicin.
La encapsulacin nos permite abstraer la forma que tiene de actuar una clase sobre
los datos que contiene o manipula, para poder lograrlo se exponen como parte de la
clase los mtodos y propiedades necesarios para que podamos manejar esos datos
sin tener que preocuparnos cmo se realiza dicha manipulacin.
El polimorfismo es una caracterstica que nos permite realizar ciertas acciones o
acceder a la informacin de los datos contenidos en una clase de forma semi-
annima, al menos en el sentido de que no tenemos porqu saber sobre que tipo
objeto realizamos la accin, ya que lo nico que nos debe preocupar es que podemos
hacerlo, por la sencilla razn de que estamos usando ciertos mecanismos que siguen
unas normas que estn adoptadas por la clase.
El ejemplo clsico del polimorfismo es que si tengo un objeto que "sabe" cmo
morder, da igual que lo aplique a un ratn o a un dinosaurio, siempre y cuando esas
dos "clases" expongan un mtodo que pueda realizar esa accin... y como deca la
documentacin de Visual Basic 5.0, siempre ser preferible que nos muerda un ratn
antes que un dinosaurio.
Object: La clase base de todas las clases de .NET
Todas las clases de .NET se derivan siempre de forma automtica de la clase Object,
lo indiquemos o no explcitamente. Cualquier clase que definamos tendr el
comportamiento heredado de esa clase. El uso de la clase Object como base del resto
de las clases de .NET es la nica excepcin a la herencia simple soportada por .NET.
www.detodoprogramacion.com
Esta caracterstica nos asegura que siempre podremos usar un objeto del tipo Object
para acceder a cualquier clase de .NET, de manera similar a como un variant serva
en VBScript/VB6 para tratar cualquier tipo de objeto.
De los miembros que tiene la clase Object debemos resaltar el mtodo ToString, el
cual ya lo vimos en la leccin anterior cuando queramos convertir un tipo primitivo en
una cadena. Este mtodo est pensado para devolver una representacin en formato
cadena de un objeto. El valor que obtengamos al usar este mtodo depender de
cmo est definido en cada clase y por defecto lo que devuelve es el nombre
completo de la clase. En la mayora de los casos, sin embargo, el valor obtenido al
usar este mtodo debera ser ms intuitivo: por ejemplo los tipos de datos primitivos
tienen definido este mtodo para devuelva el valor que contienen. De igual forma,
nuestras clases tambin deberan devolver un valor adecuado al contenido
almacenado. De cmo hacerlo, nos ocuparemos en breve.
Nota:
Todos los tipos de datos de .NET, ya sean por valor o por referencia
siempre estn derivados de la clase Object, por tanto podremos llamar a
cualquiera de los mtodos que estn definidos en esa clase.
Aunque en el caso de los tipos de datos por valor, cuando queremos
acceder a la clase Object que contienen, .NET Framework primero debe
convertirla en un objeto por referencia (operacin denominada boxing) y
cuando hemos dejado de usarla y queremos volver a asignar el dato a la
variable por valor, tiene que volver a hacer la conversin inversa
(unboxing).

Ver video de esta leccin (Clases 1)


















www.detodoprogramacion.com


Definir una clase
En Visual Basic 6.0, cada vez que definimos una clase tenemos que agregar al
proyecto un fichero con extensin .cls, y a partir de ese momento, todo el cdigo
escrito en ese fichero formaba parte de la clase. En VBScript (tanto en ASP como en
otros entornos) y en Visual Basic 2005 esto se hace mediante el uso de la palabra
clave Class. Aunque lo habitual es que usemos un fichero independiente para cada
clase que escribamos, esto solo es algo opcional, porque en VB2005 solo existe un
tipo de fichero para escribir el cdigo: un fichero con extensin .vb, en el que
podemos escribir una clase o cualquiera de los tipos que el lenguaje nos permite.
Nota:
En Visual Basic 2005 cualquier cdigo que queramos escribir estar
dentro de una clase.
En Visual Basic 2005 las clases se definen usando la palabra clave Class seguida del
nombre de la clase, esa definicin acaba indicndolo con End Class, exactamente igual
que en VBScript.
En el siguiente ejemplo definimos una clase llamada Cliente que tiene dos campos
pblicos.
Class Cliente
Public Nombre As String
Public Apellidos As String
End Class
www.detodoprogramacion.com
Una vez definida la clase podemos agregar los elementos (o miembros) que creamos
conveniente. En el ejemplo, para simplificar, hemos agregado dos campos pblicos,
aunque tambin podramos haber definido cualquiera de los miembros permitidos en
las clases.
Una clase especial: Module
En Visual Basic 2005 tambin podemos definir una clase especial llamada Module.
Este tipo de clase tiene un tratamiento especial y es el equivalente a los mdulos BAS
de VB6. La definicin se hace usando la instruccin Module seguida del nombre a usar
y acaba con End Module.
Cualquier miembro definido en un Module siempre estar accesible en todo el
proyecto y para usarlos no tendremos que crear ningn objeto en memoria. Las
clases definidas con la palabra clave Module realmente equivalen a las clases en las
que todos los miembros estn compartidos y por tanto siempre disponibles a toda la
aplicacin.
De todos estos conceptos nos ocuparemos en las siguientes lecciones, pero es
necesario explicar que existe este tipo de clase ya que ser el tipo de datos que el IDE
de Visual Basic 2005 usar al crear aplicaciones del tipo consola, que ser el tipo de
proyecto que crearemos para practicar con el cdigo mostrado en este primer
mdulo.
Los miembros de una clase
Una clase puede contener cualquiera de estos elementos (miembros):
Enumeraciones
Campos
Mtodos (funciones o procedimientos)
Propiedades
Eventos
Las enumeraciones, como vimos en la leccin anterior, podemos usarlas para
definir valores constantes relacionados, por ejemplo para indicar los valores posibles
de cualquier "caracterstica" de la clase.
Los campos son variables usadas para mantener los datos que la clase manipular.
Los mtodos son las acciones que la clase puede realizar, normalmente esas
acciones sern sobre los datos que contiene. Dependiendo de que el mtodo devuelva
o no un valor, podemos usar mtodos de tipo Function o de tipo Sub respectivamente.
Las propiedades son las "caractersticas" de las clases y la forma de acceder
"pblicamente" a los datos que contiene. Por ejemplo, podemos considerar que el
nombre y los apellidos de un cliente son dos caractersticas del cliente. Normalmente
encapsulan el acceso a miembros privados de la clase.
Los eventos son mensajes que la clase puede enviar para informar que algo est
ocurriendo en la clase.
www.detodoprogramacion.com
Caractersticas de los mtodos y propiedades
Accesibilidad, mbito y miembros compartidos
Aunque estos temas los veremos en breve con ms detalle, para poder comprender
mejor las caractersticas de los miembros de una clase o tipo, daremos un pequeo
adelanto sobre estas caractersticas que podemos aplicar a los elementos que
definamos.
Accesibilidad y mbito son dos conceptos que estn estrechamente relacionados.
Aunque en la prctica tienen el mismo significado, ya que lo que representan es la
"cobertura" o alcance que tienen los miembros de las clases e incluso de las mismas
clases que definamos.
Si bien cada uno de ellos tienen su propia "semntica", tal como podemos ver a
continuacin:
mbito
Es el alcance que la definicin de un miembro o tipo puede tener. Es decir, cmo
podemos acceder a ese elemento y desde dnde podemos accederlo.
El mbito de un elemento de cdigo est restringido por el "sitio" en el que lo hemos
declarado. Estos sitios pueden ser:
mbito de bloque: Disponible nicamente en el bloque de cdigo en el que se
ha declarado.
mbito de procedimiento: Disponible nicamente dentro del procedimiento
en el que se ha declarado.
mbito de mdulo: Disponible en todo el cdigo del mdulo, la clase o la
estructura donde se ha declarado.
mbito de espacio de nombres: Disponible en todo el cdigo del espacio de
nombres.
Accesibilidad
A los distintos elementos de nuestro cdigo (ya sean clases o miembros de las clases)
podemos darle diferentes tipos de accesibilidad. Estos tipos de "acceso" dependern
del mbito que queramos que tengan, es decir, desde dnde podremos accederlos.
Los modificadores de accesibilidad son:
Public: Acceso no restringido.
Protected: Acceso limitado a la clase contenedora o a los tipos derivados de
esta clase.
Friend: Acceso limitado al proyecto actual.
Protected Friend: Acceso limitado al proyecto actual o a los tipos derivados de
la clase contenedora.
Private: Acceso limitado al tipo contenedor.
www.detodoprogramacion.com
Por ejemplo, podemos declarar miembros privados a una clase, en ese caso, dichos
miembros solamente los podremos acceder desde la propia clase, pero no desde fuera
de ella.
Nota:
Al igual que ocurre en VBScript/VB6, al declarar una variable con Dim,
por regla general, el mbito que le estamos aplicando es privado, pero
como veremos, en Visual Basic 2005, dependiendo del tipo en el que
declaremos esa variable, el mbito puede ser diferente a privado.

Miembros compartidos
Por otro lado, los miembros compartidos de una clase o tipo, son elementos que no
pertenecen a una instancia o copia en memoria particular, sino que pertenecen al
propio tipo y por tanto siempre estn accesibles o disponibles, dentro del nivel del
mbito y accesibilidad que les hayamos aplicado, y su tiempo de vida es el mismo que
el de la aplicacin.
Nota:
Lo ms parecido en VB6 a los miembros compartidos de Visual Basic
2005 son los mtodos y campos declarados en un mdulo .BAS.
Del mbito, la accesibilidad y los miembros compartidos nos ocuparemos con ms
detalle en una leccin posterior, donde veremos ciertas peculiaridades, como puede
ser la limitacin del mbito de un miembro que aparentemente tiene una accesibilidad
no restringida.

Parmetros y parmetros opcionales
En Visual Basic 2005, tanto los miembros de una clase, (funciones y mtodos Sub),
como las propiedades pueden recibir parmetros. Esto no es algo nuevo, ya que en
VB6 podamos tener parmetros en estos tipos de miembros (o elementos) de una
clase, adems se siguen soportando tanto los parmetros opcionales (Optional) como
los arrays de parmetros (ParamArray). Con los parmetros opcionales lo que
conseguimos es permitir que el usuario no tenga que introducir todos los parmetros,
sino solo los que realmente necesite, del resto, (los no especificados), se usar el
valor predeterminado que hayamos indicado, ya que una de las "restricciones" de este
tipo de parmetros con respecto a VBScript/VB6 es que siempre que indiquemos un
parmetro opcional, debemos indicar tambin el valor por defecto que debemos usar
en caso de que no se especifique. Esto realmente sigue funcionando igual que en VB6
cuando al parmetro opcional le indicamos el tipo de datos. Lo que Visual Basic 2005
no permite es definir un parmetro opcional de tipo Variant, entre otras cosas, porque
ese tipo de datos no existe en VB2005.
Veamos unos ejemplo para aclarar nuestras ideas:
www.detodoprogramacion.com
Function Suma(n1 As Integer, Optional n2 As Integer = 15) As Integer
Suma = n1 + n2
End Function
En este primer ejemplo, el primer parmetro es obligatorio (siempre debemos
indicarlo) y el segundo es opcional, si no se indica al llamar a esta funcin, se usar el
valor 15 que es el predeterminado.
Para llamar a esta funcin, lo podemos hacer de estas tres formas:
' 1- indicando los dos parmetros (el resultado ser 4= 1 + 3)
t = Suma(1, 3)
' 2- Indicando solamente el primer parmetro (el resultado ser 16=
1 + 15)
t = Suma(1)
' 3- Indicando los dos parmetros, pero en el opcional usamos el
nombre
t = Suma(1, n2:= 9)
El tercer ejemplo solamente tiene utilidad si hay ms de un parmetro opcional.
Nota:
Los parmetros opcionales deben aparecer en la lista de parmetros del
mtodo, despus de los "obligatorios"

Array de parmetros opcionales (ParamArray)
En cuanto al uso de ParamArray, este tipo de parmetro opcional nos permite indicar
un nmero indeterminado de parmetros, aunque el funcionamiento con respecto a
VBScript/VB6 es algo diferente, en Visual Basic 2005 siempre debe ser una array de
un tipo especfico e internamente se trata como un array normal y corriente, es decir,
dentro del mtodo o propiedad se accede a l como si de un array se tratara... entre
otras cosas, porque es un array!
En VB6 no siempre era as y algunas veces tenamos verdaderos problemas al acceder
a esos datos, por suerte, en Visual Basic 2005 el uso de los parmetros opcionales
con ParamArray es ms simple e intuitivo, aunque a algunos puede que le parezca
menos "potente", ya que en VBScript/VB6, cualquiera de los parmetros poda ser a
su vez un array. Pero en Visual Basic 2005, al menos si tenemos activado Option
Strict, esto no es posible, ya que solo aceptar los parmetros del tipo indicado.
Veamos lo que VB6 permite y cmo hacerlo en VB2005:
www.detodoprogramacion.com
Function Suma(ParamArray n() As Variant) As Long
Dim total As Long
Dim i As Long
Dim j As Long
'
For i = 0 To UBound(n)
If IsArray(n(i)) Then
For j = LBound(n(i)) To UBound(n(i))
total = total + n(i)(j)
Next
Else
total = total + n(i)
End If
Next
Suma = total
End Function

' Para usarlo:
Dim t As Long
Dim a(2) As Long
a(0) = 1: a(1) = 2: a(2) = 3
t = Suma(a, 4, 5, 6)

MsgBox(t)

Para usar este cdigo en Visual Basic 2005 tendremos que desactivar Option Strict y
cambiar el tipo Variant por Object, (cosa que el IDE har automticamente si
pegamos el cdigo), lo dems se puede quedar igual, incluso los tipos de datos,
aunque debemos recordar que un Long de VBScript/VB6 es un Integer de VB2005.
www.detodoprogramacion.com
Pero como no debemos "acostumbrarnos" a desactivar Option Strict, vamos a ver el
cdigo "bueno" de Visual Basic 2005, aunque no nos permita usar un array en los
parmetros al llamar a la funcin.
Function Suma(ByVal ParamArray n() As Integer) As Integer
Dim total As Integer
For i As Integer = 0 To n.Length - 1
total += CInt(n(i))
Next
Return total
End Function

' Para usarlo:
Dim t As Integer = Suma(1, 2, 3, 4, 5, 6)
'
MsgBox(t)
Aqu vemos el nuevo modo de trabajar de Visual Basic 2005:
- Usamos Return para devolver el valor en lugar de usar el nombre de la funcin,
aunque se sigue soportando.
- Podemos inicializar la variable a usar con el bucle For, esto lo veremos con ms
detalle cuando tratemos la accesibilidad.
- Usamos propiedades para saber la cantidad de elementos del array.
- Comprobamos que en Visual Basic 2005 tenemos otra forma de incrementar el
contenido de una variable: t += CInt(n(i)) es lo mismo que t = t + CInt(n(i)),
que aunque parezca un snobismo, realmente ahorra algn ciclo de reloj y es ms
cmodo para programar. Ya lo hemos visto en uno de los vdeos del mdulo anterior.
Nota:
Cuando queramos usar ParamArray para recibir un array de parmetros
opcionales, esta instruccin debe ser la ltima de la lista de parmetros
de la funcin (mtodo).

Tampoco se permite tener parmetros opcionales y ParamArray en la
misma funcin.

www.detodoprogramacion.com
Sobrecarga de mtodos y propiedades
La sobrecarga de funciones (realmente de mtodos y propiedades), es una
caracterstica que nos permite tener una misma funcin con diferentes tipos de
parmetros, ya sea en nmero o en tipo.
Aunque nos pueda parecer que la sobrecarga de mtodos la podemos "simular" en
VB6 con los parmetros opcionales, realmente no es lo mismo. Ahora veremos el
porqu.
Supongamos que queremos tener dos funciones (o ms) que nos permitan hacer
operaciones con diferentes tipos de datos, y que, segn el tipo de datos usado, el
valor que devuelva sea de ese mismo tipo. En VB6 es imposible hacer esto. Salvo que
creemos dos funciones con nombres diferentes, pero en ese caso ya no estaremos
usando la sobrecarga.
En este ejemplo, tenemos dos funciones que se llaman igual pero una recibe valores
de tipo entero y la otra de tipo decimal:
Function Suma(n1 As Integer, n2 As Integer) As Integer
Return n1 + n2
End Function

Function Suma(n1 As Double, n2 As Double) As Double
Return n1 + n2
End Function
Como podemos comprobar las dos funciones tienen el mismo nombre, pero tanto una
como otra reciben parmetros de tipos diferentes.
Con Visual Basic 2005 podemos sobrecargar funciones, pero lo interesante no es que
podamos hacerlo, sino cmo podemos usar esas funciones. En el cdigo anterior
tenemos dos funciones llamadas Suma, la primera acepta dos parmetros de tipo
Integer y la segunda de tipo Double. Lo interesante es que cuando queramos usarlas,
no tenemos que preocuparnos de cual vamos a usar, ya que ser el compilador el que
decida la ms adecuada al cdigo que usemos, por ejemplo:
' En este caso, se usar la que recibe dos valores enteros
MsgBox( Suma(10, 22) )

' En este caso se usar la que recibe valores de tipo Double
MsgBox( Suma(10.5, 22)
www.detodoprogramacion.com
El compilador de Visual Basic 2005 es el que decide que funcin usar, esa decisin la
toma a partir de los tipos de parmetros que hayamos indicado. En el segundo
ejemplo de uso, el que mejor coincide es el de los dos parmetros de tipo Double.
Tambin podemos tener sobrecarga usando una cantidad diferente de parmetros,
aunque stos sean del mismo tipo. Por ejemplo, podemos aadir esta declaracin al
cdigo anterior sin que exista ningn tipo de error, ya que esta nueva funcin recibe
tres parmetros en lugar de dos:
Function Suma(n1 As Integer, n2 As Integer, n3 As Integer) As
Integer
Return n1 + n2 + n3
End Function
Por tanto, cuando el compilador se encuentre con una llamada a la funcin Suma en
la que se usen tres parmetros, intentar usar esta ltima.
Nota:
Para que exista sobrecarga, la diferencia debe estar en el nmero o en el
tipo de los parmetros, no en el tipo del valor devuelto.
Cuando, desde el IDE de Visual Studio 2005, queremos usar los mtodos
sobrecargados, nos mostrar una lista de opciones indicndonos las posibilidades de
sobrecarga que existen y entre las que podemos elegir, tal como vemos en la Figura
2.10:



Figura 2.10. Lista de parmetros soportados por un mtodo
Tal como comentbamos hace unas lneas, en VB6 se puede simular la sobrecarga
mediante los parmetros opcionales, aunque realmente no es lo mismo. Pero esa
"simulacin" nos viene como anillo al dedo para dar un consejo o advertencia:
Cuidado con las funciones que reciben parmetros opcionales, ya que el
compilador puede producir un error si esa funcin entra en conflicto con otra
"sobrecargada"!
Mejor lo vemos con un ejemplo:
Function Suma(n1 As Integer, Optional n2 As Integer = 33) As Integer
www.detodoprogramacion.com
Return n1 + n2
End Function
Si tenemos esta declaracin adems de las anteriores, el programa no compilar, ya
que si hacemos una llamada a la funcin Suma con dos parmetros enteros, el
compilador no sabr si usar esta ltima o la primera que declaramos, por tanto
producir un error.
Parmetros por valor y parmetros por referencia
Al igual que tenemos dos tipos de datos diferentes, en los parmetros de las
funciones tambin podemos tenerlos, esto tampoco es una novedad de Visual Basic
2005, ya que en VBScript/VB6 tambin podemos usar ByVal o ByRef para indicar al
compilador cmo debe tratar a los parmetros.
Cuando un parmetro es por valor (ByVal), el runtime antes de llamar a la funcin
hace una copia de ese parmetro y pasa la copia a la funcin, por tanto cualquier
cambio que hagamos a ese parmetro dentro de la funcin no afectar al valor usado
"externamente".
En el caso de que el parmetro sea por referencia (ByRef), el compilador pasa una
referencia que apunta a la direccin de memoria en la que estn los datos, por tanto
si realizamos cambios dentro de la funcin, ese cambio si que se ver reflejado en el
parmetro usado al llamar a la funcin.
Nota:
Hay que tener en cuenta que si pasamos un objeto a una funcin, da
igual que lo declaremos por valor o por referencia, ya que en ambos
casos se pasa una referencia a la direccin de memoria en la que estn
los datos, porque, como sabemos, las variables de los tipos por
referencia siempre contienen una referencia a los datos, no los datos en
s.
Hasta aqu todo como en VBScript/VB6.
Lo que cambia en Visual Basic 2005 es que ahora los parmetros en los que no se
indique si es por valor (ByVal) o por referencia (ByRef), sern tratados como
parmetros por valor. En VBScript/VB6 era al revs.
Nota:
Si usamos el IDE de Visual Studio para escribir el cdigo, no debemos
preocuparnos de este detalle, ya que si no indicamos si es por valor o
por referencia, automticamente le aadir la palabra clave ByVal, para
que no haya ningn tipo de dudas.

www.detodoprogramacion.com
Ver video 1 de esta leccin (Clases 2: Los miembros de las clases)
Ver video 2 de esta leccin (Clases 3: Las propiedades)
Ver video 3 de esta leccin (Clases 4: Accesibilidad)










































www.detodoprogramacion.com


Instanciar: Crear un objeto en la memoria
Una vez que tenemos una clase definida, lo nico de lo que disponemos es de una
especie de plantilla o molde a partir del cual podemos crear objetos en memoria.
La forma de crear esos objetos en Visual Basic 2005 no ha cambiado con respecto al
VBScript/VB6, salvo en pequeos detalles, veamos algunos ejemplos y as
aclararemos esas diferencias, que por otro lado son importantes.
Lo primero que tenemos que hacer es declarar una variable del tipo que queremos
instanciar, esto lo hacemos usando la instruccin Dim:
Dim c As Cliente
Con esta lnea de cdigo lo que estamos indicando al Visual Basic es que tenemos
intencin de usar una variable llamada c para acceder a una clase de tipo Cliente.
Esa variable, cuando llegue el momento de usarla, sabr todo lo que hay que saber
sobre una clase Cliente, pero hasta que no tenga una "referencia" a un objeto de ese
tipo no podremos usarla.
La asignacin de una referencia a un objeto Cliente podemos hacerla de dos formas
distintas:
La primera es creando un nuevo objeto en la memoria:
c = New Cliente

www.detodoprogramacion.com
Nota:
En VBScript/VB6 esta forma de crear un nuevo objeto producira un
error, ya que para "asignar" a una variable un nuevo objeto tenemos
que usar la instruccin Set, en Visual Basic 2005 ya no es necesario el
uso de esa instruccin, de hecho si la usamos, recibiremos un error.
A partir de este momento, la variable c tiene acceso a un nuevo objeto del tipo
Cliente, por tanto podremos usarla para asignarle valores y usar cualquiera de los
miembros que ese tipo de datos contenga:
c.Nombre = "Antonio"
c.Apellidos = "Ruiz Rodrguez"

Declarar y asignar en un solo paso
Con las clases o tipos por referencia tambin podemos declarar una variable y al
mismo tiempo asignarle un nuevo objeto, esto tampoco es una novedad, aunque s lo
es la forma de comportarse. Veamos primero cmo hacerlo y despus entraremos en
detalles.
Dim c As New Cliente
O tambin:
Dim c As Cliente = New Cliente
Las dos formas producen el mismo resultado, por tanto es recomendable usar la
primera.
En VBScript/VB6 este tipo de declaracin y asignacin no era recomendable, ya que
aade trabajo extra al compilador de VB. Ese trabajo extra consiste en comprobar si
el objeto al que queremos acceder ya est creado, en caso de que no sea as, primero
lo crea y despus lo usa, el inconveniente es que todas estas comprobaciones las
realiza cada vez que usemos la variable!
En Visual Basic 2005 este comportamiento ya no es as, el objeto se crea en la
memoria y se asigna a la variable, a partir de ese momento no se comprueba si ya
est creado o no, ya que se supone que s est creado.
Lo que debemos tener muy presente es que adems de la sobrecarga de trabajo que
aade VBScript/VB6 a este tipo de instanciacin, el comportamiento es muy diferente
al de Visual Basic 2005. Por ejemplo, si en VBScript/VB6 asignamos un valor nulo
(Nothing) a una variable declarada de esta forma y acto seguido usamos la variable,
el motor en tiempo de ejecucin (runtime) crea un nuevo objeto y asunto arreglado.
Pero en Visual Basic 2005, si asignamos un valor nulo a una variable, le estamos
diciendo al CLR (el runtime de .NET) que ya no queremos usar ms ese objeto, por
tanto lo elimina de la memoria; si despus queremos volver a usar la variable,
www.detodoprogramacion.com
debemos crear otro objeto, (con New), de no hacerlo, se producir un error, ya que
en Visual Basic 2005 no existe la auto-instanciacin.
El constructor: El punto de inicio de una clase
Cada vez que creamos un nuevo objeto en memoria estamos llamando al constructor
de la clase. En VBScript/VB6 el constructor es el mtodo Class_Initialize. Sin embargo
en Visual Basic 2005 el constructor es un mtodo de tipo Sub llamado New.
En el constructor de una clase podemos incluir el cdigo que creamos conveniente,
pero realmente solamente deberamos incluir el que realice algn tipo de
inicializacin, en caso de que no necesitemos realizar ningn tipo de inicializacin, no
es necesario definir el constructor, ya que el propio compilador lo har por nosotros.
Esto es as porque todas las clases deben implementar un constructor, por tanto si
nosotros no lo definimos, lo har el compilador de Visual Basic 2005.
Si nuestra clase Cliente tiene un campo para almacenar la fecha de creacin del
objeto podemos hacer algo como esto:
Class Cliente
Public Nombre As String
Public Apellidos As String
Public FechaCreacion As Date
'
Public Sub New()
FechaCreacion = Date.Now
End Sub
End Class

De esta forma podemos crear un nuevo Cliente y acto seguido comprobar el valor del
campo FechaCreacion para saber la fecha de creacin del objeto.
En los constructores tambin podemos hacer las inicializaciones que, por ejemplo
permitan a la clase a conectarse con una base de datos, abrir un fichero o cargar una
imagen grfica, etc., aunque en algunos de estos casos nos facilitar la tarea una
nueva caracterstica que VBScript/VB6 no tiene.
Constructores parametrizados
De la misma forma que podemos tener mtodos y propiedades sobrecargadas,
tambin podemos tener constructores sobrecargados, ya que debemos recordar que
www.detodoprogramacion.com
en Visual Basic 2005, un constructor realmente es un mtodo de tipo Sub, y como
todos los mtodos y propiedades de Visual Basic 2005, tambin admite la sobrecarga.
La ventaja de tener constructores que admitan parmetros es que podemos crear
nuevos objetos indicando algn parmetro, por ejemplo un fichero a abrir o, en el
caso de la clase Cliente, podemos indicar el nombre y apellidos del cliente o cualquier
otro dato que creamos conveniente.
Para comprobarlo, podemos ampliar la clase definida anteriormente para que tambin
acepte la creacin de nuevos objetos indicando el nombre y los apellidos del cliente.
Class Cliente
Public Nombre As String
Public Apellidos As String
Public FechaCreacion As Date
'
Public Sub New()
FechaCreacion = Date.Now
End Sub
'
Public Sub New(elNombre As String, losApellidos As String)
Nombre = elNombre
Apellidos = losApellidos
FechaCreacion = Date.Now
End Sub
End Class
Teniendo esta declaracin de la clase Cliente, podemos crear nuevos clientes de dos
formas:
Dim c1 As New Cliente

Dim c2 As New Cliente("Jose", "Snchez")
Como podemos comprobar, en ciertos casos es ms intuitiva la segunda forma de
crear objetos del tipo Cliente, adems de que as nos ahorramos de tener que
asignar individualmente los campos Nombre y Apellidos.
www.detodoprogramacion.com
Esta declaracin de la clase Cliente la podramos haber hecho de una forma diferente.
Por un lado tenemos un constructor por omisin (el que no recibe parmetros) en el
que asignamos la fecha de creacin y por otro el constructor que recibe los datos del
nombre y apellidos. En ese segundo constructor tambin asignamos la fecha de
creacin, ya que, se instancie como se instancie la clase, nos interesa saber siempre
la fecha de creacin. En este ejemplo, por su simpleza no es realmente un problema
repetir la asignacin de la fecha, pero si en lugar de una inicializacin necesitramos
hacer varias, la verdad es que nos encontraramos con mucha "duplicidad" de cdigo.
Por tanto, en lugar de asignar los datos en dos lugares diferentes, podemos hacer
esto otro:
Class Cliente
Public Nombre As String
Public Apellidos As String
Public FechaCreacion As Date
'
Public Sub New()
FechaCreacion = Date.Now
End Sub
'
Public Sub New(elNombre As String, losApellidos As String)
New()
Nombre = elNombre
Apellidos = losApellidos
End Sub
End Class
Es decir, desde el constructor con argumentos llamamos al constructor que no los
tiene, consiguiendo que tambin se asigne la fecha.
Esta declaracin de la clase Cliente realmente no compilar. Y no compila por la razn
tan "simple" de que aqu el compilador de Visual Basic 2005 no sabe cual es nuestra
intencin, ya que New es una palabra reservada que sirve para crear nuevos objetos
y, siempre, una instruccin tiene preferencia sobre el nombre de un mtodo, por
tanto, podemos recurrir al objeto especial Me el cual nos sirve, al igual que en
VBScript/VB6, para representar al objeto que actualmente est en la memoria, as
que, para que esa declaracin de la clase Cliente funcione, debemos usar Me.New()
para llamar al constructor sin parmetros.
www.detodoprogramacion.com
Nota:
El IDE de Visual Studio 2005 colorea las instrucciones y tipos propios del
lenguaje, tal y como lo hace el de VBScript/VB6, en el caso de Me,
VBScript/VB6 no la colorea, pero este no es el motivo de esta nota, lo
que no debe confundirnos es que cuando declaramos Sub New, tanto
Sub como New se muestran coloreadas, cuando solo se debera colorear
Sub; sin embargo cuando usamos Me.New, solo se colorea Me y no New
que es correcto, tal como vemos en la Figura 2.11, ya que en este caso
New es el nombre de un procedimiento y los procedimientos no son
parte de las instrucciones y tipos de .NET.



Figura 2.11. Coloreo errneo de New

Cuando Visual Basic 2005 no crea un constructor automticamente
Tal como hemos comentado, si nosotros no definimos un constructor (Sub New), lo
har el propio compilador de Visual Basic 2005, y cuando lo hace automticamente,
siempre es un constructor sin parmetros.
Pero hay ocasiones en las que nos puede interesar que no exista un constructor sin
parmetros, por ejemplo, podemos crear una clase Cliente que solo se pueda
instanciar si le pasamos, por ejemplo el nmero de identificacin fiscal, (NIF), en caso
de que no se indique ese dato, no podremos crear un nuevo objeto Cliente, de esta
forma, nos aseguramos siempre de que el NIF siempre est especificado.
Seguramente por ese motivo, si nosotros definimos un constructor con parmetros,
Visual Basic 2005 no crea uno automticamente sin parmetros. Por tanto, si
definimos un constructor con parmetros en una clase y queremos que tambin tenga
uno sin parmetros, lo tenemos que definir nosotros mismos.
El destructor: El punto final de la vida de una clase
De la misma forma que una clase tiene su punto de entrada o momento de
nacimiento en el constructor, tambin tienen un sitio que se ejecutar cuando el
objeto creado en la memoria ya no sea necesario, es decir, cuando acabe la vida del
objeto creado.
www.detodoprogramacion.com
El destructor de Visual Basic 2005 es un mtodo llamado Finalize, el cual se hereda de
la clase Object, por tanto no es necesario que escribamos nada en l. El propio CLR se
encargar de llamar a ese mtodo cuando el objeto ya no sea necesario. En
VBScript/VB6, el destructor es el mtodo Class_Terminate.
La principal diferencia con VBScript/VB6 en lo referente a la forma en que se
destruyen los objetos, es que en VBScript/VB6 si a un objeto le asignamos un valor
nulo (Nothing) el destructor se ejecuta inmediatamente y el objeto se elimina de la
memoria, pero en .NET la forma en que se destruyen los objetos es diferente. Nunca
podremos tener la certeza de cuando se destruye, incluso si le asignamos un valor
nulo. Esto es as debido a que en .NET los objetos no se destruyen inmediatamente y
existe un "sistema" que se encarga de realizar esta gestin de limpieza: El recolector
de basura o de objetos no usados (Garbage Collector, GC). Este recolector de
objetos no usados se encarga de comprobar constantemente cuando un objeto no se
est usando y es el que decide cuando hay que llamar al destructor.
Debido a esta caracterstica de .NET, si nuestra clase hace uso de recursos externos
que necesiten ser eliminados cuando la el objeto ya no se vaya a seguir usando,
debemos definir un mtodo que sea el encargado de realizar esa liberacin, pero ese
mtodo debemos llamarlo de forma manual, ya que, aunque en .NET existen formas
de hacer que esa llamada sea automtica, nunca tenderemos la seguridad de que se
llame en el momento oportuno, y esto es algo que, segn que casos, puede ser un
inconveniente.
Recomendacin:
Si nuestra clase utiliza recursos externos, por ejemplo un fichero o una
base de datos, debemos definir un mtodo que se encargue de liberarlos
y a ese mtodo debemos encargarnos de llamarlo cuando ya no lo
necesitemos.
Por definicin a este tipo de mtodos se les suele dar el nombre Close o
Dispose, aunque este ltimo tiene un significado especial y por
convencin solo debemos usarlo siguiendo las indicaciones de la
documentacin.

Ver video de esta leccin (Clases 5: Constructores)











www.detodoprogramacion.com



Estructuras: Tipos por valor definidos por el usuario
De la misma forma que podemos definir nuestros propios tipos de datos por
referencia, Visual Basic 2005 nos permite crear nuestros propios tipos por valor.
Para crear nuestros tipos de datos por referencia, usamos la "instruccin" Class, por
tanto es de esperar que tambin exista una instruccin para crear nuestros tipos por
valor, y esa instruccin es: Structure, por eso en Visual Basic 2005 a los tipos por
valor definidos por el usuario se denominan estructuras.
Nota:
El equivalente en VB6 a una estructura de Visual Basic 2005 es Type (se
le sola denominar tipo definido por el usuario o UDT) aunque es solo
eso: un parecido, pero realmente no es equivalente, al menos al 100%,
tal como tendremos oportunidad de comprobar en esta leccin.
Las estructuras pueden contener los mismos miembros que las clases, aunque
algunos de ellos se comporten de forma diferente o al menos tengan algunas
restricciones, como que los campos definidos en las estructuras no se pueden
inicializar al mismo tiempo que se declaran o no pueden contener constructores
"simples", ya que el propio compilador siempre se encarga de crearlo, para as poder
inicializar todos los campos definidos.
Otra de las caractersticas de las estructuras es que no es necesario crear una
instancia para poder usarlas, ya que es un tipo por valor y los tipos por valor no
necesitan ser instanciados para que existan.
www.detodoprogramacion.com
Definir una estructura
Las estructuras se definen usando la palabra Structure seguida del nombre y acaba
usando las instrucciones End Structure.
El siguiente cdigo define una estructura llamada Punto en la que tenemos dos
campos pblicos.
Structure Punto
Public X As Integer
Public Y As Integer
End Structure
Para usarla podemos hacer algo como esto:
Dim p As Punto
p.X = 100
p.Y = 75
Tambin podemos usar New al declarar el objeto:
Dim p As New Punto
Aunque en las estructuras, usar New, sera algo redundante.
Las estructuras siempre se almacenan en la pila, por tanto deberamos tener la
precaucin de no crear estructuras con muchos campos o con muchos miembros, ya
que esto implicara un mayor consumo del "preciado" espacio de la pila.
Constructores de las estructuras
Tal y como hemos comentado, las estructuras siempre definen un constructor sin
parmetros, este constructor no lo podemos definir nosotros, es decir, siempre existe
y es el que el propio compilador de Visual Basic 2005 define.
Por tanto, si queremos agregar algn constructor a una estructura, este debe tener
parmetros y, tal como ocurre con cualquier mtodo o como ocurre en las clases,
podemos tener varias sobrecargas de constructores parametrizados en las
estructuras. La forma de definir esos constructores es como vimos en las clases:
usando distintas sobrecargas de un mtodo llamado New, en el caso de las
estructuras tambin podemos usar la palabra clave Me para referirnos a la instancia
actual.
Esto es particularmente prctico cuando los parmetros del constructor se llaman de
la misma forma que los campos declarados en la estructura, tal como ocurre en el
constructor mostrado en la siguiente definicin de la estructura Punto.
www.detodoprogramacion.com
Structure Punto
Public X As Integer
Public Y As Integer
'
Sub New(ByVal x As Integer, ByVal y As Integer)
Me.X = x
Me.Y = y
End Sub
End Structure

Nota:
Tanto en las estructuras como en las clases podemos tener
constructores compartidos, en el caso de las estructuras, este tipo de
constructor es el nico que podemos declarar sin parmetros.

Destructores de las estructuras
Debido a que las estructuras son tipos por valor y por tanto una variable declarada
con un tipo por valor "contiene el valor en si misma", no podemos destruir este tipo
de datos, lo ms que conseguiramos al asignarle un valor nulo (Nothing) sera
eliminar el contenido de la variable, pero nunca podemos destruir ese valor. Por
tanto, en las estructuras no podemos definir destructores.
Los miembros de una estructura
Como hemos comentado, los miembros o elementos que podemos definir en una
estructura son los mismos que ya vimos en las clases. Por tanto aqu veremos las
diferencias que existen al usarlos en las estructuras.
Campos
Como vimos, las variables declaradas a nivel del tipo, son los campos. La principal
diferencia con respecto a las clases, es que los campos de una estructura no pueden
inicialiarse en la declaracin y el valor que tendrn inicialmente es un valor "nulo",
que en el caso de los campos de tipo numricos es un cero.
Por tanto, si necesitamos que los campos tengan algn valor inicial antes de usarlos,
deberamos indicarlo a los usuarios de nuestra estructura y proveer un constructor
que realice las inicializaciones correspondientes, pero debemos recordar que ese
www.detodoprogramacion.com
constructor debe tener algn parmetro, ya que el predeterminado sin parmetros no
podemos "reescribirlo".
Los nicos campos que podemos inicializar al declararlos son los campos compartidos,
pero como tendremos oportunidad de ver, estos campos sern accesibles por
cualquier variable declarada y cualquier cambio que realicemos en ellos se ver
reflejado en el resto de "instancias" de nuestro tipo.
Mtodos y otros elementos
El resto de los miembros de una estructura se declaran y usan de la misma forma que
en las clases, si bien debemos tener en cuenta que el modificador de accesibilidad
predeterminado para los miembros de una estructura es Public, (incluso si son
campos declarados con Dm).
Otro detalle a tener en cuenta es que en una estructura siempre debe existir al menos
un evento o un campo no compartido, no se permiten estructuras en las que solo
tienen constantes, mtodos y/o propiedades, estn o no compartidos.
Cmo usar las estructuras
Tal como hemos comentado las estructuras son tipos por valor, para usar los tipos por
valor no es necesario instanciarlos explcitamente, ya que el mero hecho de
declararlos indica que estamos creando un nuevo objeto en memoria. Por tanto, a
diferencia de las clases o tipos por referencia, cada variable definida como un tipo de
estructura ser independiente de otras variables declaradas, aunque no las hayamos
instanciado.
Esta caracterstica de las estructuras nos permite hacer copias "reales" no copia de la
referencia (o puntero) al objeto en memoria como ocurre con los tipos por referencia.
Vemoslos con un ejemplo.
Dim p As New Punto(100, 75)
Dim p1 As Punto
p1 = p
p1.X = 200
' p.X vale 100 y p1.X vale 200
En este trozo de cdigo definimos e instanciamos una variable del tipo Punto, a
continuacin declaramos otra variable del mismo tipo y le asignamos la primera, si
estos tipos fuesen por referencia, tanto una como la otra estaran haciendo referencia
al mismo objeto en memoria, y cualquier cambio realizado a cualquiera de las dos
variables afectaran al mismo objeto, pero en el caso de las estructuras (y de los tipos
por valor), cada cambio que realicemos se har sobre un objeto diferente, por tanto la
asignacin del valor 200 al campo X de la variable p1 solo afecta a esa variable,
dejando intacto el valor original de la variable p.
www.detodoprogramacion.com

Ver video de esta leccin (Estructuras)









































www.detodoprogramacion.com


Accesibilidad y mbito
Tal y como comentamos anteriormente, dependiendo de dnde y cmo estn
declarados los tipos de datos y los miembros definidos en ellos, tendremos o no
acceso a esos elementos.
Recordemos que el mbito es el alcance con el que podemos acceder a un elemento y
depende de dnde est declarado, por otro lado, la accesibilidad depende de cmo
declaremos cada uno de esos elementos.
mbito
Dependiendo de donde declaremos un miembro o un tipo, ste tendr mayor alcance
o cobertura, o lo que es lo mismo, dependiendo del mbito en el que usemos un
elemento, podremos acceder a l desde otros puntos de nuestro cdigo.
A continuacin veremos con detalle los mbitos en los que podemos declarar los
distintos elementos de Visual Basic 2005.
mbito de bloque: Disponible nicamente en el bloque de cdigo en el que se
ha declarado.
Por ejemplo, si declaramos una variable dentro de un bucle For o un If Then,
esa variable solo estar accesible dentro de ese bloque de cdigo.
mbito de procedimiento: Disponible nicamente dentro del procedimiento
en el que se ha declarado. Cualquier variable declarada dentro de un
procedimiento (mtodo o propiedad) solo estar accesible en ese procedimiento
y en cualquiera de los bloques internos a ese procedimiento.
mbito de mdulo: Disponible en todo el cdigo del mdulo, la clase o la
estructura donde se ha declarado. Las variables con mbito a nivel de mdulo,
tambin estarn disponibles en los procedimientos declarados en el mdulo
www.detodoprogramacion.com
(clase o estructura) y por extensin a cualquier bloque dentro de cada
procedimiento.
mbito de espacio de nombres: Disponible en todo el cdigo del espacio de
nombres. Este es el nivel mayor de cobertura o alcance, aunque en este nivel
solo podemos declarar tipos como clases, estructuras y enumeraciones, ya que
los procedimientos solamente se pueden declarar dentro de un tipo.
Nota:
Por regla general, cuando declaramos una variable en un mbito, dicha
variable "ocultar" a otra que tenga el mismo nombre y est definida en
un bloque con mayor alcance, aunque veremos que en Visual Basic 2005
existen ciertas restricciones dependiendo de dnde declaremos esas
variables.
En VBScript/VB6 los mbitos disponibles solamente eran los de mdulo y
procedimiento, en estos casos, cualquier variable declarada en un procedimiento
oculta a una definida en un mdulo.
En Visual Basic 2005 podemos definir una variable dentro de un bloque de cdigo, en
ese caso dicha variable solo ser accesible dentro de ese bloque. Aunque, como
veremos a continuacin, en un procedimiento solamente podremos definir variables
que no se oculten entre s, estn o no dentro de un bloque de cdigo.
mbito de bloque
En los siguientes ejemplos veremos cmo podemos definir variables para usar
solamente en el bloque en el que estn definidas.
Los bloques de cdigo en los que podemos declarar variables son los bucles, (For, Do,
While), y los bloques condicionales, (If, Select).
Por ejemplo, dentro de un procedimiento podemos tener varios de estos bloques y por
tanto podemos definir variables "internas" a esos bloques:
Dim n As Integer = 3
'
For i As Integer = 1 To 10
Dim j As Integer
j += 1
If j < n Then
'...
End If
Next
'
www.detodoprogramacion.com
If n < 5 Then
Dim j As Integer = n * 3
End If
'
Do
Dim j As Integer
For i As Integer = 1 To n
j += i
Next
If j > 10 Then Exit Do
Loop
La variable n estar disponible en todo el procedimiento, por tanto podemos acceder
a ella desde cualquiera de los bloques.
En el primer bucle For, definimos la variable i como la variable a usar de contador,
esta variable solamente estar accesible dentro de este bucle For. Lo mismo ocurre
con la variable j.
En el primer If definimos otra variable j, pero esa solo ser accesible dentro de este
bloque If y por tanto no tiene ninguna relacin con la definida en el bucle For anterior.
En el bucle Do volvemos a definir nuevamente una variable j, a esa variable la
podemos acceder solo desde el propio bucle Do y cualquier otro bloque de cdigo
interno, como es el caso del bucle For, en el que nuevamente declaramos una variable
llamada i, que nada tiene que ver con el resto de variables declaradas con el mismo
nombre en los otros bloques.
Lo nico que no podemos hacer en cualquiera de esos bloques, es declarar una
variable llamada n, ya que al estar declarada en el procedimiento, el compilador de
Visual Basic 2005 nos indicar que no podemos ocultar una variable previamente
definida fuera del bloque, tal como podemos ver en la Figura 2.12.


Figura 2.12. Error al ocultar una variable definida en un procedimiento
Esta restriccin solo es aplicable a las variables declaradas en el procedimiento, ya
que si declaramos una variable a nivel de mdulo, no habr ningn problema para
www.detodoprogramacion.com
usarla dentro de un bloque. Esto es as porque en un procedimiento podemos declarar
variables que se llamen de la misma forma que las declaradas a nivel de mdulo,
aunque stas ocultarn a las del "nivel" superior.
mbito de procedimiento
Las variables declaradas en un procedimiento tendrn un mbito o cobertura que ser
el procedimiento en el que est declaradas, y como hemos visto, ese mbito incluye
tambin cualquier bloque de cdigo declarado dentro del procedimiento.
Estas variables ocultarn a las que se hayan declarado fuera del procedimiento, si
bien, dependiendo del tipo de mdulo, podremos acceder a esas variables "externas"
indicando el nombre completo del mdulo o bien usando la instruccin Me, tal como
vimos en el cdigo del constructor parametrizado de la estructura Punto.
Pero mejor vemoslo con un ejemplo. En el siguiente cdigo, definimos una clase en
la que tenemos un campo llamado Nombre, tambin definimos un mtodo en el que
internamente se utiliza una variable llamada nombre, para acceder a la variable
declarada en la clase, tendremos que usar la instruccin o palabra clave Me.
Public Class Cliente
Public Nombre As String = "Juan"
Function Mostrar() As String
Dim nombre As String = "Pepita"
Return "Externo= " & Me.Nombre & ", interno= " & nombre
End Function
End Class
En este ejemplo, el hecho de que una variable est declarada con la letra ene en
mayscula o en minscula no implica ninguna diferencia, ya que Visual Basic 2005 al
igual que VBScript/VB6 no hace distinciones de este tipo, si bien, en Visual Basic 2005
no se cambia automticamente las maysculas y minsculas de las variables, salvo
cuando estn en el mismo nivel de mbito; en cambio, si en VBScript/VB6 declaramos
una variable con el mismo nombre, aunque est en un mbito diferente, siempre se
usar el estado de maysculas/minsculas de la ltima definicin.
mbito de mdulo
Cuando hablamos de mdulos, nos estamos refiriendo a una clase, a una estructura o
a cualquier otro tipo de datos que nos permita .NET.
En estos casos, las variables declaradas dentro de un tipo de datos sern visibles
desde cualquier parte de ese tipo, siempre teniendo en cuenta las restricciones
mencionadas en los casos anteriores.
www.detodoprogramacion.com
mbito de espacio de nombres
Los espacios de nombres son los contenedores de tipos de datos de mayor nivel, y
sirven para contener definiciones de clases, estructuras, enumeraciones y delegados
como ya comentamos en el primer mdulo. Cualquier tipo definido en el mbito del
espacio de nombres estar disponible para cualquier otro elemento definido en el
mismo espacio de nombres.
Al igual que ocurre en el resto de mbitos "inferiores", si definimos un tipo en un
espacio de nombres, podemos usar ese mismo nombre para nombrar a un
procedimiento o a una variable, en cada caso se aplicar el mbito correspondiente y,
tal como vimos anteriormente, tendremos que usar nombres nicos para poder
acceder a los nombres definidos en niveles diferentes.
La palabra clave Global
En Visual Basic 2005 podemos definir espacios de nombres cuyos nombres sean los
mismos que los definidos en el propio .NET Framework, para evitar conflictos de
mbitos, podemos usar la palabra clave Global para acceder a los que se han definido
de forma "global" en .NET.
Por ejemplo, si tenemos el siguiente cdigo en el que definimos una clase dentro de
un espacio de nombres llamado System y queremos acceder a uno de los tipos
definidos en el espacio de nombres System de .NET, tendremos un problema:
Namespace System
Class Cliente
Public Nombre As String
Public Edad As System.Int32
End Class
End Namespace
El problema es que el compilador de Visual Basic 2005 nos indicar que el tipo Int32
no est definido, ya que intentar buscarlo dentro del mbito que actualmente tiene,
es decir, la declaracin que nosotros hemos hecho de System, por tanto para poder
acceder al tipo Int32 definido en el espacio de nombres "global" System de .NET
tendremos que usar la instruccin Global, por suerte el IDE de Visual Studio 2005
reconoce este tipo de error y nos ofrece ayuda para poder solventar el conflicto, tal
como vemos en la Figura 2.13:
www.detodoprogramacion.com


Figura 2.13. Ayuda del IDE en los conflictos de espacios nombres globales
Nota:
Afortunadamente este conflicto con los espacios de nombres no ser
muy habitual para los desarrolladores que usemos el idioma de
Cervantes, por la sencilla razn de que los espacios de nombres de .NET
Framework suelen estar definidos usando palabras en ingls.

Accesibilidad
La accesibilidad es la caracterstica que podemos aplicar a cualquiera de los elementos
que definamos en nuestro cdigo. Dependiendo de la accesibilidad declarada
tendremos distintos tipos de accesos a esos elementos.
Los modificadores de accesibilidad que podemos aplicar a los tipos y elementos
definidos en nuestro cdigo pueden ser cualquiera de los mostrados en la siguiente
lista:
Public: Acceso no restringido. Este es modificador de accesibilidad con mayor
"cobertura", podemos acceder a cualquier miembro pblico desde cualquier
parte de nuestro cdigo. Aunque, como veremos, este acceso no restringido
puede verse reducido dependiendo de dnde lo usemos.
Protected: Acceso limitado a la clase contenedora o a los tipos derivados de
esta clase. Este modificador solamente se usa con clases que se deriven de
otras.
Friend: Acceso limitado al proyecto actual. Visual Basic 2005 aplica este
modificador de forma predeterminada a los procedimientos declarados en las
clases.
Protected Friend: Acceso limitado al proyecto actual o a los tipos derivados de
la clase contenedora. Una mezcla de los dos modificadores anteriores.
Private: Acceso limitado al tipo contenedor. Es el ms restrictivos de todos los
modificadores de accesibilidad y en el caso de los campos declarados en las
clases (Class) equivale a usar Dim.
Estos modificadores de accesibilidad los podemos usar tanto en clases, estructuras,
interfaces, enumeraciones, delegados, eventos, mtodos, propiedades y campos.
www.detodoprogramacion.com
Aunque no sern aplicables en espacios de nombres (Namespace) ni clases de tipo
Module, en estos dos casos siempre tendrn cobertura pblica, si bien no se permite
el uso de ningn modificador.
Accesibilidad de las variables en los procedimientos
Las variables declaradas dentro de un procedimiento solo son accesibles dentro de
ese procedimiento, en este caso solo se puede aplicar el mbito privado, aunque no
podremos usar la instruccin Private, sino Dim o Static.
Nota:
La palabra clave Static, tiene el mismo significado que en VB6, y nos
permite definir una variable privada (o local) al procedimiento para que
mantenga el valor entre diferentes llamadas a ese procedimiento; esto
contrasta con el resto de variables declaradas en un procedimiento cuya
duracin es la misma que la vida del propio procedimiento, por tanto, las
variables no estticas pierden el valor al terminar la ejecucin del
procedimiento.

Las accesibilidades predeterminadas
La accesibilidad de una variable o procedimiento en la que no hemos indicado el
modificador de accesibilidad depender del sitio en el que la hemos declarado.
Por ejemplo, en las estructuras si definimos los campos usando Dim, estos tendrn un
mbito igual que si le hubisemos aplicado el modificador Public; sin embargo, esa
misma variable declarada en una clase (Class o Module) tendr una accesibilidad
Private. As mismo, si el elemento que declaramos es un procedimiento y no
indicamos el modificador de mbito, ste tendr un mbito de tipo Public si lo
definimos en una estructura y si el lugar en el que lo declaramos es una clase (o
Module), ste ser Friend.
En la siguiente tabla tenemos la accesibilidad predeterminada de cada tipo (clase,
estructura, etc.), as como de las variables declaradas con Dim y de los
procedimientos en los que no se indican el modificador de accesibilidad.
Tipo del tipo de las variables
declaradas con
Dim
de los
procedimientos
Class Friend Private Friend
Module Friend Private Friend
Structure Friend Public Public
Enum Public
Friend
N.A.
(los miembros
siempre son
pblicos)
N.A.
Interface Friend N.A. Public
www.detodoprogramacion.com
(no se pueden
declarar variables)
(no se permite
indicarlo)
Tabla 1.3. La accesibilidad predeterminada de los tipos
Tal como podemos ver en la tabla 1.3, la accesibilidad predeterminada, (la que tienen
cuando no se indica expresamente con un modificador), de todos los tipos es Friend,
es decir, accesible a todo el proyecto, aunque en el caso de las enumeraciones el
modificador depende de dnde se declare dicha enumeracin, si est declarada a nivel
de espacio de nombres ser Friend, en el resto de los casos ser Public.
En la tercera columna tenemos la accesibilidad predeterminada cuando declaramos
las variables con Dim, aunque en las interfaces y en las enumeraciones no se
permiten declarar variables.
La ltima columna es la correspondiente a los procedimientos, en el caso de las
interfaces no se puede aplicar ningn modificador de accesibilidad y de forma
predeterminada son pblicos.
En esta otra tabla tenemos la accesibilidad permitida en cada tipo as como las que
podemos indicar en los miembros de esos tipos.
Tipo del tipo de los miembros
Class Public
Friend
Private
Protected
Protected Friend
Public
Friend
Private
Protected
Protected Friend
Module Public
Friend
Public
Friend
Private
Structure Public
Friend
Private
Public
Friend
Private
Enum Public
Friend
Private
N.A.
Interface Public
Friend
Private
Protected
Protected Friend
N.A.
Siempre son pblicos
Tabla 1.4. Accesibilidades permitidas en los tipos
Algunos de los modificadores que podemos indicar en los tipos dependen de dnde
declaremos esos tipos, por ejemplo, tan solo podremos indicar el modificador privado
de las enumeraciones cuando estas se declaren dentro de un tipo. En el caso de las
clases e interfaces, los modificadores Protected y Protected Friend solo podremos
aplicarlos cuando estn declaradas dentro de una clase (Class).
www.detodoprogramacion.com
Anidado de tipos
Tal como hemos comentado en el prrafo anterior, podemos declarar tipos dentro de
otros tipos, por tanto el mbito y accesibilidad de esos tipos dependen del mbito y
accesibilidad del tipo que los contiene. Por ejemplo, si declaramos una clase con
acceso Friend, cualquier tipo que esta clase contenga siempre estar supeditado al
mbito de esa clase, por tanto si declaramos otro tipo interno, aunque lo declaremos
como Public, nunca estar ms accesible que la clase contenedora, aunque en estos
casos no habr ningn tipo de confusin, ya que para acceder a los tipos declarados
dentro de otros tipos siempre tendremos que indicar la clase que los contiene.
En el siguiente cdigo podemos ver cmo declarar dos clases "anidadas". Tal como
podemos comprobar, para acceder a la clase Salario debemos indicar la clase Cliente,
ya que la nica forma de acceder a una clase anidada es mediante la clase
contenedora.
Friend Class Cliente
Public Nombre As String

Public Class Salario
Public Importe As Decimal
End Class
End Class

' Para usar la clase Salario debemos declararla de esta forma:
Dim s As New Cliente.Salario
s.Importe = 2200

Los tipos anidables
Cualquiera de los tipos mostrados en la tabla 1.4, excepto las enumeraciones, pueden
contener a su vez otros tipos. La excepcin es el tipo Module que aunque puede
contener a otros tipos, no puede usarse como tipo anidado. Una enumeracin siempre
puede usarse como tipo anidado.
Nota:
Los espacios de nombres tambin pueden anidarse y contener a su vez
cualquiera de los tipos mostrados en la tabla 1.4, incluso tipos Module.

www.detodoprogramacion.com
El nombre completo de un tipo
Tal como hemos visto, al poder declarar tipos dentro de otros tipos y estos a su vez
pueden estar definidos en espacios de nombres, podemos decir que el nombre
"completo" de un tipo cualquiera estar formado por el/los espacios de nombres y
el/los tipos que los contiene, por ejemplo si la clase Cliente definida anteriormente
est a su vez dentro del espacio de nombres Ambitos, el nombre completo ser:
Ambitos.Cliente y el nombre completo de la clase Salario ser:
Ambitos.Cliente.Salario.
Aunque para acceder a la clase Cliente no es necesario indicar el espacio de
nombres, al menos si la queremos usar desde cualquier otro tipo declarado dentro de
ese espacio de nombres, pero si nuestra intencin es usarla desde otro espacio de
nombre externo a Ambitos, en ese caso si que tendremos que usar el nombre
completo.
Por ejemplo, en el siguiente cdigo tenemos dos espacios de nombres que no estn
anidados, cada uno de ellos declara una clase y desde una de ellas queremos acceder
a la otra clase, para poder hacerlo debemos indicar el nombre completo, ya que en
caso contrario, el compilador de Visual Basic 2005 sera incapaz de saber a que clase
queremos acceder.
Namespace Uno
Public Class Clase1
Public Nombre As String
End Class
End Namespace

Namespace Dos
Public Class Clase2
Public Nombre As String
Sub Main()
Dim c1 As New Uno.Clase1
c1.Nombre = "Pepe"
End Sub
End Class
End Namespace
Esto mismo lo podemos aplicar en el caso de que tengamos dos clases con el mismo
nombre en espacios de nombres distintos.
www.detodoprogramacion.com
Nota:
En el mismo proyecto podemos tener ms de una declaracin de un
espacio de nombres con el mismo nombre, en estos casos el compilador
lo tomar como si todas las clases definidas estuvieran dentro del mismo
espacio de nombres, aunque estos estn definidos en ficheros diferentes.

Importacin de espacios de nombres
Tal como hemos comentado, los espacios de nombres pueden contener otros espacios
de nombres y estos a su vez tambin pueden contener otros espacios de nombres o
clases, y como hemos visto, para poder acceder a una clase que no est dentro del
mismo espacio de nombres debemos indicar el "nombre completo".
Para evitar estar escribiendo todos los espacios de nombres en los que est la clase
que nos interesa declarar, podemos usar una especie de acceso directo o para que lo
entendamos mejor, podemos crear una especie de "Path", de forma que al declarar
una variable, si esta no est definida en el espacio de nombres actual, el compilador
busque en todos los espacios de nombres incluidos en esas rutas (paths).
Esto lo conseguimos usando la instruccin Imports seguida del espacio de nombres
que queremos importar o incluir en el path de los espacios de nombres.
Podemos usar tantas importaciones de espacios de nombres como necesitemos y
estas siempre deben aparecer al principio del fichero, justo despus de las
instrucciones Options.
Por ejemplo, si tenemos el cdigo anterior y hacemos la importacin del espacio de
nombres en el que est definida la clase Clase1:
Imports Uno
podremos acceder a esa clase de cualquiera de estas dos formas:
Dim c1 As New Uno.Clase1
Dim c1 As New Clase1

Alias de espacios de nombres
Si hacemos demasiadas importaciones de nombres, el problema con el que nos
podemos encontrar es que el IntelliSense de Visual Basic 2005 no sea de gran ayuda,
ya que mostrar una gran cantidad de clases, y seguramente nos resultar ms difcil
encontrar la clase a la que queremos acceder, o tambin podemos encontrarnos en
ocasiones en las que nos interese usar un nombre corto para acceder a las clases
contenidas en un espacio de nombres, por ejemplo, si queremos indicar de forma
www.detodoprogramacion.com
explcita las clases de un espacio de nombres como el de Microsoft.VisualBasic,
podemos hacerlo de esta forma:
Imports vb = Microsoft.VisualBasic
De esta forma podemos usar el "alias" vb para acceder a las clases y dems tipos
definidos en ese espacio de nombres.
En las figuras 1.14 1.15 podemos ver las dos formas de acceder a las clases del
espacio de ese espacio de nombres, en el primer caso sin usar un alias y en el
segundo usando el alias vb.


Figura 2.14. Los miembros de un espacio de nombres usando el nombre
completo

www.detodoprogramacion.com


Figura 2.15. Acceder a los miembros de un espacio de nombres usando un
alias

Ver video 1 de esta leccin (mbito y accesibilidad, herencia)
Ver video 2 de esta leccin (mbito 2)




















www.detodoprogramacion.com


Propiedades
Las propiedades son los miembros de los tipos que nos permiten acceder a los datos
que dicho tipo manipula. Normalmente una propiedad est relacionada con un campo,
de forma que el campo sea el que realmente contenga el valor y la propiedad
simplemente sea una especie de mtodo a travs del cual podemos acceder a ese
valor.
Debido a que el uso de las propiedades realmente nos permite acceder a los valores
de una clase (o tipo), se suelen confundir los campos con las propiedades. De hecho
en VBScript/VB6 si definimos una variable pblica, sta se convierte en una propiedad
de la clase. En Visual Basic 2005 casi ocurre lo mismo, pero realmente un campo (o
variable) pblico no es una propiedad, al menos en el sentido de que el propio .NET
Framework no lo interpreta como tal, aunque en la prctica nos puede parecer que es
as, ya que se utilizan de la misma forma. Pero no debemos dejarnos llevar por la
comodidad y si no queremos perder funcionalidad, debemos diferenciar en nuestro
cdigo las propiedades de los campos.
Lo primero que debemos tener presente es que gracias a esta diferenciacin que hace
.NET Framework, (realmente VBScript/VB6 tambin la hace), podemos poner en
prctica una de las caractersticas de la programacin orientada a objetos: la
encapsulacin, de forma, que la manipulacin de los datos que una clase contiene
siempre se deben hacer de forma "interna" o privada a la clase, dejando a las
propiedades la posibilidad de que externamente se manipulen, de forma controlada,
esos datos. De esta forma tendremos mayor control sobre cmo se acceden o se
asignan los valores a esos datos, ya que al definir una propiedad, tal como hemos
comentado, realmente estamos definiendo un procedimiento con el cual podemos
controlar cmo se acceden a esos datos.
Este concepto no ha cambiado, al menos en el fondo, con respecto a como lo
www.detodoprogramacion.com
hacemos con VBScript/VB6, ya que en estos lenguajes tambin podemos declarar
procedimientos del tipo propiedad, aunque la forma de hacerlo en Visual Basic 2005 si
que ha cambiado un poco, tal como tendremos ocasin de ver a continuacin.
Definir una propiedad
Debido a que una propiedad realmente nos permite acceder a un dato que la clase (o
estructura) manipula, siempre tendremos un campo relacionado con una propiedad.
El campo ser el que contenga el valor y la propiedad ser la que nos permita
manipular ese valor.
En Visual Basic 2005, las propiedades las declaramos usando la instruccin Property y
la definicin de la misma termina con End Property, esto es prcticamente igual (o
casi) que en VBScript/VB6. La diferencia principal es que en VBScript/VB6 cuando
definimos una propiedad, debemos hacerlo en partes, por ejemplo, si queremos
definir cuando accedemos al valor, declaramos esa accin usando las instrucciones
Property Get y para definir la parte de la propiedad que asigna un nuevo valor, lo
hacemos mediante Property Let. En Visual Basic 2005 esas dos acciones, la de lectura
(GET) y asignacin (LET), las debemos indicar en dos bloques dentro de la propia
declaracin de la propiedad, el bloque que nos permite acceder al valor de la
propiedad estar indicado por la instruccin Get y acaba con End Get, por otra parte,
el bloque usado para asignar un valor a la propiedad se define mediante la instruccin
Set y acaba con End Set.
Nota:
En VBScript/VB6 realmente disponemos de tres bloques o partes en la
definicin de una propiedad:
Property Get, que nos permite acceder al valor de la propiedad.
Propery Let, que nos permite asignar un valor a la propiedad.
Property Set, el cual lo usamos cuando la propiedad representa un
objeto y queremos asignar dicho objeto a la propiedad.
La diferencia entre Let y Set es que el primero se usar en valores de
tipos por valor y el segundo en tipos por referencia, aunque el
compilador de VBScript/VB6 realmente usar uno u otro segn
asignemos el valor directamente a la propiedad o usemos la instruccin
Set para hacer esa asignacin.
Tal como indicamos en la nota anterior, en VBScript/VB6 existen dos formas de
asignar valores a una propiedad de una clase, pero en Visual Basic 2005 no existe ese
"conflicto" en la forma de asignar los valores, ya que siempre que se asigna un valor
a una propiedad se hace sin usar la instruccin Set, de hecho no se puede usar Set
para realizar asignaciones a propiedades en VB2005.
Veamos como definir una propiedad en Visual Basic 2005:
Public Class Cliente
Private _nombre As String
Public Property Nombre() As String
www.detodoprogramacion.com
Get
Return _nombre
End Get
Set(ByVal value As String)
_nombre = value
End Set
End Property
End Class
Como podemos comprobar tenemos dos bloques de cdigo, el bloque Get que es el
que se usa cuando queremos acceder al valor de la propiedad, por tanto devolvemos
el valor del campo privado usado para almacenar ese dato. El bloque Set es el usado
cuando asignamos un valor a la propiedad, este bloque tiene definido un parmetro
(value) que representa al valor que queremos asignar a la propiedad.
Aunque en Visual Basic 2005 las definiciones para obtener o asignar el valor de la
propiedad se hacen en bloques definidos dentro de un procedimiento del tipo
Property, esta forma de definir las propiedades no se diferencia demasiado a como lo
hacemos en VBScript/VB6, y una vez que nos acostumbremos lo veremos como una
forma ms "compacta" de hacerlo.
Propiedades de solo lectura
En ciertas ocasiones nos puede resultar interesante que una propiedad sea de solo
lectura, de forma que el valor que representa no pueda ser cambiado.
En VBScript/VB6 para definir una propiedad de solo lectura bastaba con definir solo la
parte Get de la propiedad., En Visual Basic 2005 tambin se hace de esa forma, pero
debemos indicar expresamente que esa es nuestra intencin. Por tanto no solo
basta con definir solo el bloque Get, sino que debemos usar el modificador ReadOnly
para que el compilador de Visual Basic 2005 acepte la declaracin:
Public ReadOnly Property Hoy() As Date
Get
Return Date.Now
End Get
End Property

www.detodoprogramacion.com
Propiedades de solo escritura
De igual forma, si queremos definir una propiedad que sea de solo escritura, solo
definiremos el bloque Set, pero al igual que ocurre con las propiedades de solo
lectura, debemos indicar expresamente que esa es nuestra intencin, para ello
usaremos la palabra clave WriteOnly:
Public WriteOnly Property Password() As String
Set(ByVal value As String)
If value = "blablabla" Then
' ok
End If
End Set
End Property

Diferente accesibilidad para los bloques Get y Set
En las propiedades normales (de lectura y escritura), podemos definir diferentes
niveles de accesibilidad a cada uno de los dos bloques que forman una propiedad. Por
ejemplo, podramos definir el bloque Get como pblico, (siempre accesible), y el
bloque Set como Private, de forma que solo se puedan realizar asignaciones desde
dentro de la propia clase.
Por ejemplo, el salario de un empleado podramos declararlo para que desde cualquier
punto se pueda saber el importe, pero la asignacin de dicho importe solo estar
accesible para los procedimientos definidos en la propia clase:
Public Class Empleado
Private _salario As Decimal
Public Property Salario() As Decimal
Get
Return _salario
End Get
Private Set(ByVal value As Decimal)
_salario = value
End Set
www.detodoprogramacion.com
End Property
End Class
Para hacer que el bloque Set sea privado, lo indicamos con el modificador de
accesibilidad Private, al no indicar ningn modificador en el bloque Get, ste ser el
mismo que el de la propiedad.
En VBScript/VB6 podemos hacer esto mismo definiendo como pblico la declaracin
de Property Get y como privado la de la asignacin: Property Let.
Nota:
El nivel de accesibilidad de los bloques Get o Set debe ser igual o inferior
que el de la propiedad, por tanto si la propiedad la declaramos como
Private, no podemos definir como pblico los bloques Get o Set.

Propiedades predeterminadas
Una cosa que echamos en falta en Visual Basic 2005 son las propiedades
predeterminadas. Aunque existen no son exactamente igual que en VB6. En VB6
podemos definir como propiedad predeterminada cualquiera de las propiedades de la
clase, aunque la forma de hacerlo es bastante "rebuscada" y poco intuitiva. Al menos
podemos definir como predeterminada la que ms nos interese.
En Visual Basic 2005 no podemos definir como predeterminada cualquier propiedad,
ya que debido a como se realizan las asignaciones de objetos en .NET (sin necesidad
de usar Set), siempre debemos indicar la propiedad a la que queremos asignar el
valor, porque en caso de que no se indique ninguna, el compilador interpretar que lo
que queremos asignar es un objeto y no un valor a una propiedad.
Para evitar conflictos o tener que usar alguna instruccin "extra" para que se sepa si
lo que queremos asignar es un valor o un objeto, en Visual Basic 2005 las
propiedades predeterminadas siempre deben ser parametrizadas, es decir, tener
como mnimo un parmetro.
Para indicar que una propiedad es la propiedad por defecto lo debemos hacer usando
la instruccin Default:
Default Public ReadOnly Property Item(ByVal index As Integer) As
Empleado
Get
' ...
End Get
End Property
Como vemos en este ejemplo, una propiedad por defecto puede ser de solo lectura y
tambin de solo escritura o de lectura/escritura.
www.detodoprogramacion.com
Para usar esta propiedad, al ser la propiedad por defecto, no es necesario indicar el
nombre de la propiedad, aunque si as lo deseamos podemos indicarla, aunque en
este caso no tendra mucha utilidad el haberla definido como propiedad por defecto:
Dim e As New Empleado
Dim e1 As Empleado = e(2)
' Tambin podemos usarla indicando el nombre de la propiedad:
Dim e2 As Empleado = e.Item(2)

Sobrecarga de propiedades predeterminadas
Debido a que las propiedades predeterminadas de Visual Basic 2005 deben recibir un
parmetro, podemos crear sobrecargas de una propiedad predeterminada, aunque
debemos recordar que para que esa sobrecarga pueda ser posible, el tipo o nmero
de argumentos deben ser distintos entre las distintas sobrecargas, por ejemplo
podramos tener una sobrecarga que reciba un parmetro de tipo entero y otra que lo
reciba de tipo cadena:
Default Public ReadOnly Property Item(ByVal index As Integer) As
Empleado
Get
' ...
End Get
End Property

Default Public Property Item(ByVal index As String) As Empleado
Get
' ...
End Get
Set(ByVal value As Empleado)
'
End Set
End Property
www.detodoprogramacion.com
Incluso como vemos en este cdigo una de las sobrecargas puede ser de solo lectura
y la otra de lectura/escritura. Lo que realmente importa es que el nmero o tipo de
parmetros de cada sobrecarga sea diferente.
Las propiedades predeterminadas tienen sentido en Visual Basic 2005 cuando
queremos que su uso sea parecido al de un array. Por tanto es habitual que las clases
de tipo coleccin sean las ms indicadas para definir propiedades por defecto. Aunque
no siempre el valor devuelto debe ser un elemento de una coleccin o array, ya que
podemos usar las propiedades predeterminadas para acceder a los miembros de una
clase "normal", de forma que se devuelva un valor segn el parmetro indicado, esto
nos permitira, por ejemplo, acceder a los miembros de la clase desde un bucle For. Si
definimos una propiedad predeterminada como en el siguiente cdigo:
Public Class Articulo
Public Descripcin As String
Public PrecioVenta As Decimal
Public Existencias As Decimal
Default Public ReadOnly Property Item(ByVal index As Integer) As
String
Get
Select Case index
Case 0
Return Descripcin
Case 1
Return PrecioVenta.ToString
Case 2
Return Existencias.ToString
Case Else
Return ""
End Select
End Get
End Property
End Class
La podemos usar de esta forma:
For i As Integer = 0 To 2
www.detodoprogramacion.com
Console.WriteLine( art(i) )
Next

Resumiendo:
Las propiedades predeterminadas en Visual Basic 2005 siempre deben tener un
parmetro, para que su uso se asemeje a un array, es decir, se use como indizador
de la clase. Por convencin, cuando se usan como indizador, el nombre de la
propiedad predeterminada suele ser Item.

Ver video de esta leccin (Clases 3: Las propiedades)






























www.detodoprogramacion.com


Interfaces
Las interfaces son un elemento bastante importante en .NET Framework, ya que de
hecho se utiliza con bastante frecuencia. En esta leccin veremos que son las
interfaces y como utilizarlas en nuestros proyectos. Tambin veremos que papel
juegan en .NET y cmo aplicar algunas de las definidas en la biblioteca base.
Qu es una interfaz?
Las interfaces son una forma especial de una clase, aunque la diferencia principal con
las clases es que las interfaces no contienen cdigo ejecutable, solo definen los
miembros.
Para entenderlo mejor, veamos las interfaces desde el punto de vista de Visual Basic
6.0.
En Visual Basic 6.0, cuando definimos una clase, realmente estamos haciendo dos
cosas:
1- Definiendo una interfaz con cada uno de los miembros que la clase contiene: mtodos,
propiedades, eventos, etc.
2- Definiendo el cdigo a utilizar por cada uno de esos miembros.
Desde ese punto de vista, podemos decir que una interfaz define cada uno de los
miembros de una clase, es decir, que tipo de mtodo es, si los mtodos tienen
parmetros, cuantos y de que tipos son, que propiedades o eventos define la clase,
etc.
www.detodoprogramacion.com
Por tanto, podemos decir que la interfaz de una clase indica los miembros que dicha
clase expone, y como hemos indicado anteriormente, cuando en VB6 definimos una
clase, tambin estamos definiendo una interfaz, de hecho en Visual Basic 6.0 no hay
forma de definir interfaces como algo independiente de una clase; cuando queremos
definir una interfaz en VB6, lo ms que podemos hacer es definir una clase sin cdigo
ejecutable.
Pero Visual Basic 2005, va an ms lejos, ya que las interfaces las definimos de forma
independiente de las clases. Es ms, cuando definimos una clase NO estamos
definiendo una interfaz.
Para definir una interfaz en VB2005 tenemos que usar la instruccin Interface seguida
del nombre y terminar la declaracin con End Interface:
Public Interface IAnimal
'...
End Interface

Nota:
Segn las indicaciones de nomenclatura de .NET Framework, se
recomienda que todas las interfaces empiecen con una I mayscula
seguida del nombre al que hacer referencia la interfaz.

Qu contiene una interfaz?
Al principio de esta leccin hemos comentado que las interfaces no contienen cdigo,
solo define los miembros que contiene. Esa definicin la haremos como cualquier otra,
con la diferencia de que no incluimos ningn cdigo, solo la "firma" o el prototipo de
cada uno de esos miembros.
En el siguiente cdigo definimos una interfaz que contiene los cuatros tipos de
miembros tpicos de cualquier clase:
Public Interface IPrueba
Sub Mostrar()
Function Saludo(ByVal nombre As String) As String
Property Nombre() As String
Event DatosCambiados()
End Interface
www.detodoprogramacion.com
El primer miembro de esta interfaz, es un mtodo de tipo Sub que no recibe
parmetros.
El siguiente mtodo es una funcin que devuelve un valor de tipo String y recibe un
parmetro tambin de tipo cadena.
A continuacin definimos una propiedad que devuelve una cadena.
Por ltimo, definimos un evento.
Como podemos observar, lo nico que tenemos que hacer es indicar el tipo de
miembro y si recibe o no algn parmetro o argumento.
Dos cosas importantes sobre las interfaces:
1- No se pueden definir campos.
2- Los miembros de las interfaces siempre son pblicos, tal como indicbamos en la
tabla 2.3.
Una interfaz es un contrato
Siempre que leemos sobre las interfaces, lo primero con lo que nos solemos encontrar
es que una interfaz es un contrato. Veamos que nos quieren decir con esa frase.
Tal como acabamos de ver, las interfaces solo definen los miembros, pero no el
cdigo a usar en cada uno de ellos, esto es as precisamente porque el papel que
juegan las interfaces es el de solo indicar que es lo que una clase o estructura puede,
o mejor dicho, debe implementar.
Si en una clase indicamos que queremos "implementar" una interfaz, esa clase debe
definir cada uno de los miembros que la interfaz expone. De esta forma nos
aseguramos de que si una clase implementa una interfaz, tambin implementa todos
los miembros definidos en dicha interfaz.
Cuando una clase implementa una interfaz est firmando un contrato con el que se
compromete a definir todos los miembros que la clase define, de hecho el propio
compilador nos obliga a hacerlo.
Las interfaces y el polimorfismo
Como comentamos anteriormente, el polimorfismo es una caracterstica que nos
permite acceder a los miembros de un objeto sin necesidad de tener un conocimiento
exacto de ese objeto (o de la clase a partir del que se ha instanciado), lo nico que
tenemos que saber es que ese objeto tiene ciertos mtodos (u otros miembros) a los
que podemos acceder. Tambin hemos comentado que las interfaces representan un
contrato entre las clases que las implementan, por tanto las interfaces pueden ser,
(de hecho lo son), un medio para poner en prctica esta caracterstica de la
programacin orientada a objetos. Si una clase implementa una interfaz, esa clase
tiene todos los miembros de la interfaz, por tanto podemos acceder a esa clase, que
en principio pude sernos desconocida, desde un objeto del mismo tipo que la interfaz.
www.detodoprogramacion.com
Usar una interfaz en una clase
Para poder utilizar una interfaz en una clase, o dicho de otra forma: para
"implementar" los miembros expuestos por una interfaz en una clase debemos
hacerlo mediante la instruccin Implements seguida del nombre de la interfaz:
Public Class Prueba
Implements IPrueba
Y como comentbamos, cualquier clase que implemente una interfaz debe definir
cada uno de los miembros de esa interfaz, por eso es el propio Visual Basic el
encargado de crear automticamente los mtodos y propiedades que la interfaz
implementa, aunque solo inserta el "prototipo" de cada uno de esos miembros,
dejando para nosotros el trabajo de escribir el cdigo.
Usando la definicin de la interfaz IPrueba que vimos antes, el cdigo que aadir
VB ser el siguiente:
Public Class Prueba
Implements IPrueba

Public Event DatosCambiados() Implements IPrueba.DatosCambiados

Public Sub Mostrar() Implements IPrueba.Mostrar

End Sub

Public Property Nombre() As String Implements IPrueba.Nombre
Get

End Get
Set(ByVal value As String)

End Set
End Property

www.detodoprogramacion.com
Public Function Saludo(ByVal nombre As String) As String _
Implements IPrueba.Saludo

End Function
End Class
Como podemos apreciar, no solo ha aadido las definiciones de cada miembro de la
interfaz, sino que tambin aade cdigo extra a cada uno de esos miembros: la
instruccin Implements seguida del nombre de la interfaz y el miembro al que se har
referencia.
Nota:
Si el lector antes ha utilizado las interfaces en VB6, esto no le resultar
extrao, ya que en ese lenguaje, cuando implementamos una interfaz
tambin se crean automticamente las definiciones de los miembros que
contiene la interfaz, aunque el formato utilizado por VBScript/VB6 es:
<Nombre de la interfaz> <guin bajo> <nombre del mtodo>, por
ejemplo: Private Sub IPrueba_Mostrar().
La utilidad de que en cada uno de los miembros se indique expresamente el mtodo
al que se hace referencia, es que podemos usar nombres diferentes al indicado en la
interfaz. Por ejemplo, si implementamos esta interfaz en una clase que solo utilizar
la impresora, al mtodo Mostrar lo podramos llamar Imprimir que sera ms
adecuado, en ese caso simplemente cambiamos el nombre del mtodo de la clase
para que implemente el mtodo Mostrar de la interfaz:
Public Sub Imprimir() Implements IPrueba.Mostrar

End Sub
De esta forma, aunque en la clase se llame de forma diferente, realmente hace
referencia al mtodo de la interfaz.
Acceder a los miembros implementados
Una vez que tenemos implementada una interfaz en nuestra clase, podemos acceder
a esos miembros de forma directa, es decir, usando un objeto creado a partir de la
clase:
Dim prueba1 As New Prueba

prueba1.Mostrar()
www.detodoprogramacion.com
O bien de forma indirecta, por medio de una variable del mismo tipo que la interfaz:
Dim prueba1 As New Prueba
Dim interfaz1 As IPrueba

interfaz1 = prueba1

interfaz1.Mostrar()
Qu ha ocurre aqu?
Como ya comentamos anteriormente, cuando asignamos variables por referencia,
realmente lo que asignamos son referencias a los objetos creados en la memoria, por
tanto la variable interfaz1 est haciendo referencia al mismo objeto que prueba1,
aunque esa variable solo tendr acceso a los miembros de la clase Prueba que
conoce, es decir, los miembros definidos en IPrueba.
Si la clase define otros miembros que no estn en la interfaz, la variable interfaz1 no
podr acceder a ellos.
Saber si un objeto implementa una interfaz
Si las interfaces sirven para acceder de forma annima a los mtodos de un objeto, es
normal que en Visual Basic tengamos algn mecanismo para descubrir si un objeto
implementa una interfaz.
Para realizar esta comprobacin podemos usar en una expresin If/Then la instruccin
TypeOf... Is, de forma que si la variable indicada despus de TypeOf contiene el tipo
especificado despus de Is, la condicin se cumple:
If TypeOf prueba1 Is IPrueba Then
interfaz1 = prueba1

interfaz1.Mostrar()
End If
De esta forma nos aseguramos de que el cdigo se ejecutar solamente si la variable
prueba1 contiene una definicin de la interfaz IPrueba.
Implementacin de mltiples interfaces
En Visual Basic 2005, una misma clase puede implementar ms de una interfaz. Para
indicar que implementamos ms de una interfaz podemos hacerlo de dos formas:
1- Usando nuevamente la instruccin Implements seguida del nombre de la interfaz:
www.detodoprogramacion.com
Public Class Prueba
Implements IPrueba
Implements IComparable
2- Indicando las otras interfaces en la misma instruccin Implements, pero
separndolas con comas:
Public Class Prueba
Implements IPrueba, IComparable
De cualquiera de las dos formas es vlido implementar ms de una interfaz, aunque
en ambos casos siempre debemos definir los miembros de cada una de esas
interfaces.
Mltiple implementacin de un mismo miembro
Como acabamos de comprobar, una misma clase puede implementar ms de una
interfaz, y esto nos puede causar una duda:
Qu ocurre si dos interfaces definen un mtodo que es idntico en ambas?
En principio, no habra problemas, ya que el propio Visual Basic creara dos mtodos
con nombres diferentes y a cada uno le asignara la implementacin de ese mtodo
definido en cada interfaz.
Por ejemplo, si tenemos otra interfaz que define el mtodo Mostrar y la
implementamos en la clase Prueba, la declaracin podra quedar de esta forma:
Public Interface IMostrar
Sub Mostrar()
End Interface

Public Sub Mostrar1() Implements IMostrar.Mostrar

End Sub
Aunque si ambos mtodos hacen lo mismo, en este ejemplo mostrar algo, podramos
hacer que el mismo mtodo de la clase sirva para implementar el de las dos
interfaces:
Public Sub Mostrar() Implements IPrueba.Mostrar, IMostrar.Mostrar

www.detodoprogramacion.com
End Sub
Es decir, lo nico que tendramos que hacer es indicar la otra implementacin
separndola con una coma.
Dnde podemos implementar las interfaces?
Para ir acabando este tema nos queda por saber, entre otras cosas, dnde podemos
implementar las interfaces, es decir, en que tipos de datos podemos usar
Implements.
La implementacin de interfaces la podemos hacer en las clases (Class), estructuras
(Structure) y en otras interfaces (Interface).
Debido a que una interfaz puede implementar otras interfaces, si en una clase
implementamos una interfaz que a su vez implementa otras, esa clase tendr
definidas cada una de las interfaces, lo mismo ocurre con una clase que "se derive" de
otra clase que implementa alguna interfaz, la nueva clase tambin incorporar esa
interfaz.
Nota:
Cuando una interfaz implementa otras interfaces, stas no se pueden
indicar mediante Implements, en lugar de usar esa instruccin debemos
usar Inherits.

Public Interface IPrueba2
Inherits IMostrar

Si en una clase implementamos una interfaz que a su vez implementa otras
interfaces, esa clase tendr definiciones de todos los miembros de todas las
interfaces, por ejemplo, si tenemos la siguiente definicin de la interfaz IPrueba2
que "implementa" la interfaz IMostrar:
Public Interface IPrueba2
Inherits IMostrar

Function Saludo(ByVal nombre As String) As String
Property Nombre() As String
Event DatosCambiados()
End Interface
Y la clase Prueba2 implementa IPrueba2, la definicin de los miembros quedara de
la siguiente forma:
www.detodoprogramacion.com
Public Class Prueba2
Implements IPrueba2

Public Sub Mostrar() Implements IMostrar.Mostrar

End Sub

Public Event DatosCambiados() Implements IPrueba2.DatosCambiados

Public Property Nombre() As String Implements IPrueba2.Nombre
Get

End Get
Set(ByVal value As String)

End Set
End Property

Public Function Saludo(ByVal nombre As String) As String _
Implements IPrueba2.Saludo

End Function
End Class
En este cdigo, el mtodo Mostrar se indica mediante la interfaz IMostrar, pero
tambin se puede hacer por medio de IPrueba2.Mostrar, ya que IPrueba2 tambin
lo implementa (o hereda).
Si dejamos que Visual Basic cree los miembros, no tendremos problemas a la hora de
definirlos. Pero si lo hacemos manualmente, aunque dentro del IDE de Visual Basic,
ste nos ayuda indicndonos que interfaces implementamos y qu miembros son los
que se adecuan a la declaracin que estamos usando, tal como podemos comprobar
en la Figura 2.02.16:
www.detodoprogramacion.com


Figura 2.02.16 IntelliSense solo muestra los mtodos que mejor se adecuan
a la declaracin
Un ejemplo prctico usando una interfaz de .NET
Tal como comentamos al principio, el propio .NET est "plagado" de interfaces, cada
una de ellas tiene un fin concreto, por ejemplo, si queremos definir una clase que
pueda ser clasificada por el propio .NET, esa clase debe implementar la interfaz
IComparable, ya que el mtodo Sort, (de la clase que contiene los elementos del tipo
definido por nosotros), que es el encargado de clasificar los elementos, har una
llamada al mtodo IComparable.CompareTo de cada uno de los objetos que queremos
clasificar, por tanto, si la clase no ha definido esa interfaz, no podremos clasificar los
elementos que contenga.
En el siguiente cdigo tenemos la definicin de una clase llamada Empleado que
implementa la interfaz IComparable y en el mtodo CompareTo hace la comprobacin
de que objeto es mayor o menor, si el de la propia clase o el indicado en el parmetro
de esa funcin:
Public Class Empleado
Implements IComparable

Public Nombre As String

Public Sub New(ByVal nombre As String)
Me.Nombre = nombre
End Sub

' Si el objeto es del tipo Empleado, comparamos los nombres.
' Si no es del tipo Empleado, devolvemos un cero
' que significa que los dos objetos son iguales.
Public Function CompareTo(ByVal obj As Object) As Integer _
Implements System.IComparable.CompareTo
If TypeOf obj Is Empleado Then
www.detodoprogramacion.com
Dim e1 As Empleado = CType(obj, Empleado)

Return String.Compare(Me.Nombre, e1.Nombre)
Else
Return 0
End If
End Function
End Class
En el mtodo CompareTo hacemos una comprobacin de que el objeto con el que
debemos realizar la comparacin es del tipo Empleado, en ese caso convertimos el
objeto pasado en uno del tipo Empleado y comparamos los nombres.
Si el objeto que recibe el mtodo no es del tipo Empleado, devolvemos un cero, para
indicar que no haga ninguna clasificacin, ya que ese valor indica que los dos objetos
son iguales.
Esta comparacin no es estrictamente necesaria, ya que si no indicamos el valor que
debe devolver una funcin, devolver un valor cero, al menos en este caso, ya que el
tipo a devolver es un nmero entero.
Esta clase la podemos usar de esta forma:
' Una coleccin de datos del tipo Empleado.
Dim empleados As New System.Collections.Generic.List(Of Empleado)

' Aadimos varios empleados a la coleccin.
empleados.Add(New Empleado("Pepe"))
empleados.Add(New Empleado("Bernardo"))
empleados.Add(New Empleado("Juan"))
empleados.Add(New Empleado("Ana"))

' Clasificamos los empleados de la coleccin.
empleados.Sort()

' Mostramos los datos una vez clasificados.
For Each e1 As Empleado In empleados
www.detodoprogramacion.com
Console.WriteLine(e1.Nombre)
Next


Ver video 1 de esta leccin (Interfaces 1)
Ver video 2 de esta leccin (Interfaces 2)
Ver video 3 de esta leccin (Interfaces 3 y herencia)


































www.detodoprogramacion.com


Introduccin
Es indiscutible que por mucho que nos lo propongamos, nuestras aplicaciones no
estarn libres de errores, y no nos referimos a errores sintcticos, ya que,
afortunadamente, el IDE (Integrated Development Envirnment, entorno de desarrollo
integrado) de Visual Studio 2005 nos avisar de cualquier error sintctico e incluso de
cualquier asignacin no vlida (al menos si tenemos activado Option Strict On). Pero
de lo que no nos avisar, como es lgico, ser de los errores que se produzcan en
tiempo de ejecucin. Para estos casos, Visual Basic pone a nuestra disposicin el
manejo de excepciones. Veamos pues cmo utilizarlo, sobre todo el sistema de
excepciones estructuradas que es el recomendable para cualquier desarrollo con .NET
Framework.
Manejo de excepciones
Manejo de excepciones
o Manejo de excepciones no estructuradas
o Manejo de excepciones estructuradas
Bloque Try
Bloque Catch
Varias capturas de errores en un mismo bloque Try/Catch
Evaluacin condicional en un bloque Catch
Bloque Finally
o Captura de errores no controlados


www.detodoprogramacion.com



Manejo de excepciones
En Visual Basic 2005 el tratamiento de errores (excepciones) ha cambiado con
respecto a como lo hacemos en VBScript/VB6, ahora podemos usar un tratamiento de
excepciones estructurado, de esta forma podemos detectar los errores que se
produzcan en nuestras aplicaciones de una forma ms "ordenada".
En VBScript/VB6 la nica forma de detectar errores es usando On Error. Esta forma
no estructurada de tratar los errores se sigue soportando en Visual Basic 2005, pero a
todas luces no es la forma recomendada. Debemos adaptar nuestra mente al formato
estructurado, ya que en un principio nos parecer que no es tan efectivo como On
Error.
En esta leccin veremos cmo tratar los errores de forma estructurada, ya que el
"viejo" On Error sigue funcionando de la misma forma que en VBScript/VB6.
Manejo de excepciones no estructuradas
Como hemos comentado, en Visual Basic 2005 tambin podemos usar el "viejo"
sistema de tratamientos de errores, es decir, el "clsico" On Error... que ahora se
llama tratamiento de errores no estructurado. La forma de utilizar On Error es la
misma que en VBScropt/VB6, por tanto no vamos a entrar en detalles de cmo usar
esta forma de interceptar errores, solo aclarar un par de cosas que debemos tener en
cuenta:
La primera es: intentar no usar esta forma de detectar errores, es preferible, aunque
al principio cueste adaptarse, utilizar los errores estructurados.
www.detodoprogramacion.com
La segunda es que no podemos usar los dos sistemas al mismo tiempo, por lo menos
en un mismo mtodo o propiedad, o utilizamos On Error o utilizamos Try/Catch. De
todas formas, si utilizamos el IDE (entorno integrado) de Visual Basic, ser el propio
compilador el que nos avise cuando mezclemos las dos formas de detectar los
errores.
Manejo de excepciones estructuradas
Las excepciones en Visual Basic 2005 las podemos controlar usando las instrucciones
Try / Catch / Finally. Estas instrucciones realmente son bloques de instrucciones, al
estilo de If / Else.
Cuando queramos controlar una parte del cdigo que puede producir un error lo
incluimos dentro del bloque Try. Si se produce un error, ste lo podemos detectar en
el bloque Catch. Por ltimo, independientemente de que se produzca o no una
excepcin, podemos ejecutar el cdigo que incluyamos en el bloque Finally, para
indicar el final del bloque de control de excepciones lo haremos con End Try.
Cuando creamos una estructura de control de excepciones no estamos obligados a
usar los tres bloques, aunque el primero: Try s es necesario, ya que es el que le
indica al compilador que tenemos intencin de controlar los errores que se produzcan.
Por tanto podemos crear un "manejador" de excepciones usando los tres bloques,
usando Try y Catch o usando Try y Finally.
Veamos ahora con ms detalle cada uno de estos bloques y que es lo que podemos
hacer en cada uno de ellos.
Bloque Try
En este bloque incluiremos el cdigo en el que queremos comprobar los errores.
El cdigo a usar ser un cdigo normal, es decir, no tenemos que hacer nada en
especial, ya que en el momento que se produzca el error se usar (si hay) el cdigo
del bloque Catch.
Bloque Catch
Si se produce una excepcin, sta la capturamos en un bloque Catch.
En el bloque Catch podemos indicar que tipo de excepcin queremos capturar, para
ello usaremos una variable de tipo Exception, la cual pude ser del tipo de error
especfico que queremos controlar o de un tipo genrico.
Por ejemplo, si sabemos que nuestro cdigo puede producir un error al trabajar con
ficheros, podemos usar un cdigo como este:
Try
' cdigo para trabajar con ficheros, etc.
Catch ex As System.IO.IOException
' el cdigo a ejecutar cuando se produzca ese error
www.detodoprogramacion.com
End Try
Si nuestra intencin es capturar todos los errores que se produzcan, es decir, no
queremos hacer un filtro con errores especficos, podemos usar la clase Exception
como tipo de excepcin a capturar. La clase Exception es la ms genrica de todas las
clases para manejo de excepciones, por tanto capturar todas las excepciones que se
produzcan.
Try
' cdigo que queremos controlar
Catch ex As Exception
' el cdigo a ejecutar cuando se produzca cualquier error
End Try
Aunque si no vamos usar la variable indicada en el bloque Catch, pero queremos que
no se detenga la aplicacin cuando se produzca un error, podemos hacerlo de esta
forma:
Try
' cdigo que queremos controlar
Catch
' el cdigo a ejecutar cuando se produzca cualquier error
End Try

Varias capturas de errores en un mismo bloque Try/Catch
En un mismo Try podemos capturar diferentes tipos de errores, para ello podemos
incluir varios bloques Catch, cada uno de ellos con un tipo de excepcin diferente.
Es importante tener en cuenta que cuando se produce un error y usamos varios
bloques Catch, Visual Basic buscar la captura que mejor se adapte al error que se ha
producido, pero siempre lo har examinando los diferentes bloques Catch que
hayamos indicado empezando por el indicado despus del bloque Try, por tanto
deberamos poner las ms genricas al final, de forma que siempre nos aseguremos
de que las capturas de errores ms especficas se intercepten antes que las genricas.
Evaluacin condicional en un bloque Catch
Adems de indicar la excepcin que queremos controlar, en un bloque Catch podemos
aadir la clusula When para evaluar una expresin. Si la evaluacin de la expresin
www.detodoprogramacion.com
indicada despus de When devuelve un valor verdadero, se procesar el bloque
Catch, en caso de que devuelva un valor falso, se ignorar esa captura de error.
Esto nos permite poder indicar varios bloques Catch que detecten el mismo error,
pero cada una de ellas pueden tener diferentes expresiones indicadas con When.
En el siguiente ejemplo, se evala el bloque Catch solo cuando el valor de la variable
y es cero, en otro caso se utilizar el que no tiene la clusula When:
Dim x, y, r As Integer
Try
x = CInt(Console.ReadLine())
y = CInt(Console.ReadLine())
r = x \ y
Console.WriteLine("El resultado es: {0}", r)
Catch ex As Exception When y = 0
Console.WriteLine("No se puede dividir por cero.")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try

Bloque Finally
En este bloque podemos indicar las instrucciones que queremos que se ejecuten, se
produzca o no una excepcin. De esta forma nos aseguramos de que siempre se
ejecutar un cdigo, por ejemplo para liberar recursos, se haya producido un error o
no.
Nota:
Hay que tener en cuenta de que incluso si usamos Exit Try para salir del
bloque de control de errores, se ejecutar el cdigo indicado en el
bloque Finally.

Captura de errores no controlados
Como es lgico, si no controlamos las excepciones que se puedan producir en
nuestras aplicaciones, estas sern inicialmente controladas por el propio runtime de
.NET. En estos casos la aplicacin se detiene y se muestra el error al usuario. Pero
www.detodoprogramacion.com
esto es algo que no deberamos consentir. Siempre deberamos detectar todos los
errores que se produzcan en nuestras aplicaciones, pero a pesar de que lo
intentemos, es muy probable que no siempre podamos conseguirlo.
Por suerte, en Visual Basic 2005 tenemos dos formas de interceptar los errores no
controlados:
La primera es iniciando nuestra aplicacin dentro de un bloque Try/Catch, de
esta forma, cuando se produzca el error, se capturar en el bloque Catch.
La segunda forma de interceptar los errores no controlados es mediante el
evento: UnhandledException, disponible por medio del objeto My.Application.
Nota:
De los eventos nos ocuparemos en la siguiente leccin, pero como el
evento UnhandledException est directamente relacionado con la
captura de errores, lo mostramos en esta, aunque recomendamos al
lector que esta seccin la vuelva a leer despus de ver todo lo
relacionado con los eventos.
Este evento se "dispara" cuando se produce un error que no hemos interceptado, por
tanto podramos usarlo para prevenir que nuestra aplicacin se detenga o bien para
guardar en un fichero .log la causa de dicho error para posteriormente actualizar el
cdigo y prevenirlo. Ya que cuando se produce el evento UnhandledException,
podemos averiguar el error que se ha producido e incluso evitar que la aplicacin
finalice. Esa informacin la obtenemos mediante propiedades expuestas por el
segundo parmetro del evento, en particular la propiedad Exception nos indicar el
error que se ha producido y por medio de la propiedad ExitApplication podemos
indicar si terminamos o no la aplicacin.
Nota:
Cuando ejecutamos una aplicacin desde el IDE (entorno de desarrollo),
los errores no controlados siempre se producen, independientemente de
que tengamos o no definida la captura de errores desde el evento
UnhandledException. Ese evento solo se producir cuando ejecutemos la
aplicacin fuera del IDE de Visual Basic.

Ver video 1 de esta leccin (Excepciones 1)
Ver video 2 de esta leccin (Excepciones 2)
Ver video 3 de esta leccin (Excepciones 3)







www.detodoprogramacion.com


Introduccin
La forma que tienen nuestras clases y estructuras de comunicar que algo est
ocurriendo, es por medio de eventos. Los eventos no les son desconocidos a los
desarrolladores de VB6, ya que tambin existen y se pueden definir en ese lenguaje.
En Visual Basic 2005 se siguen usando de la misma forma que en VB6, aunque
seguramente siempre que hemos ledo sobre el tema aparece la palabra delegado. Y
es que, aunque VB2005 nos oculte (o facilite) el trabajo con los eventos, stos
siempre estn relacionados con los delegados. En esta leccin veremos que son los
delegados y que relacin tienen con los eventos, tambin veremos que podemos tener
mayor control sobre cmo se interceptan los eventos e incluso cmo y cuando se
asocian los eventos en la aplicacin cliente, aunque primero empezaremos viendo
cmo declarar y utilizar eventos en nuestros tipos de datos.

Eventos y delegados
Eventos
o Interceptar los eventos de los controles de un formulario
Interceptar eventos en Visual Basic 6.0
Interceptar eventos en Visual Basic 2005
o Asociar un evento con un control
o Formas de asociar los eventos con un control
1- Asociar el evento manualmente por medio de Handles
2- Asociar el evento desde la ventana de cdigo
3- Asociar el evento desde el diseador de formularios
o Asociar varios eventos a un mismo procedimiento
www.detodoprogramacion.com
o Declarar una variable para asociar eventos con Handles
Definir y producir eventos en una clase
o Definir eventos en una clase
o Producir un evento en nuestra clase
o Otra forma de asociar los eventos de una clase con un mtodo
Asociar eventos mediante AddHandler
Desasociar eventos mediante RemoveHandler
Delegados
o Qu ocurre cuando se asigna y se produce un evento?
o Qu papel juegan los delegados en todo este proceso?
o Definicin "formal" de delegado
o Utilizar un delegado para acceder a un mtodo
Definir un evento bien informado




























www.detodoprogramacion.com


Eventos
En Visual Basic 2005 podemos usar los eventos de la misma forma que en Visual
Basic 6.0. Al menos en lo que se refiere a la forma de declararlos en nuestras clases y
cmo "lanzarlos", ya que la forma de interceptarlos en una aplicacin ha cambiado un
poco, pero como veremos, incluso puede ser ms fcil definir los mtodos o
procedimientos que utilizamos para interceptarlos.
Interceptar eventos en Visual Basic 2005
La forma ms sencilla de asociar el evento de un control con el cdigo que se usar,
es haciendo doble-click en el control; por ejemplo, si en nuestro formulario tenemos
un botn, al hacer doble pulsacin sobre l tendremos asociado el evento Click del
botn. Esto es as para los eventos predeterminados de los controles.
La declaracin del cdigo usado para interceptar el evento difiere un poco de VB6, tal
como podemos apreciar en el siguiente cdigo:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As
EventArgs) _
Handles Button1.Click

End Sub
Lo primero que podemos notar es que en Visual Basic 2005 utiliza dos argumentos,
esto siempre es as en todos los eventos producidos por los controles. El primero
www.detodoprogramacion.com
indica el control que produce el evento, (en nuestro ejemplo sera una referencia al
control Button1), y el segundo normalmente contiene informacin sobre el evento que
se produce. Si el evento en cuestin no proporciona informacin extra, como es el
caso del evento Click, ese parmetro ser del tipo EventArgs. Sin embargo en otros
eventos el segundo argumento tendr informacin que nos puede resultar til, por
ejemplo para saber qu elemento se ha seleccionado en una lista o cual es el
elemento seleccionado en una rejilla Web. En la figura 2.04.1 podemos ver las
propiedades relacionadas con el evento RowDataBound de un control GridView:


Figura 2.04.01 Propiedades relacionadas con un evento de una rejilla
Asociar un evento con un control
Siguiendo con el cdigo que intercepta el evento Click de un botn, podemos apreciar
que el IDE de Visual Studio 2005 aade al final de la declaracin del procedimiento de
evento la instruccin Handles seguida del control y el evento que queremos
interceptar: Handles Button1.Click. Eesta la forma habitual de hacerlo en VB2005,
ya que, a diferencia de VB6, aqu no hay nombres "mgicos" para asociar un evento
con un control o incluso con el propio formulario, sino que esa asociacin se hace de
forma explcita y la forma que tiene Visual Basic 2005 de hacerlo es usando la
clusula Handles.
Nota:
En Visual Basic 2005 el nombre del procedimiento de evento no est
relacionado con el evento, a diferencia de VB6, en el que si que hay una
relacin directa entre el evento a interceptar y el nombre del
procedimiento.
Aunque por defecto, el nombre usado sera el equivalente al de VB6, en
la nueva versin puede tener cualquier nombre.
Tal como resaltamos en la nota anterior, en Visual Basic 2005, el nombre asociado a
un evento puede ser el que queramos, lo realmente importante es que indiquemos la
instruccin Handles seguida del evento que queremos interceptar.
Formas de asociar los eventos con un control
Cuando estamos trabajando con el diseador de formularios, tenemos tres formas de
asociar un evento con el cdigo correspondiente:
www.detodoprogramacion.com
La forma ms sencilla es la expuesta anteriormente, es decir, haciendo doble click en
el control, esto har que se muestre el evento predeterminado del control. En el caso
del control Button, el evento predeterminado es el evento Click.
Si queremos escribir cdigo para otros eventos podemos hacerlo de tres formas,
aunque la primera que explicaremos no ser la ms habitual, ya que debemos saber
exactamente qu parmetros utiliza el evento.
1- Asociar el evento manualmente por medio de Handles
Con esta forma, simplemente escribimos el nombre del procedimiento (puede ser
cualquier nombre), indicamos los dos argumentos que recibe: el primero siempre es
de tipo Object y el segundo depender del tipo de evento (aunque en los controles
Web suele ser a menudo del tipo System.EventArgs), y finalmente por medio de la
clusula Handles lo asociamos con el control y el evento en cuestin.
2- Asociar el evento desde la ventana de cdigo
Al igual que en VB6, en Visual Basic 2005 tambin podemos seleccionar los eventos
disponibles de una lista desplegable. Esto lo haremos desde la ventana de cdigo. En
la parte superior derecha tenemos una la lista con los controles que hemos aadido al
formulario, seleccionamos el control que nos interese y en la lista que hay a su
izquierda tenemos los eventos que ese control produce. Por tanto podemos
seleccionar de esa lista de eventos el que nos interese interceptar, tal como podemos
ver en la Figura 2.04.02


Figura 2.04.02 Lista de eventos de un control
De esta forma el propio IDE ser el que cree el "esqueleto" del procedimiento de
evento usando los parmetros adecuados.
3- Asociar el evento desde el diseador de formularios
La tercera forma de asociar un evento con un control, es hacerlo desde el diseador
de formularios. En la ventana de propiedades del control, (tal como podemos apreciar
en la Figura 2.04.3), tenemos una lista con los eventos ms importantes de cada
www.detodoprogramacion.com
control, seleccionando el evento de esa lista y haciendo doble-click en el que nos
interese, conseguiremos exactamente el mismo resultado que con el paso anterior.


Figura 2.04.03 Ventana de propiedades con los eventos del control
seleccionado
Asociar varios eventos a un mismo procedimiento
Cuando utilizamos Handles para asociar eventos, podemos indicar que un mismo
procedimiento sirva para interceptar varios eventos. Veamos un caso prctico en el
que tenemos varios controles de tipo Button y queremos que cuando se pulsen
siempre se ejecute el mismo cdigo. Podemos hacerlo indicando despus de la
clusula Handles todos los controles que queremos asociar con ese procedimiento.
En el siguiente cdigo indicamos dos controles Button (uno arriba y otro abajo de la
pgina, por ejemplo):
Private Sub Button_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click, Button2.Click
End Sub
Esta asociacin la podemos hacer manualmente, simplemente indicando en la clusula
Handles cada uno de los eventos a continuacin del anterior separndolos por comas.
O bien desde el diseador de formularios. En este segundo caso, cuando
seleccionamos un control y desde la ventana de propiedades, seleccionamos un
evento, nos muestra los procedimientos que tenemos definidos en nuestro cdigo que
utilizan los mismos parmetros que el evento en cuestin, si seleccionamos uno de
esos procedimientos, el propio IDE aadir ese control a la lista Handles.
www.detodoprogramacion.com
Declarar una variable para asociar eventos con Handles
Para que podamos usar la instruccin Handles para asociar manualmente un
procedimiento con un evento, o para que el diseador de Visual Basic 2005 pueda
hacerlo, la variable del control o clase que tiene los eventos que queremos interceptar
tenemos que declararla con la instruccin WithEvents.
Esto es exactamente lo mismo que en Visual Basic 6.0, lo que ocurre es que cuando
trabajamos con formularios desde VB6, no nos tenemos que preocupar de este
detalle, en Visual Basic 2005 tampoco debemos preocuparnos, ya que el propio
diseador de formularios lo hace por nosotros.
Aunque a diferencia de VB6, hay que hacerlo de forma explcita, ya que en la versin
anterior de Visual Basic no tenamos ningn control sobre como se definan o
declaraban los controles a usar en nuestro formulario, mientras que en esta nueva
versin siempre tendremos acceso a ello. No vamos a entrar en ms detalles,
simplemente mostraremos cmo se declara el control Button1 para que exponga los
eventos:
Friend WithEvents Button1 As System.Web.UI.WebControls.Button
Si en lugar de estar trabajando con formularios y controles, lo hacemos con clases
"normales", la forma de declarar una variable que tiene eventos es por medio de la
instruccin WithEvents. Por ejemplo, en esta declaracin indicamos que tenemos
intencin de usar los eventos que la clase Empleado exponga:
Private WithEvents unEmpleado As Empleado
Y posteriormente podremos definir los mtodos de eventos usando la instruccin
Handles:
Private Sub unEmpleado_DatosCambiados() Handles
unEmpleado.DatosCambiados

End Sub

Nota:
Usar WithEvents y Handles es la forma ms sencilla de declarar y usar
una variable que accede a una clase que produce eventos, pero no es la
nica forma que tenemos de hacerlo en Visual Basic 2005, tal como
tendremos oportunidad de comprobar.

Ver video de esta leccin (Eventos 1)
www.detodoprogramacion.com


Definir y producir eventos en una clase
Como comentbamos anteriormente, la forma de definir un evento en una clase de
Visual Basic 2005 es idntica a como lo hacemos actualmente con VB6. Lo mismo
ocurre cuando queremos "lanzar" o producir el evento: en Visual Basic 2005 se hace
igual que en Visual Basic 6.0.
Definir eventos en una clase
Para definir un evento en una clase usamos la instruccin Event seguida del nombre
del evento y opcionalmente indicamos los argumentos que dicho evento recibir.
En el siguiente trozo de cdigo definimos un evento llamado DatosModificados que no
utiliza ningn argumento:
Public Event DatosModificados()
Esto es todo lo que necesitamos hacer.
Producir un evento en nuestra clase
Para producir un evento en nuestra clase, y de esta forma notificar a quin quiera
interceptarlo, simplemente usaremos la instruccin RaiseEvent seguida del evento
que queremos producir. Esto tampoco ha cambiado en Visual Basic 2005 con respecto
a VB6. Incluso cuando escribimos esa instruccin en el IDE, nos mostrar los distintos
eventos que podemos producir, tal como vemos en la Figura 2.04.04:
www.detodoprogramacion.com


Figura 2.04.04 Lista de eventos que podemos producir
Otra forma de asociar los eventos de una clase con un mtodo
Tal como hemos estado comentando, la forma ms sencilla de declarar una variable
para interceptar eventos es declarndola usando WithEvents y para interceptar los
eventos lo hacemos por medio de la instruccin Handles.
Esta forma es la ms recomendada, no solo por la facilidad de hacerlo, sino porque
tambin tenemos la ventaja de que todas las variables declaradas con WithEvents se
muestran en la lista desplegable de la ventana de cdigo.
De esta forma podemos seleccionar la variable y posteriormente elegir el evento a
interceptar, tal como vimos en la Figura 2.04.02.
Asociar eventos mediante AddHandler
Pero Visual Basic 2005 tambin proporciona otra forma de asociar un procedimiento
con un evento. Aunque en este caso es algo ms "manual" que todo lo que hemos
visto y, de alguna forma est ms ligado con los delegados, y como los delegados los
veremos dentro de poco, ahora solamente mostraremos la forma de hacerlo y
despus veremos con algo de ms detalle cmo funciona.
La forma de de asociar eventos con su correspondiente mtodo es por medio de la
instruccin AddHandler. A esta instruccin le pasamos dos argumentos, el primero
es el evento a asociar y el segundo es el procedimiento que usaremos cuando se
produzca dicho evento. Este ltimo parmetro tendremos que indicarlo mediante la
instruccin AddressOf, que al igual que en VB6 sirve para pasar una referencia a una
funcin o procedimiento, y precisamente eso es lo que queremos hacer: indicarle que
procedimiento debe usar cuando se produzca el evento:
AddHandler unEmpleado.DatosCambiados, AddressOf
unEmpleado_DatosCambiados
En este caso, el uso de AddressOf es una forma "fcil" que tiene Visual Basic 2005 de
asociar un procedimiento de evento con el evento. Aunque por detrs, (y sin que nos
enteremos), realmente lo que estamos usando es un constructor a un delegado.
La ventaja de usar esta forma de asociar eventos con el procedimiento, es que
podemos hacerlo con variables que no estn declaradas con WithEvents, realmente
esta sera la nica forma de asociar un procedimiento de evento con una variable que
no hemos declarado con WithEvents.
www.detodoprogramacion.com
Desasociar eventos mediante RemoveHandler
De la misma forma que por medio de AddHandler podemos asociar un procedimiento
con un evento, usando la instruccin RemoveHandler podemos hacer el proceso
contrario: desligar un procedimiento del evento al que previamente estaba asociado.
Los parmetros a usar con RemoveHandler son los mismos que con AddHandler.
Podemos usar RemoveHandler tanto con variables y eventos definidos con
AddHandler como con variables declaradas con WithEvents y ligadas por medio de
Handles.
Esto ltimo es as porque cuando nosotros definimos los procedimientos de eventos
usando la instruccin Handles, es el propio Visual Basic el que internamente utiliza
AddHandler para ligar ese procedimiento con el evento en cuestin. Saber esto nos
facilitar comprender mejor cmo funciona la declaracin de eventos mediante la
instruccin Custom, aunque de este detalle nos ocuparemos despus de ver que son
los delegados.

Ver video 1 de esta leccin (Eventos 2)
Ver video 2 de esta leccin (Eventos 3)

























www.detodoprogramacion.com


Delegados
Como hemos comentado anteriormente los eventos son acciones que una clase puede
producir cuando ocurre algo. De esta forma podemos notificar a las aplicaciones que
hayan decidido interceptar esos mensajes para que tomen las acciones que crean
conveniente.
Visual Basic 2005 esconde al desarrollador prcticamente todo lo que ocurre cada vez
que decidimos interceptar un evento. Nosotros solo vemos una pequea parte de todo
el trabajo que en realidad se produce, y el que no lo veamos no quiere decir que no
est ocurriendo nada. Tambin es cierto que no debe preocuparnos demasiado si no
sabemos lo que est pasando, pero si tenemos conciencia de que es lo que ocurre,
puede que nos ayude a comprender mejor todo lo relacionado con los eventos.
Qu ocurre cuando se asigna y se produce un evento?
Intentemos ver de forma sencilla lo que ocurre "por dentro" cada vez que definimos
un mtodo que intercepta un evento y cmo hace el Visual Basic para comunicarse
con el receptor de dicho evento.
1. Cuando Visual Basic se encuentra con el cdigo que le indica que un mtodo
debe interceptar un evento, ya sea mediante AddHandler o mediante el uso de
Handles, lo que hace es aadir la direccin de memoria de ese mtodo a una
especie de array.
En la Figura 2.04.05 podemos ver un diagrama en el que un mismo evento lo
interceptan tres clientes, cuando decimos que un cliente intercepta un evento,
realmente nos referimos a que hay un mtodo que lo intercepta y el evento
realmente guarda la direccin de memoria de ese mtodo.
www.detodoprogramacion.com


Figura 2.04.05 El evento guarda la direccin de memoria de cada mtodo que
lo intercepta
2. Cuando usamos la instruccin RaiseEvent para producir el evento, se examina
esa lista de direcciones y se manda el mensaje a cada uno de los mtodos que
tenemos en el "array".
En este caso, lo que realmente ocurre es que se hace una llamada a cada uno
de los mtodos, de forma que se ejecute el cdigo al que tenemos acceso
mediante la direccin de memoria almacenada en la lista.
3. Cuando usamos la instruccin RemoveHandler, le estamos indicando al evento
que elimine de la lista el mtodo indicado en esa instruccin, de esta forma, la
prxima vez que se produzca el evento, solo se llamar a los mtodos que
actualmente estn en la lista.
Tanto el agregar nuevos mtodos a esa lista como quitarlos, lo podemos hacer en
tiempo de ejecucin, por medio de AddHandler y RemoveHandler respectivamente. Ya
que la instruccin Handles solo la podemos usar en tiempo de diseo.
Es ms, podemos incluso indicar que un mismo evento procese ms de un mtodo en
una misma aplicacin o que un mismo mtodo sea llamado por ms de un evento. Ya
que lo que realmente necesita cada evento es que exista un mtodo que tenga una
"firma" concreta: la indicada al declarar el evento.
Qu papel juegan los delegados en todo este proceso?
Veamos primero que papel tienen los delegados en todo este proceso y despus
veremos con ms detalle lo que "realmente" es un delegado.
1. Cuando definimos un evento, estamos definiendo un delegado, (que en el fondo
es una clase con un tratamiento especial), y un mtodo del mismo tipo que el
delegado
2. Cuando indicamos que un mtodo intercepte un evento, realmente estamos
llamando al constructor del delegado, al que le pasamos la direccin de
www.detodoprogramacion.com
memoria del mtodo. El delegado almacena cada una de esas direcciones de
memoria para posteriormente usarlas
3. Cuando se produce el evento, (por medio de RaiseEvent), en realidad estamos
llamando al delegado para que acceda a todas las "direcciones" de memoria que
tiene almacenadas y ejecute el cdigo que hayamos definido en cada uno de
esos mtodos
Como podemos comprobar, y para decirlo de forma simple, un delegado realmente es
la forma que tiene .NET para definir un puntero. La diferencia principal es que los
punteros, (no vamos a entrar en demasiados detalles sobre los punteros, ya que no
estamos en un curso de C/C++), no tienen forma de comprobar si estn accediendo a
una direccin de memoria correcta o, para decirlo de otra forma, a una direccin de
memoria "adecuada". En .NET, los "punteros" solo se pueden usar mediante
delegados, y stos solamente pueden acceder a direcciones de memoria que tienen la
misma "firma" con el que se han definido. Para que lo entendamos un poco mejor, es
como si los delegados solo pudieran acceder a sitios en la memoria que contienen un
mtodo con la misma "interfaz" que el que ha definido el propio delegado.
Seguramente es difcil de entender, y la principal razn es que hemos empezado la
casa por el techo.
Por tanto, veamos a continuacin una definicin "formal" de qu es un delegado y
veamos varios ejemplos para que lo comprendamos mejor.
Definicin "formal" de delegado
Veamos que nos dice la documentacin de Visual Basic 2005 sobre los delegados:
"Un delegado es una clase que puede contener una referencia a un mtodo. A
diferencia de otras clases, los delegados tienen un prototipo (firma) y pueden
guardar referencias nicamente a los mtodos que coinciden con su prototipo."
Esta definicin, al menos en lo que respecta a su relacin con los eventos, viene a
decir que los delegados determinan la forma en que debemos declarar los mtodos
que queramos usar para interceptar un evento.
Por ejemplo, el evento DatosCambiados definido anteriormente, tambin lo
podramos definir de la siguiente forma:
Public Delegate Sub DatosCambiadosEventHandler()

Public Event DatosCambiados As DatosCambiadosEventHandler
Es decir, el mtodo que intercepte este evento debe ser del tipo Sub y no recibir
ningn parmetro.
Si nuestro evento utiliza, por ejemplo, un parmetro de tipo String, la definicin del
delegado quedara de la siguiente forma:
www.detodoprogramacion.com
Public Delegate Sub NombreCambiadoEventHandler(ByVal nuevoNombre As
String)
Y la definicin del evento quedara de esta otra:
Public Event NombreCambiado As NombreCambiadoEventHandler
Como vemos al definir el evento ya no tenemos que indicar si recibe o no algn
parmetro, ya que esa definicin la hemos hecho en el delegado.
Si nos decidimos a definir este evento de la forma "normal" de Visual Basic, lo
haramos as:
Public Event NombreCambiado(ByVal nuevoNombre As String)
Como podemos comprobar, Visual Basic 2005 nos permite definir los eventos de dos
formas distintas: definiendo un delegado y un evento que sea del tipo de ese
delegado o definiendo el evento con los argumentos que debemos usar.
Declaremos como declaremos los eventos, los podemos seguir usando de la misma
forma, tanto para producirlo mediante RaiseEvent como para definir el mtodo que
reciba ese evento.
Utilizar un delegado para acceder a un mtodo
Ahora veamos brevemente cmo usar los delegados, en este caso sin necesidad de
que defina un evento.
Como hemos comentado, un delegado realmente es una clase que puede contener
una referencia a un mtodo, adems define el prototipo del mtodo que podemos
usar como referencia. Sabiendo esto, podemos declarar una variable del tipo del
delegado y por medio de esa variable acceder al mtodo que indiquemos, siempre
que ese mtodo tenga la misma "firma" que el delegado. Parece complicado verdad?
Y no solo lo parece, es que realmente lo es. Comprobemos esta "complicacin" por
medio de un ejemplo. En este cdigo, que iremos mostrando poco a poco, vamos a
definir un delegado, un mtodo con la misma firma para que podamos usarlo desde
una variable definida con el mismo tipo del delegado.
Definimos un delegado de tipo Sub que recibe un valor de tipo cadena:
Delegate Sub Saludo(ByVal nombre As String)
Definimos un mtodo con la misma firma del delegado:
Private Sub mostrarSaludo(ByVal elNombre As String)
Console.WriteLine("Hola, " & elNombre)
End Sub
www.detodoprogramacion.com
Ahora vamos a declarar una variable para que acceda a ese mtodo.
Para ello debemos declararla con el mismo tipo del delegado:
Dim saludando As Saludo
La variable saludando es del mismo tipo que el delegado Saludo. La cuestin es
cmo o que asignamos a esta variable?
Primer intento:
Como hemos comentado, los delegados realmente son clases, por tanto podemos
usar New Saludo y, segn parece, deberamos pasarle un nombre como argumento.
Algo as:
saludando = New Saludo("Pepe")
Pero esto no funciona, entre otras cosas, porque hemos comentado que un delegado
contiene (o puede contener) una referencia a un mtodo, y "Pepe" no es un mtodo
ni una referencia a un mtodo.
Segundo intento:
Por lgica y, sobre todo, por sentido comn, mxime cuando hemos declarado un
mtodo con la misma "firma" que el delegado, deberamos pensar que lo que
debemos pasar a esa variable es el mtodo, ya que un delegado puede contener una
referencia a un mtodo.
saludando = New Saludo(mostrarSaludo)
Esto tampoco funciona, seguramente porque le falta el parmetro?
saludando = New Saludo(mostrarSaludo("Pepe"))
Pues tampoco.
Para usar un delegado debemos indicarle la direccin de memoria de un mtodo, a
eso se refiere la definicin que vimos antes, una referencia a un mtodo no es ni ms
ni menos que la direccin de memoria de ese mtodo. Y en Visual Basic, desde la
versin 5.0, tenemos una instruccin para obtener la direccin de memoria de
cualquier mtodo: AddressOf.
Por tanto, para indicarle al delegado dnde est ese mtodo tendremos que usar
cualquiera de estas dos formas:
saludando = New Saludo(AddressOf mostrarSaludo)
Es decir, le pasamos al constructor la direccin de memoria del mtodo que queremos
"asociar" al delegado.
En Visual Basic esa misma asignacin la podemos simplificar de esta forma:
www.detodoprogramacion.com
saludando = AddressOf mostrarSaludo
Ya que el compilador "sabe" que saludando es una variable de tipo delegado y lo que
esa variable puede contener es una referencia a un mtodo que tenga la misma firma
que la definicin del delegado, en nuestro caso, que sea de tipo Sub y reciba una
cadena.
Si queremos, tambin podemos declarar la variable y asignarle directamente el
mtodo al que har referencia:
Dim saludando As New Saludo(AddressOf mostrarSaludo)
Y ahora... cmo podemos usar esa variable?
La variable saludando realmente est apuntando a un mtodo y ese mtodo recibe un
valor de tipo cadena, por tanto si queremos llamar a ese mtodo (para que se ejecute
el cdigo que contiene), tendremos que indicarle el valor del argumento, sabiendo
esto, la llamada podra ser de esta forma:
saludando("Pepe")
Y efectivamente, as se mostrara por la consola el saludo (Hola) y el valor indicado
como argumento.
Realmente lo que hacemos con esa llamada es acceder al mtodo al que apunta la
variable y como ese mtodo recibe un argumento, debemos pasrselo, en cuanto lo
hacemos, el runtime de .NET se encarga de localizar el mtodo y pasarle el
argumento, de forma que se ejecute de la misma forma que si lo llamsemos
directamente:
mostrarSaludo("Pepe")
Con la diferencia de que la variable "saludando" no tiene porqu saber a qu mtodo
est llamando, y lo ms importante, no sabe dnde est definido ese mtodo, solo
sabe que el mtodo recibe un parmetro de tipo cadena y aparte de esa informacin,
no tiene porqu saber nada ms.
As es como funcionan los eventos, un evento solo tiene la direccin de memoria de
un mtodo, ese mtodo recibe los mismos parmetros que los definidos por el evento
(realmente por el delegado), cuando producimos el evento con RaiseEvent es como si
llamramos a cada uno de los mtodos que se han ido agregando al delegado, si es
que se ha agregado alguno, ya que en caso de que no haya ningn mtodo asociado
a ese evento, ste no se producir, por la sencilla razn de que no habr ningn
cdigo al que llamar.
Realmente es complicado y, salvo que lo necesitemos para casos especiales, no ser
muy habitual que usemos los delegados de esta forma, aunque no est de ms
saberlo, sobre todo si de as comprendemos mejor cmo funcionan los eventos.
www.detodoprogramacion.com

Ver video de esta leccin (Delegados)









































www.detodoprogramacion.com


Definir un evento bien informado
Para terminar con esta leccin sobre los eventos y los delegados, vamos a ver otra
forma de definir un evento. Esta es exclusiva de Visual Basic 2005 y por medio de
esta declaracin, tal como indicamos en el ttulo de la seccin, tendremos mayor
informacin sobre cmo se declara el evento, cmo se destruye e incluso cmo se
produce, es lo que la documentacin de Visual Basic llama evento personalizado
(Custom Event).
Cuando declaramos un evento usando la instruccin Custom estamos definiendo tres
bloques de cdigo que nos permite interceptar el momento en que se produce
cualquiera de las tres acciones posibles con un evento:
1. Cuando se "liga" el evento con un mtodo, ya sea por medio de AddHandler o
mediante Handles
2. Cuando se desliga el evento de un mtodo, por medio de RemoveHandler
3. Cuando se produce el evento, al llamar a RaiseEvent
Para declarar este tipo de evento, siempre debemos hacerlo por medio de un
delegado.
Veamos un ejemplo de una declaracin de un evento usando Custom Event:
Public Delegate Sub ApellidosCambiadosEventHandler(ByVal nuevo As
String)

www.detodoprogramacion.com
Public Custom Event ApellidosCambiados As
ApellidosCambiadosEventHandler
AddHandler(ByVal value As ApellidosCambiadosEventHandler)
' este bloque se ejecutar cada vez que asignemos un mtodo
al evento
End AddHandler

RemoveHandler(ByVal value As ApellidosCambiadosEventHandler)
' este bloque se ejecutar cuando se desligue el evento de
un mtodo
End RemoveHandler

RaiseEvent(ByVal nuevo As String)
' este bloque se ejecutar cada vez que se produzca el
evento
End RaiseEvent
End Event
Como podemos apreciar, debemos definir un delegado con la "firma" del mtodo a
usar con el evento. Despus definimos el evento por medio de las instrucciones
Custom Event, utilizando el mismo formato que al definir un evento con un delegado.
Dentro de la definicin tenemos tres bloques, cada uno de los cuales realizar la
accin que ya hemos indicado en la lista numerada.
Nota:
Los eventos Custom Event solamente podemos definirlos e interceptarlos
en el mismo ensamblado.











www.detodoprogramacion.com


Introduccin
Esta es la definicin que nos da la ayuda de Visual Basic sobre lo que es un atributo.
"Los atributos son etiquetas descriptivas que proporcionan informacin adicional
sobre elementos de programacin como tipos, campos, mtodos y propiedades.
Otras aplicaciones, como el compilador de Visual Basic, pueden hacer referencia
a la informacin adicional en atributos para determinar cmo pueden utilizarse
estos elementos."
En esta leccin veremos algunos ejemplos de cmo usarlos en nuestras propias
aplicaciones y, aunque sea de forma general, cmo usar y aplicar algunos de los
atributos definidos en el propio .NET Framework, al menos los que ms directamente
nos pueden interesar a los desarrolladores de Visual Basic.
Atributos
Atributos
o Tipos de atributos que podemos usar en una aplicacin
Atributos globales a la aplicacin
Atributos particulares a las clases o miembros de las clases
o Atributos personalizados
Acceder a los atributos personalizados en tiempo de ejecucin
o Atributos especficos de Visual Basic
o Marcar ciertos miembros de una clase como obsoletos


www.detodoprogramacion.com


Atributos
Como hemos comentado en la introduccin, los atributos son etiquetas que podemos
aplicar a nuestro cdigo para que el compilador y, por extensin, el propio .NET
Framework los pueda usar para realizar ciertas tareas o para obtener informacin
extra sobre nuestro cdigo.
De hecho en cualquier aplicacin que creemos con Visual Basic 2005 estaremos
tratando con atributos, aunque nosotros no nos enteremos, ya que el propio
compilador los utiliza para generar los metadatos del ensamblado, es decir, la
informacin sobre todo lo que contiene el ejecutable o librera que hemos creado con
Visual Basic 2005.
Por otra parte, el uso de los atributos nos sirve para ofrecer cierta funcionalidad extra
a nuestro cdigo, por ejemplo, cuando creamos nuestros propios controles, mediante
atributos podemos indicarle al diseador de formularios si debe mostrar ciertos
miembros del control en la ventana de propiedades, etc.
Tipos de atributos que podemos usar en una aplicacin
Como hemos comentado, existen atributos que son globales a toda la aplicacin y
otros que podremos aplicar a elementos particulares, como una clase o un mtodo.
Atributos globales a la aplicacin
Estos se indican usando Assembly: en el atributo y los podremos usar en cualquier
parte de nuestro cdigo, aunque lo habitual es usarlos en el fichero AssemblyInfo.vb.
www.detodoprogramacion.com
Nota:
La palabra o instruccin Assembly: lo que indica es que el atributo tiene
un mbito de ensamblado.
Estos los vamos a usar poco o nada en una aplicacin Web.
Atributos particulares a las clases o miembros de las clases
Estos atributos solo se aplican a la clase o al miembro de la clase que creamos
conveniente, el formato es parecido a los atributos globales, ya que se utilizan los
signos de menor y mayor para encerrarlo, con la diferencia de que en este tipo de
atributos no debemos usar Assembly:, ya que esta instruccin indica que el atributo
es a nivel del ensamblado.
Cuando aplicamos un atributo "particular", este debe estar en la misma lnea del
elemento al que se aplica, aunque si queremos darle mayor legibilidad al cdigo
podemos usar un guin bajo para que el cdigo contine en otra lnea:
<Microsoft.VisualBasic.HideModuleName()> _
Module MyResources

Atributos personalizados
Adems de los atributos que ya estn predefinidos en el propio .NET o Visual Basic,
podemos crear nuestros propios atributos, de forma que en tiempo de ejecucin
podamos acceder a ellos mediante las clases del espacio de nombres Reflection. Este
tema se sale un poco de la intencin de este curso, pero simplemente indicaremos
que los atributos personalizados son clases que se derivan de la clase
System.Attribute y que podemos definir las propiedades que creamos conveniente
utilizar en ese atributo para indicar cierta informacin a la que podemos acceder en
tiempo de ejecucin.
En el siguiente cdigo tenemos la declaracin de una clase que se utilizar como
atributo personalizado, notamos que, por definicin las clases para usarlas como
atributos deben terminar con la palabra Attribute despus del nombre "real" de la
clase, que como veremos en el cdigo que utiliza ese atributo, esa "extensin" al
nombre de la clase no se utiliza.
Veamos primero el cdigo del atributo personalizado:
<AttributeUsage(AttributeTargets.All)> _
Public Class AutorAttribute
Inherits System.Attribute
'
www.detodoprogramacion.com
Private _ModificadoPor As String
Private _Version As String
Private _Fecha As String
'
Public Property ModificadoPor() As String
Get
Return _ModificadoPor
End Get
Set(ByVal value As String)
_ModificadoPor = value
End Set
End Property
'
Public Property Version() As String
Get
Return _Version
End Get
Set(ByVal value As String)
_Version = value
End Set
End Property
'
Public Property Fecha() As String
Get
Return _Fecha
End Get
Set(ByVal value As String)
_Fecha = value
End Set
www.detodoprogramacion.com
End Property
End Class
Para usar este atributo lo podemos hacer de la siguiente forma:
<Autor(ModificadoPor:="Guillermo 'guille'", _
Version:="1.0.0.0", Fecha:="13/Abr/2005")> _
Public Class PruebaAtributos


Nota:
Cuando utilizamos el atributo, en el constructor que de forma
predeterminada crea Visual Basic, los parmetros se indican por el orden
alfabtico de las propiedades, pero que nosotros podemos alterar
usando directamente los nombres de las propiedades, tal como podemos
ver en el cdigo de ejemplo anterior.

Acceder a los atributos personalizados en tiempo de ejecucin
Para acceder a los atributos personalizados podemos hacer algo como esto,
(suponiendo que tenemos la clase AutorAttribute y una clase llamada PruebaAtributos
a la que hemos aplicado ese atributo personalizado):
Sub Main()
Dim tipo As Type
tipo = GetType(PruebaAtributos)

Dim atributos() As Attribute
atributos = Attribute.GetCustomAttributes(tipo)

For Each atr As Attribute In atributos
If TypeOf atr Is AutorAttribute Then
Dim aut As AutorAttribute
aut = CType(atr, AutorAttribute)
www.detodoprogramacion.com
Console.WriteLine("Modificado por: " &
aut.ModificadoPor)
Console.WriteLine("Fecha: " & aut.Fecha)
Console.WriteLine("Versin: " & aut.Version)
End If
Next

End Sub

Atributos especficos de Visual Basic
Visual Basic utiliza una serie de atributos para indicar ciertas caractersticas de
nuestro cdigo, en particular son tres:
COMClassAttribute
o Este atributo se utiliza para simplificar la creacin de componentes COM
desde Visual Basic.
VBFixedStringAttribute
o Este atributo se utiliza para crear cadenas de longitud fija en Visual Basic
2005. Habitualmente se aplica a campos o miembros de una estructura,
principalmente cuando queremos acceder al API de Windows o cuando
queremos usar esa estructura para guardar informacin en un fichero,
pero utilizando una cantidad fija de caracteres.
VBFixedArrayAttribute
o Este atributo, al igual que el anterior, lo podremos usar para declarar
arrays de tamao fijo, al menos si las declaramos en una estructura, ya
que por defecto, los arrays de Visual Basic son de tamao variable.

Marcar ciertos miembros de una clase como obsoletos
En ocasiones nos encontraremos con que escribimos cierto cdigo que posteriormente
no queremos que se utilice, por ejemplo porque hemos creado una versin
optimizada.
Si ese cdigo lo hemos declarado en una interfaz, no deberamos eliminarlo de ella,
ya que as romperamos el contrato contrado por las clases que implementan esa
interfaz. En estos casos nos puede venir muy bien el uso del atributo <Obsolete>,
ya que as podemos informar al usuario de que ese atributo no debera ser usado. En
el constructor de este atributo podemos indicar la cadena que se mostrar al usuario.
En el siguiente cdigo se declara un mtodo con el atributo Obsolete:
Public Interface IPruebaObsoleto
www.detodoprogramacion.com
<Obsolete("Este mtodo ya est obsoleto, utiliza el mtodo
Mostrar")> _
Sub MostrarNombre()
Sub Mostrar()
End Interface
Si trabajamos con el IDE de Visual Basic, ese mensaje se mostrar al compilar o
utilizar los atributos marcados como obsoletos, tal como podemos apreciar en la
Figura 2.05.05:


Figura 2.05.01 Mensaje de que un mtodo est obsoleto














www.detodoprogramacion.com


Contenido
En este mdulo aprenderemos todo lo fundamental acerca del desarrollo de
aplicaciones Web con ASP.NET 2.0, y en concreto mediante el uso de Visual Studio
2005.
Al terminar el mdulo estars preparado para trabajar en el entorno y crear
aplicaciones Web sin enlace a datos (esto se aprender ms adelante, en el mdulo
correspondiente).
Leccin 1: Introduccin al desarrollo con ASP.NET 2.0
o Las pginas ASPX
o El entorno de desarrollo: Visual Studio 2005
o Trabajo con formularios y controles Web
Leccin 2: Los controles de ASP.NET
o Controles HTML
o Controles Web
o Controles de validacin
Leccin 3: Los controles de usuario
o Introduccin
o Definicin de la funcionalidad pblica
o Uso de los controles de usuario
o Carga dinmica de controles de usuari
Leccin 4: Tcnicas de trabajo y consejos varios
o Navegacin entre pginas
o Envo de datos entre pginas
o Transferir el control entre pginas
o Reutilizacin de cdigo en una aplicacin
www.detodoprogramacion.com


Introduccin al desarrollo con ASP.NET 2.0
Ms que una evolucin sobre ASP, ASP.NET es una autntica revolucin en el mundo
del desarrollo Web, y no slo en el mbito relacionado con Microsoft. Lo que mejor
define al desarrollo combinado con ASP.NET 2.0 y Visual Studio es que ha equiparado
la creacin de aplicaciones para Internet a lo que era comn en entornos de
escritorio, salvando las inherentes dificultades que ello conlleva de forma transparente
al programador.
Los programadores de ASP.NET disponen de todo lo que "siempre" han disfrutado los
programadores de Windows: diseadores visuales, asistencia avanzada contextual,
cdigo compilado de alto rendimiento, transparencia acerca de dnde se ejecuta cada
parte del cdigo, enlace a datos, rejillas, etc...
Las pginas ASPX
o Pginas ASPX
o Ms cdigo
o Estupendo, pero... en qu hemos mejorado?
El entorno de desarrollo: Visual Studio 2005
o Visual Studio 2005
o Explorando el entorno
o Explorador de soluciones
o rea de documentos
o Cuadro de herramientas
o Editor de propiedades
o Barras de herramientas y mens
Trabajo con formularios Web y controles
o Trabajo con formularios web
o Creando la interfaz del ejemplo
o Respondiendo al evento del botn
www.detodoprogramacion.com
Pero... Cmo funciona esto por debajo?
El archivo .aspx de interfaz de usuario
El archivo .vb de lgica de la aplicacin
El nexo entre interfaz y lgica























www.detodoprogramacion.com


Las pginas ASPX
Si nos vamos a lo fundamental es posible crear una pgina ASP.NET usando el bloc de
notas y sin saber nada de la plataforma .NET y de sus diferentes espacios de nombre.
Las pginas de servidor de ASP.NET son en esencia archivos de texto que contienen
HTML y etiquetas y que tienen una extensin '.aspx'. Por ello se les denomina de
modo genrico pginas ASPX.
Al igual que las pginas ASP clsicas soportan el uso de etiquetas <% %> para
delimitar bloques de cdigo. De hecho, por compatibilidad, se puede usar en gran
medida todo lo que conocemos de ASP 3.0, lo cual no quiere decir que sea lo ms
recomendable. Sin embargo para familiarizarnos haremos un ejemplo sencillo.

www.detodoprogramacion.com

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y
ms Gratis para el Conocimiento...!
www.detodoprogramas.com
Vistanos y comprubalo



Material para los amantes de la Programacin Java,
C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,
CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas
www.detodoprogramacion.com
Visitanos

Libros Universitarios, Contabilidad, Matemticas, obras literarias,
Administracin, ingeniera y mas

Figura 3.1.1.- Pgina ASPX sencilla
El cdigo de la figura no se distingue de una pgina ASP clsica salvo por la extensin
del archivo (.aspx en lugar de .asp). Sin embargo si navegamos hasta esta pgina
(ubicada en el raz de nuestro servidor IIS) veremos que el resultado es el que
esperbamos:

Figura 3.1.2.- Resultado del cdigo anterior
De todos modos, aunque no podamos percibirla, ya existe una sustancial diferencia
con una pgina ASP: el pequeo fragmento de cdigo que hemos incluido se ha
compilado antes de ejecutarlo, en lugar de haberse interpretado como en ASP.
Obviamente en este caso no ofrece ventaja alguna, pero es importante conocer esta
caracterstica pues nuestras aplicaciones obtendrn un mayor rendimiento por el mero
hecho de ser ASP.NET.
Ms cdigo
Siguiendo con el ejemplo vamos a aadir un poco ms de cdigo para comprobar
hasta que punto son compatibles las pginas ASPX con el cdigo ASP.
Si lo modificamos para que tenga el siguiente aspecto:

www.detodoprogramacion.com
Figura 3.1.3.- Ms cdigo aadido a la pgina ASPX
Ahora durante la carga (o la recarga) de la pgina verificamos si se le est pasando
un parmetro por POST, en cuyo caso sustituimos la caja de texto por un saludo al
nombre que se le est pasando:

Figura 3.1.4.- Resultado de la ejecucin.
Estupendo, pero... en qu hemos mejorado?
Este ejemplo nos ha servido para ver qu ASPX sigue siendo compatible en cierta
medida con ASP, y que slo por este hecho ya mejoraremos la escalabilidad de las
pginas. De todos modos el cambio de la extensin del archivo slo funcionar en las
pginas ms sencillas. En cdigo no trivial tenemos una probabilidad tendente a 1 de
que no haya esa suerte.
Adems, aunque as fuera, no habramos ganado demasiado: seguiramos con cdigo
de cliente y de servidor entremezclado y difcil de mantener y no tendramos ninguna
de las ventajas que hemos mencionado antes.
Si bien podemos escribir cdigo ASP.NET de la manera correcta slo con el bloc de
notas, la mejor forma de desarrollar pginas Web con ASP.NET es usando Visual
Studio 2005, que como veremos enseguida nos ofrece una forma visual de trabajo
junto con una separacin estricta entre el cdigo y la interfaz de usuario, que es lo
que pretendamos.

Ver vdeo de esta leccin (cdigo compilado)







www.detodoprogramacion.com


El entorno de desarrollo: Visual Studio 2005
Visual Studio 2005 es el entorno de desarrollo de aplicaciones Web para la versin 2.0
de la plataforma .NET. Ofrece todo tipo de herramientas para facilitar el trabajo del
programador: diseadores grficos de pginas y clases, asistentes de uso de bases de
datos, un servidor web de desarrollo, ayuda a la escritura de cdigo, y en general
todo lo que se espera de un entorno de desarrollo rpido moderno y mucho ms
todava.
Para crear un nuevo proyecto ASP.NET utilice el men ArchivoNuevoSitio Web. Al
hacerlo aparecer un dilogo como el de la figura:
www.detodoprogramacion.com

Figura 3.1.5.- El dilogo de nuevo proyecto web.
Nota:
Las plantillas disponibles en el dilogo de nuevo proyecto web puede
diferir dependiendo de la versin de Visual Studio 2005 que utilice. Por
simplicidad se muestra el dilogo de la versin Visual Web Developer
Express, el ms simple.
En l tenemos la oportunidad de elegir qu tipo de proyecto vamos a crear (por
defecto un sitio web de ASP.NET), en qu ubicacin fsica queremos crearlo (lo
normal ser en nuestro disco duro pero podramos elegir un sitio gestionado por FTP o
HTTP) y con qu lenguaje de programacin.
Existen diferentes lenguajes que nos sirven para crear el cdigo de nuestras pginas.
Dado que en la prctica todos tienen las mismas capacidades escoger uno u otro es
una cuestin de eleccin personal. Dado que este curso est orientado
fundamentalmente a programadores que vienen de ASP o VB6, vamos a elegir Visual
Basic 2005 como lenguaje de todos nuestros ejemplos. En cualquier caso todo lo
explicado para ste es perfectamente vlido para los otros lenguajes y le servir igual
si se decide por ellos.
Explorando el entorno
Tras crear un proyecto nuevo, el entorno tiene un aspecto similar a este:
www.detodoprogramacion.com

Figura 3.1.6.- El entorno de desarrollo de Visual Studio 2005 tras crear un
proyecto.
Antes de aprender a manejar Visual Studio 2005 vamos a ponernos en situacin
conociendo los distintos elementos que forman parte del entorno.
Explorador de soluciones
Este elemento contiene un rbol con los proyectos
en los que estamos trabajando y los diferentes
archivos y carpetas que forman parte de ellos.
Nada ms crear un nuevo proyecto Web slo existe
una carpeta llamada App_Data, y una pgina ASPX
creada de forma predeterminada que est vaca y
es con la que comenzaremos a trabajar.
Los botones de la parte superior se usan para
realizar diversas acciones sobre el elemento que
tengamos seleccionado. Por ejemplo en el caso de
la pgina podemos abrir su diseo o su cdigo
presionando respectivamente el tercer y cuarto
botones por la derecha.
www.detodoprogramacion.com
rea de documentos

Figura 3.1.7.- rea de documentos mostrando un editor de HTML.
Es la zona situada en el centro del entorno de desarrollo. Contiene los diferentes
editores de cdigo as como diseadores de diversos tipos (de interfaz de usuario, de
clases, de DataSets...). Es en donde pasaremos la mayor parte del tiempo
trabajando.
Cuadro de herramientas

www.detodoprogramacion.com
Figura 3.1.8.- Cuadro de herramientas y detalle de un algunos grupos de
ste.
El cuadro de herramientas contiene los diferentes elementos que podemos utilizar
para la definicin de la interfaz de usuario de nuestra aplicacin, as como algunos
otros componentes no visuales que tambin se pueden arrastrar hacia el diseador
visual de pginas Web. Est situado por defecto en el lateral izquierdo del entorno.
Editor de propiedades
Al igual que en Visual Basic 6.0, Frontpage y otros entornos, el
editor de propiedades nos permite ajustar los valores de las
propiedades en tiempo de diseo de los objetos que hayamos
seleccionados.
Este editor sirve para ajustar las propiedades de todos los
objetos que podamos utilizar en el entorno: tanto de los
controles que se arrastran sobre un diseador como de los
propios archivos del explorador de soluciones y las etiquetas
HTML o XML, etc...
Algunas propiedades se editan directamente en el espacio
disponible y otras lanzan un asistente o un diseador que nos
ayuda con la tarea.
Se pueden ver las propiedades ordenadas alfabticamente o
bien agrupadas en diferentes categoras (opcin por defecto).
Adems de las propiedades tambin se pueden ajustar los
gestores de eventos de los objetos usando el penltimo botn
por la derecha. En la parte inferior se obtiene una concisa ayuda
sobre cada propiedad seleccionada.
Barras de herramientas y mens

Se sitan en la parte superior y dan acceso al resto de las caractersticas de la
herramienta de trabajo. Segn el contexto en el que nos encontremos las barras de
herramientas que veremos sern distintas. Visual Studio se encarga de mostrar y
ocultar la ingente cantidad de barras disponibles mostrando en cada caso slo las que
necesitemos. Esto racionaliza el acceso a los elementos de la interfaz que de otro
modo seran inmanejables.

Ver vdeo de esta leccin (El entorno de desarrollo)
www.detodoprogramacion.com



Trabajo con formularios Web y controles
El entorno de trabajo que hemos explorado es muy intuitivo y fcil de utilizar. En la
mayor parte de los casos vamos a hacer uso nicamente de los tres diseadores que
hemos visto en el vdeo de la leccin anterior: diseador visual de formularios Web,
diseador de HTML y editor de cdigo de VB.NET.
Creemos un ejemplo sencillo desde cero para ver cmo se trabaja. Luego
estudiaremos la estructura de los archivos generados para comprender su
funcionamiento. El ejemplo es el mismo que hemos creado en la primera leccin del
mdulo pero utilizando el modo de programar de ASP.NET y no el cdigo "espaguetti"
tpico de ASP clsico que hemos utilizado antes.
Trabajo con formularios Web y controles
o Creando la interfaz grfica del ejemplo
Respondiendo al evento del botn
o Pero... Cmo funciona esto por debajo?
o Los archivos de cdigo
El archivo .aspx de interfaz de usuario
El archivo .vb de lgica de la aplicacin
El nexo entre interfaz y lgica



www.detodoprogramacion.com



Creando la interfaz grfica del ejemplo
Desde Visual Studio cree un nuevo proyecto de sitio Web. Abra el diseador de la
pgina por defecto que se crea (Default.aspx) haciendo doble click sobre ella. Aada
un control de tipo etiqueta (Label) en la parte superior y establezca su propiedad
Text con el valor "Bienvenido a ASP.NET! ", eligiendo un tipo de letra de tamao
grande y color rojo.
Justo debajo agregue un control TextBox, y establezca su propiedad ID como
"Nombre", Width como 200px y MaxLength ajstela a 40.
A continuacin introduzca un botn (Button) y asgnele el texto "Saludar" (propiedad
Text) y otrguele el nombre de "cmdSaludar".
Por fin aada una etiqueta ms con el nombre lblSaludar, y ajuste su propiedad
Visible a False para que no se vea en el formulario web una vez que lo ejecutemos.
Cuando acabe el aspecto del formulario debera ser muy similar a ste:
www.detodoprogramacion.com

Figura 3.1.9.- Aspecto del ejemplo tras haber aadido los controles.
Nota:
Si no tiene claro cmo hacerlo vea el primer vdeo de esta leccin al pie
de este documento en donde se desarrolla el ejemplo completo.
Respondiendo al evento del botn
Para saludar al usuario con el nombre que introduzca en el campo de texto debemos
responder a la pulsacin del botn. En ASP clsico tendramos que enviar un
formulario a otra pgina (o a la misma) y ver qu valores no es estn pasando para
actuar en consecuencia. En ASP.NET esto no es necesario ya que trabajaremos segn
el clsico paradigma orientado eventos, respondiendo a las acciones del usuario.
En este caso debemos interceptar la pulsacin del botn por parte del usuario
verdad?. Pues lo nico que tendremos que hacer es escribir un manejador para el
evento Click del botn, algo que resultar familiar e intuitivo a los programadores de
VB6. Para ello haga doble-clic sobre el botn en el diseador. Esto har que se abra el
editor de cdigo y que automticamente aparezca un manejador de eventos para el
evento Click, que es el predeterminado de los botones:

Figura 3.1.10.- Manejador del evento Click generado automticamente por el
editor.
Al igual que en VB6 desde el cdigo del evento (que se ejecutar en el servidor,
atencin!) podemos hacer referencia a cualquier control de la pgina y acceder a sus
mtodos y propiedades. De este modo se puede escribir el siguiente cdigo simple:
www.detodoprogramacion.com

Es decir, se concatena un saludo al nombre introducido en el campo de texto
asignndoselo como texto a mostrar a la etiqueta oculta, y se hace visible sta
usando su propiedad Visible.
Si ejecutamos ahora el ejemplo (presionando F5 o el botn correspondiente en la
barra de herramientas) veremos que funciona sin problemas:

Figura 3.1.11.- Nuestro ejemplo antes y despus de presionar el botn.
Ntese que no hemos aadido formulario alguno, ni tampoco JavaScript, y que en
realidad para nosotros es transparente el modo en como se gestionan los eventos e
incluso que lo que estamos creando sea una aplicacin Web. No hemos usado HTML y
(hasta cierto punto) nos da igual que el cdigo se ejecute en el servidor o en el
cliente.

Ver vdeo 1 de esta leccin (Creacin y ejecucin del ejemplo)
Ver vdeo 2 de esta leccin (Pequeas mejoras del ejemplo)


www.detodoprogramacion.com


Pero... Cmo funciona esto por debajo?
Si echamos un vistazo al cdigo de la pgina generada veremos que, aparte del HTML
que es ms o menos obvio que debera haber dados los controles que hemos
utilizado, existe tambin bastantes lneas de cdigo JavaScript y algunos campos
ocultos.
Los campos ocultos se utilizan para almacenar informacin sobre la pgina y el cdigo
JavaScript se ocupa de su mantenimiento y de enviar el formulario al servidor ante
determinadas acciones del usuario (simulando los eventos).
Uno de los campos ocultos ms importantes es el que se refiere al ViewState.

Figura 3.1.12.- Viewstate de una pgina sencilla.
El ViewState - que se podra traducir como "Estado de Visualizacin" - recoge de
manera automtica el estado y el contenido de los controles de una pgina. Esta
informacin se utiliza para dejarlos como estaban en cada recarga de la pgina.
Cuando presionamos el botn de nuestro ejemplo la pgina se recarga y todo lo que
contiene debe estar igual que antes de hacerlo o no podramos asimilarlo a un
formulario. A excepcin de una pequea demora por el viaje de ida y vuelta al
servidor, para el usuario no debe haber sensacin de recarga de la pgina. El
ViewState se encarga de ello.
Nota:
A cada viaje de ida y vuelta de nuestra pgina al servidor como
www.detodoprogramacion.com
consecuencia de un evento en el cliente se le denomina PostBack. Se
puede averiguar si la carga actual de la pgina es la primera o se trata
de un PostBack consultando el valor booleano de la propiedad
IsPostBack de la pgina (Me.IsPostback).
Como se aprecia en la figura se trata de informacin sobre la jerarqua de controles
de la pgina codificada para su envo al servidor. Al recibirla, la clase Page de la que
hereda nuestra pgina se encarga de decodificarlo, procesarlo e inicializar de nuevo el
estado de cada control segn la informacin facilitada, sin necesidad de trabajo por
nuestra parte.
Por otra parte, para determinar qu evento se ha producido, se emplean tambin dos
campos ocultos y un poco de JavaScript:

Figura 3.1.13.- Campos ocultos de informacin sobre eventos

Figura 3.1.14.- JavaScript asociado a la notificacin de eventos al servidor.
Cuando se efecta alguna accin el JavaScript de la pgina se encarga de rellenar
estos campos y provocar un PostBack de la pgina. El evento es detectado en el
servidor a travs de estos campos ocultos y se gestiona adecuadamente por ASP.NET,
que se encarga de notificar los eventos.
Los mecanismos de ViewState y de PostBack son los responsables de que, a efectos
prcticos, podamos trabajar en la Web utilizando el paradigma de programacin
orientada a eventos.
Imagnate tener que gestionar eso t mismo con cdigo propio!


www.detodoprogramacion.com


Los archivos de cdigo
Centremos nuevamente nuestra atencin en los archivos de cdigo de servidor que
tenemos en Visual Studio 2005. Existen dos: uno que define la interfaz de usuario y
otro para la lgica de la aplicacin. Veamos cmo estn formados y cul es el nexo de
unin entre ellos.
El archivo .aspx de interfaz de usuario.
En realidad todo el cdigo se ejecuta en el servidor y, por poco intuitivo que sea para
un programador Web tradicional, el evento desencadenado por la pulsacin se
gestiona en el servidor, no en el cliente. Veamos cmo funciona.
Para crear la interfaz de usuario slo hemos tenido que arrastrar controles Web desde
el cuadro de herramientas al diseador. Por detrs lo que ha estado ocurriendo es que
el cdigo HTML de la pgina ha estado creciendo hasta ser como el siguiente:
www.detodoprogramacion.com

Figura 3.1.15.- Cdigo HTML de la interfaz de usuario ASPX.
Vemos que, sin que conscientemente lo hayamos hecho, se ha creado un formulario
(Form1) que al carecer de un atributo ACTION se enviar a si mismo. Este formulario
(y otros elementos tienen asignado el atributo runat="server". ste se usa para
indicar que son controles de servidor y que, como tales, debern estar disponibles
para el cdigo que se ejecuta en el servidor, como por ejemplo nuestro manejador del
evento.
Nota:
En las pginas ASPX slo se recomienda el uso de un formulario, que es
adems el formulario que incluye automticamente el entorno de
desarrollo. Lo cierto es que no se trata de limitacin alguna puesto que
la filosofa de desarrollo es completamente distinta a la tradicional y no
los vamos a necesitar.
El resto de elementos que aparecen son etiquetas HTML normales (p.ej<br/> para
cambio de lnea) y unas etiquetas especiales que llevan el prefijo asp:. Este prefijo
indica que son controles web de ASP.NET, y como tales son objetos de las clases
contenidas en el espacio de nombres System.Web.UI.WebControls. Al compilar la
pgina ASP.NET instancia dichas clases y las pone a disposicin de nuestro cdigo
pasando todo ello inadvertido para nosotros.
El archivo .vb de lgica de la aplicacin
Por otro lado existe un archivo con extensin .vb, dependiente, segn el explorador
de proyectos, del archivo .aspx anterior.
www.detodoprogramacion.com

Figura 3.1.16.- Archivo .vb de lgica de la aplicacin
ste contiene la "lgica" de la aplicacin, es decir, lo que hace que una interfaz de
usuario se comporte de un determinado modo. En nuestro caso contiene el manejador
del evento con lo que deseamos que ocurra al presionar el botn. En una aplicacin
real podra contener multitud de cosas ms.
Nota:
Aunque es muy tentador abusar de la capacidad de crecimiento de estos
archivos de cdigo, suele ser mucho ms recomendable repartir toda
aquella funcionalidad que no se refiera a la interfaz de usuario (es decir,
lo que no sean eventos normalmente) en otros archivos y clases
desligados de pginas aspx. Veremos cmo hacerlo en breve en este
curso.
Desde este archivo de cdigo podemos responder a cualquier evento de los controles
de interfaz de usuario o de la propia pgina, y acceder a sus mtodos y propiedades.
Gracias a la existencia de estos dos archivos podemos independizar el aspecto de la
aplicacin (la interfaz) de lo que queremos hacer con ella. De hecho incluso se podra
programar con dos equipos distintos, cada uno encargado de una cosa. Esta
constituye tambin una de las grandes ventajas de ASP.NET.
En dnde se encuentra el nexo entre interfaz y lgica?
Tras esta pregunta tan aparentemente filosfica se encuentra una respuesta muy
sencilla: la directiva de pgina @Page y la existencia de clases parciales en .NET
2.0.
Si nos fijamos en el cdigo de la pgina ASPX de la figura anterior, la primera lnea es
una directiva @Page con diversos atributos.
AutoEventWireUp: indica si los eventos se deben generar de forma
automtica o no. A los efectos de este curso no hablaremos ms de l.
CodeFile: este atributo es especfico de Visual Studio y le indica cul es el
archivo de cdigo (.vb) que contiene la definicin de la lgica de la pgina.
www.detodoprogramacion.com
Inherits: indica de qu clase heredar la clase auto-generada por ASP.NET
para gestionar los contenidos de la pgina ASPX actual (repase el primer vdeo
de este mdulo acerca de cdigo compilado).
Nota:
Inherits es un atributo nuevo en ASP.NET 2.0 y modifica el modelo
utilizado en Visual Studio 2002 y 2003 para crear cdigo de lgica de
negocio para las pginas, denominado 'code-behind'. Si has trabajado
algo con estas versiones anteriores te sorprender ver este cambio y lo
mucho que con l se reduce el cdigo necesario para crear las pginas
ASPX, ya que no hay que declarar los controles ni inicializarlos en el
cdigo de lgica.
Si ahora os fijamos en el cdigo de lgica de la pgina (figura 3.1.10 anterior),
veremos que se define parcialmente una clase _Default. Y este es el nexo de unin
entre ambos archivos.
Cuando ASP.NET genera la pgina primero completa automticamente el cdigo de la
clase _Default con otra implementacin parcial de sta en la que se definen los
controles de la pgina (el cdigo que ha desaparecido respecto a las versiones
anteriores del entorno). Luego define una nueva clase especfica para la pgina que
hereda de _Default y es en ella donde inicializa los controles y hace el nexo entre la
interfaz y la lgica. Es por este motivo que ahora los manejadores de eventos de la
clase se declaran con accesibilidad protected, para que puedan utilizarse desde la
clase derivada.
Nota:
A esta novedosa forma de separar (y al mismo tiempo unir en tiempo de
ejecucin) la interfaz de la lgica hay quien la denomina "code-
beside", como homenaje al hasta ahora utilizado "code-behind" de
ASP.NET 1.x.
Nota:
Todo lo explicado es muy fcil de verificar si se accede a la carpeta
temporal de ASP.NET tal y como se demostr en el primer vdeo de este
mdulo. En l encontraremos los archivos de cdigo autogenerados por
.NET en los que podremos comprobar lnea por lnea todo lo que he
comentado. Se trata de una iniciativa muy didctica.






www.detodoprogramacion.com


Los controles de ASP.NET
ASP.NET ofrece una gran cantidad de controles que se pueden usar en los desarrollos
de aplicaciones Web. Durante la leccin anterior hemos podido ver algunos de ellos en
funcionamiento mientras que supimos de la existencia de otros al verlos en el cuadro
de herramientas.
En esta leccin vamos a conocer desde un punto de vista general los tipos de
controles existentes y aprenderemos, con ms detalle, la utilizacin unos controles
muy tiles: los controles de validacin.
Controles HTML
o Controles HTML
o Jerarqua de controles HTML
Controles Web
o Controles Web
o Adaptacin al navegador
o Jerarqua de controles Web
o Controles propios
Controles de validacin
o Controles Web de validacin
o Uso de los controles de validacin
o Validadores personalizados
o Colocar el foco en el error


www.detodoprogramacion.com


Los controles HTML
Hasta ahora hemos visto lo sencillo que resulta
trabajar con controles de servidor arrastrndolos y
soltndolos en los formularios Web. Los controles
que hemos utilizado se definen usando una sintaxis
especial (<asp:...>) y como hemos podido
comprobar responden a un comportamiento
complejo.
Antes de ASP.NET cuando necesitbamos usar un
control en una pgina emplebamos alguno de los
definidos en HTML: controles de tipo <input>,
<textarea> o <img> entre otros. Con ASP.NET
disponemos tambin de la posibilidad de usarlos.
Desde el cuadro de herramientas disponemos del
grupo HTML (ver figura adjunta) que son controles
equivalentes a los de HTML.
Podemos arrastrarlos y soltarlos sobre nuestro
formulario al igual que los otros, pero al contrario
que stos no se ejecutarn por defecto en el servidor. Slo aparecer su sintaxis
HTML pura y dura.
Se trata de controles muy tiles en determinadas ocasiones en las que no
necesitamos todas las ventajas que nos ofrecen los controles de servidor, por
ejemplo:
www.detodoprogramacion.com
No vamos a acceder a sus mtodos y propiedades desde el servidor.
Quiz no necesitamos que mantengan su estado o respondan a evento alguno.
El uso del campo oculto ViewState puede cargar la pgina en exceso si hay muchos
controles, por no mencionar que hay que crear clases en el servidor que los
representen cuando se procesa la pgina. Todo ello reduce la respuesta de la pgina.
Por supuesto podemos convertirlos en controles de servidor simplemente asignando
su atributo runat, as:
<input id="Button1" type="button" value="button" runat="server" />
Como vemos es un botn corriente de HTML al que se la ha aadido el atributo runat.
Slo con esto hemos conseguido que el control est disponible desde nuestro cdigo
de servidor (como en el ejemplo) y disfrutaremos de todas las cualidades conocidas:
acceso a sus propiedades y mtodos, conservacin del estado, etc...
En el rea de diseo del formulario es muy fcil distinguir los controles de servidor de
los HTML porque los primeros tienen un pequeo tringulo verde que los marca. En la
siguiente figura todos los controles se ejecutan en el servidor excepto el botn
"button" de la derecha.

Figura 3.2.1.- Distincin entre Controles de servidor y HTML
Los controles HTML, en cualquier caso, son mucho ms sencillos que los otros
controles Web. Tienen menos propiedades y eventos, los cuales se suelen
corresponder adems con los mismos que tienen en HTML+Javascript. Son ms
adecuados cuando no requerimos una gran flexibilidad y queremos cargar la pgina lo
mnimo posible.
Esta figura ilustra la jerarqua de los controles HTML en ASP.NET:
www.detodoprogramacion.com

Figura 3.2.2.- Jerarqua de los controles HTML
Todos ellos, obviamente, heredan de la clase Object, pero tambin heredan de la
clase base HtmlControl que est contenida en el espacio de nombres
System.Web.UI.Control.
Sus propiedades se corresponden con los atributos HTML del control correspondiente,
por lo que la nomenclatura utilizada no es consistente con la utilizada en el resto de la
plataforma ASP.NET.

Ver vdeo de esta leccin (controles HTML)








www.detodoprogramacion.com


Los controles Web
Son controles nativos de ASP.NET. Aunque algunos parecen asimilables a controles
HTML, todos van mucho ms all en cuanto a caractersticas y capacidades. De hecho,
aunque algunos son relativamente sencillos (como una etiqueta, un botn o un cuadro
de texto), existen controles muy complejos que sera difcil recrear desde cero con
HTML y JavaScript. Por ejemplo el control calendario, las rejillas de datos, los
controles maestro-detalle, validadores, etc...
Sus mtodos y propiedades tienen nombres consistentes con el resto de la
plataforma. Por ejemplo, para fijar el texto de un botn o de una etiqueta se usa la
misma propiedad Text. Para establecer el color de fondo todos usan BackColor. Esto
hace que sea ms fcil el desarrollo porque no hay que memorizar nomenclaturas
diferentes para cada control.
Adaptacin automtica al cliente
Los controles Web que vienen con ASP.NET tienen otra caracterstica que los hace
nicos y es la adaptacin automtica al navegador. ASP.NET detecta con qu cliente
se est accediendo (un navegador moderno o antiguo, un PDA, Internet Explorer o
Netscape, etc...) y de forma autnoma adapta el cdigo que muestra a las
capacidades y restricciones concretas del navegador utilizado.
Esta adaptacin tiene en cuenta el soporte de HTML y JavaScript, pero tambin
cuestiones como si se deben usar etiquetas bsicas en lugar de hojas de estilo CSS
para el aspecto.
En esta nueva versin 2.0 de ASP.NET va un paso ms all permitiendo la adaptacin
automtica de los controles a diferentes navegadores y dispositivos incluso mviles
www.detodoprogramacion.com
(telfonos y PDA de cualquier marca). A esta caracterstica se la conoce como
renderizacin adaptativa.

Figura 3.2.3.- Renderizacin adaptativa: un mismo calendario en un
navegador y visto desde un mvil WAP.
La renderizacin adaptativa tiene implicaciones importantes ya que (hasta cierto
punto) no hay que tener en cuenta de antemano si un desarrollo ser para un
navegador concreto o incluso para dispositivos mviles basados en WAP. Por otra
parte, y tal vez ms importante, est el hecho de que no hay que aprender todo un
conjunto diferente de habilidades para poder programar para dispositivos mviles.
Podemos reutilizar lo que estamos aprendiendo en este curso!.
La siguiente figura muestra la jerarqua de algunos controles Web de servidor
incluidos con ASP.NET 2.0:
www.detodoprogramacion.com

Figura 3.2.4.- Jerarqua de controles Web de servidor.
Controles de terceras empresas
Aparte de los controles que vienen con ASP.NET 2.0 tambin es posible utilizar desde
nuestras aplicaciones cualquier otro control Web diseado por terceras empresas.
Existen infinidad de ellos de todos los tipos, algunos realmente potentes.

Figura 3.2.5.- Algunos ejemplos de controles Web de terceras empresas.
www.detodoprogramacion.com
En www.asp.net/controlgallery/ podr encontrar un extenso catlogo clasificado de
controles Web de servidor.
Controles propios
Como no podra ser de otra manera, ASP.NET no nos limitar a la hora de crear
controles propios para reutilizar funcionalidad en nuestras aplicaciones o incluso para
venderlos a otras empresas.
Existen dos tipos de controles que podremos crear:
Controles Web: son controles como los que hemos visto hasta ahora y
equiparables en todos sus aspectos a los controles nativos de ASP.NET 2.0.
Controles de usuario: permiten la reutilizacin de partes completas de la
interfaz de usuario y de la lgica asociada a sta, aunque el soporte para
configurarlos en tiempo de diseo es mucho ms reducido que en el caso de los
anteriores. Sin embargo son muy fciles de crear y ofrecen un mtodo sencillo
de encapsular funcionalidades que incluyan interfaz de usuario.
La creacin de controles Web (primer tipo) es una cuestin compleja que se sale del
mbito de este curso, por lo que no los estudiaremos. Sin embargo en la siguiente
leccin veremos la forma de crear nuestros propios controles de usuario.
Investigue por su cuenta la funcionalidad de algunos de los controles disponibles en
ASP.NET. Es la mejor forma de aprender. Descubrir que la mayora son muy fciles
de utilizar y sus propiedades y mtodos son de uso sencillo. Deje de momento los
enlazados a datos pues sern objeto de un mdulo posterior y suelen tener ms
complicacin.

Ver vdeo de esta leccin (Adaptacin al navegador)









www.detodoprogramacion.com


Controles Web de validacin
Dentro de la pltora de controles de ASP.NET existe un grupo "Validacin" que, como
es fcil imaginarse, contiene una serie de controles que permiten realizar de manera
cmoda la validacin de datos introducidos por los usuarios.
Lo habitual en las aplicaciones Web es realizar una
doble validacin. Por un lado se suele implementar
una primera validacin en el cliente (es decir, en
el navegador de los usuarios) utilizando para ello
cdigo JavaScript. Esto permite una primera barrera
que no implica el envo de datos innecesarios al
servidor. Como principales desventajas de usar
JavaScript para la validacin se encuentran la de ser
cdigo tedioso de escribir y, sobre todo, que es muy
fcil evitarla. Bastara con que un usuario no tuviese
JavaScript habilitado para que no funcionara en
absoluto.
Por otra parte tambin se suele realizar una segunda comprobacin en el servidor.
En aras de la seguridad, como mxima de cualquier desarrollo deberamos tomar
siempre la siguiente: "Jams deber fiarme de nada que me llegue de un origen fuera
de mi control". En este caso aunque hayamos habilitado una primera validacin en el
cliente con Javascript no debemos fiarnos en absoluto de que sta se haya realizado.
Por ello debemos validar todos los datos siempre en el servidor. Si hay que quitar una
validacin que sea siempre la del cliente.
Esta doble validacin suele ser bastante engorrosa y supone un esfuerzo de desarrollo
adicional que sera estupendo poder obviar. Pensando en facilitarnos este tipo de
tareas ASP.NET nos ofrece los controles de validacin.
www.detodoprogramacion.com
Estos controles permiten definir reglas de validacin en la entrada de datos. Dichas
reglas se asocian con otros controles que forman parte del formulario web, y se
combinan entre ellos para especificar mltiples restricciones sobre los datos
introducidos.
Las condiciones tpicas son, por ejemplo, que un campo no se puede quedar vaco,
que tiene que estar comprendido dentro de un rango determinado o incluso que debe
cumplir con una expresin regular que indiquemos. Por supuesto es posible tambin
definir reglas propias personalizadas.
La principal ventaja de estos controles es que permiten la definicin de reglas de
validacin de forma declarativa, es decir, no hace falta escribir cdigo para usarlos.
Ello facilita mucho el desarrollo y el mantenimiento de las reglas de validacin.
Una vez que definamos las reglas para un formulario los controles de validacin se
encargan automticamente de validarlas tanto en el cliente como en el servidor.
En el lado cliente se convertirn en cdigo JavaScript muy parecido al que nosotros
usaramos, actuando de primera barrera y evitando viajes innecesarios al servidor.
Las comprobaciones del lado del servidor nos evitan problemas cuando, por el motivo
que sea, no han actuado las validaciones en el cliente.
Nota:
Se puede desactivar la validacin en el lado del cliente de un control
estableciendo su propiedad EnableClientScript a False. Podemos
deshabilitar la validacin del lado cliente de todos los controles
estableciendo la propiedad ClientTarget de la pgina actual con la
cadena "DownLevel" desde el evento de carga de la pgina. Con ello slo
se realizar la validacin en el servidor.
Uso de los controles de validacin
Para hacer uso de uno de estos tiles controles basta con arrastrarlos al formulario.
Veremos que al hacerlo se muestran como si fueran etiquetas normales, aunque con
el texto de color rojo. Este es el aspecto que tendrn si se hace necesaria su
actuacin. Mientras no se produce una situacin en la que la validacin fracasa sern
invisibles. Toda esta funcionalidad se consigue utilizando JavaScript, es decir, que no
se enva nada al servidor (no se hace un post-back).
Cada control de validacin que arrastremos se debe asociar al control del que deber
"estar pendiente". Por supuesto es posible arrastrar varios validadores y asociarlos a
un mismo control para as verificar varias condiciones. Lo contrario no es cierto, es
decir, no se puede usar un solo validador para verificar varios controles. El control a
verificar se asigna mediante la propiedad ControlToValidate del control de
validacin.
Aunque su utilidad es bastante intuitiva, la siguiente tabla indica el uso apropiado de
cada uno de los controles disponibles:
Control Utilidad
RequiredFiledValidator Verifica que el control asociado no
www.detodoprogramacion.com
se encuentra vaco.
RangeValidator Genera un mensaje de error
cuando el contenido de su control
asociado est fuera de un rango
de valores dado. Permite validar
intervalos numricos (enteros o
decimales o monedas), fechas y
cadenas de texto.
RegularExpressionValidator Compara un texto introducido por
el usuario con una expresin
regular.
CompareValidator Permite comparar el valor
introducido por el usuario con una
constante o con el valor de la
propiedad de otro control.
CustomValidator Se usa para implementar lgica
de validacin propia tanto en el
cliente como en el servidor.
Tabla 3.2.1.- Controles de validacin y su utilidad.
El control ValidationSummary (abajo de todo en el grupo de controles de la figura
anterior) se usa para mostrar un resumen de todo lo que est mal en un formulario
en lugar de mostrar cada uno de los mensajes de error individualmente.
No todos los controles se pueden validar con los controles de validacin. De hecho
slo un pequeo subconjunto de todos los controles Web son adecuados para un uso
conjunto. En cualquier caso los incluidos cubren la mayor parte de las necesidades
normales de introduccin de datos, y son los siguientes:
Control Tipo Propiedad
HtmlinputText Entrada de texto Value
HtmlTextArea Entrada de texto Value
TextBox Entrada de texto Text
HtmlSelect Lista de seleccin Value
ListBox Lista de seleccin SelectedItem.Value
DropDownList Lista de seleccin SelectedItem.Value
RadioButtonList Botones de seleccin SelectedItem.Value
HtmlInputFile Envo de archivos Value
Figura 3.2.2.- Controles que se pueden validar y las propiedades que se
validan en ellos.
Aparte de mostrar la informacin de error al usuario, en los eventos de la pgina
gestionados en el servidor podemos comprobar el valor de la propiedad IsValid del
objeto Page. sta ser False si alguno de los controles de validacin ubicados en la
pgina no ha pasado la prueba de verificacin. Esto es muy til para realizar acciones
complementarias en el servidor en caso de haber errores.
www.detodoprogramacion.com
Sabiendo todo esto es fcil utilizar cualquiera de los controles de este tipo. Consulte el
vdeo de esta leccin para ver una prctica de uso.
Validadores personalizados
Tal vez el validador que necesite ms explicacin es el CustomValidator. Como su
propio nombre indica se usa para crear normas de validacin propias que no se
adapten a ninguna de las contempladas con los dems controles. Para conseguirlo se
definen funciones de validacin en el cliente y en el servidor.
Las funciones de validacin en el cliente se escriben en JavaScript o en VBScript y
se asocian con el control mediante la propiedad ClientValidationFunction. la
funcin definida puede tener cualquier nombre pero debe tomar dos argumentos, as:
function miValidador(origen, argumentos)
{
}
El primer argumento, origen, obtiene una referencia al control de validacin (un
elemento <span></span> de HTML que contiene el mensaje a mostrar) que nos
permite mostrarlo u ocultarlo o cambiar el contenido del mensaje. El segundo
argumento es ms importante puesto que se trata de un objeto con dos propiedades:
Value y IsValid. La primera contiene el valor a validar que est extrado del control
asignado en la propiedad ControlToValidate. La segunda se usa para indicar si la
validacin ha tenido xito o no.
Por ejemplo, para validar que el nmero introducido en un control es impar,
arrastraramos un control CustomValidator al formulario Web, asignaramos su
propiedad ControlToValidate para que apunte a un campo de texto, y estableceramos
la propiedad ClientValidationFunction con el valor "ValidaImpar" que es el nombre de
la funcin JavaScript. A continuacin incluiramos en la cabecera de la pgina un
fragmento de JavaScript como este:
<script language="javascript">
function ValidaImpar(origen, args)
{
if (args.Value % 2 == 0) //Si es divisible entre 2 es par
args.IsValid = false;
else
args.IsValid = true;
}
</script>
www.detodoprogramacion.com
Ahora todava falta la validacin en el servidor que de hecho es la ms importante.
Su funcionamiento es igual de sencillo. Hay que gestionar el evento ServerValidate
del control CustomValidator. Este evento obtiene argumentos del tipo
ServerValidateEventArgs que son funcionalmente equivalentes a los que acabamos
de ver en el caso del cliente, es decir, disponen de las propiedades Value e IsValid.
Para rematar nuestro ejemplo con la validacin en el servidor slo es necesario
escribir el siguiente cdigo VB.NET:

Como se puede observar es funcionalmente idntico al cdigo que escribimos para el
cliente en JavaScript.
Nota:
Este control de validacin personalizada ya exista en versiones
anteriores de ASP.NET. En stas el evento de validacin no se notificaba
cuando el control a validar estaba vaco. Para conservar la
compatibilidad el control CustomValidator de ASP.NET 2.0 trabaja de la
misma manera. Sin embargo es posible forzar la validacin incluso con el
campo vaco si establecemos la propiedad ValidateEmptyText del
CustomValidator a True.
Colocar el foco en el error
Otra accin muy comn a la hora de validar datos en un formulario es colocar el foco
sobre el control que contiene informacin errnea. De este modo se facilita al usuario
la introduccin del nuevo valor pues no tiene que activar el control con el ratn.
Podemos hacer que los controles de validacin hagan esto por nosotros con slo
establecer a True su propiedad SetFocusOnError. Esta caracterstica es nueva en
ASP.NET 2.0.

Ver vdeo de esta leccin (Uso de los controles de validacin)


www.detodoprogramacion.com


Controles de usuario
Como ya hemos adelantado en la leccin anterior, aparte de la compleja creacin de
controles Web personalizados del estilo de los que vienen con ASP.NET, existe una
forma rpida y sencilla de reutilizar partes completas de funcionalidad e interfaz de
usuario. Para ello no es necesario tener profundos conocimientos de la plataforma
.NET. Ni siquiera hacen falta conocimientos de HTML. Se trata de los controles de
usuario.
En esta leccin veremos qu son, cmo se crean y cmo se utilizan.
Controles de usuario
o Introduccin
o Definicin de la funcionalidad pblica
o Uso de los controles de usuario
o Carga dinmica de controles de usuario






www.detodoprogramacion.com


Controles de usuario
Los controles de usuario son tan fciles de crear que, de hecho, ya conoce casi todo lo
que necesita para construirlos. Se crean exactamente igual que los formularios Web y
disponen de un diseador visual idntico que permite arrastrar otros controles sobre
su superficie. De hecho cualquier formulario Web (pgina ASPX) puede transformarse
directamente en un control reutilizable con slo unos pocos cambios de sintaxis.
Para aadir un nuevo control de usuario pulse con el botn secundario sobre el nodo
raz del proyecto en el explorador de soluciones y escoja la opcin "Agregar
elemento...". En el dilogo que aparece (ya sobradamente conocido) seleccione el
icono correspondiente a Control de usuario Web, como se ilustra en la siguiente
figura:
www.detodoprogramacion.com

Figura 3.3.1.- Dilogo para aadir un nuevo control de usuario.
Si se fija en la figura detenidamente ver que, salvo por el icono elegido, no hay
diferencia alguna con aadir un nuevo formulario Web. De hecho la nica diferencia
existente en este punto es la extensin que se le otorgar al archivo resultante, que
es .ascx en lugar de .aspx.
El archivo resultante se distingue fcilmente en el
explorador de proyectos porque Visual Studio le
asigna un icono diferente (vea la figura lateral).
Al igual que un formulario Web corriente un
control de usuario dispone de un diseador visual
con doble vista (Diseo y Origen) y de un editor
de cdigo asociado en caso de haber escogido la
separacin de cdigo e interfaz (opcin marcada
en la figura anterior).
Del mismo modo estn disponibles para arrastrar
sobre la superficie de diseo los mismos controles web que en el caso de los
formularios Web.
La primera diferencia con una pgina ASPX la encontramos al ver las etiquetas que
constituyen la parte de interfaz de usuario del control. En los formularios aparece al
principio una directiva <%@Page %>, pero en los controles la directiva se llama
<%@Control %> si bien se usa de un modo muy similar:
www.detodoprogramacion.com

Figura 3.3.2.- Cdigo origen de un control de usuario sobre el que se han
arrastrado tres controles Web.
Otra diferencia fundamental de un control con una pgina es que hereda de la clase
UserControl y no de Page. Sin embargo ambas clases base heredan a su vez de la
clase TemplateControl, por lo que conservan multitud de caractersticas en comn.

Figura 3.3.3.- Cdigo de la clase code-beside de un control de usuario. en el
que se ve que sta hereda de UserControl .
De hecho la similitud es tal que el entorno de desarrollo le asigna al manejador del
evento Load del control el nombre Page_Load (en lugar de, por ejemplo,
UserControl_Load) como se observa en la figura.
Definicin de la funcionalidad pblica del control de usuario
Todo a partir de ahora es exactamente igual que en el caso de los formularios Web.
Podemos arrastrar cualquier control Web desde el cuadro de herramientas sobre la
superficie del control, asignar sus propiedades y recibir post-backs que generan
eventos en los controles que hemos incluido.
Por supuesto, como en esencia un control de usuario no es ms que una clase de
.NET, podemos extenderla aadindole nuestros propios mtodos y propiedades.
Todos los miembros pblicos que agreguemos estarn disponibles desde la pgina
que albergue al control del mismo modo que lo estn las propiedades y mtodos de
cualquier control Web normal. Esto es muy til para encapsular el acceso a ciertas
funcionalidades que hayamos incluido.
www.detodoprogramacion.com
Por supuesto los controles que coloquemos en la superficie del control se vern
adecuadamente en la pgina que lo contenga y se comportarn del modo esperado,
esto es, recibiendo eventos, conservando su estado en el ViewState, etc...
Uso de los controles de usuario
Ahora que ya sabemos crear controles de usuario veamos la forma de usarlos desde
los formularios Web.
El modo ms sencillo de incluir un control de usuario en una pgina ASPX es
simplemente arrastrndolo desde el explorador de proyectos sobre su superficie de
diseo. Esto har que se visualice el control completo dentro de la pgina:

Figura 3.3.4.- Control de usuario arrastrado sobre la superficie de un
formulario Web (los puntos rojos se usan para destacarlo, no estaban en la imagen original).
Nota:
Visual Studio 2005 ofrece un mayor soporte en tiempo de diseo para
los controles de usuario que permite ver el contenido del control y
ajustar sus propiedades desde el explorador de propiedades. En
versiones anteriores de Visual Studio .NET lo nico que se vea de estos
controles era un cuadro de color gris con su nombre y eran por tanto
ms difcil trabajar con ellos y encajarlos en un diseo general.
Cuando observamos el cdigo de la pgina ASPX desde la que estamos utilizando el
control de usuario, vemos que al principio de sta se ha incluido una directiva
Register:

Quiz el atributo ms importante de esta directiva sea el ltimo, TagPrefix. El valor
asignado a l ser el que se utilice para distinguir de manera nica un control de
usuario dentro de la pgina. De este modo se pueden utilizar sin problemas controles
de usuario con el mismo nombre en una misma pgina. As, segn la lnea anterior
podramos definir en la pgina un control del tipo Micontrol usando una sintaxis como
esta:

www.detodoprogramacion.com
Las propiedades que hayamos definido para la clase Micontrol se pueden establecer
mediante atributos (al igual que ID en la lnea anterior, por ejemplo) siempre que se
trate de tipos simples.
Podemos modificar la directiva Register para incluir un prefijo que nos guste ms o
sea ms descriptivo que el que Visual Studio ha puesto por defecto.
Carga dinmica de controles de usuario
Otro modo de hacer uso de los controles de usuario es cargarlos dinmicamente
segn los necesitemos. El mtodo LoadControl de la clase Page o del formulario de
la pgina es el que nos va a ayudar a conseguirlo. Slo hay que pasarle como
argumento el nombre del archivo ASCX que contiene la definicin del control de
usuario, de modo similar a este:
Dim c As Control
c = Me.LoadControl("Micontrol.ascx")
Me.Form.Controls.Add(c)
En lugar de usar un tipo genrico (Control) como en este fragmento tambin podemos
usarlo como el verdadero tipo del control y as llamar a sus mtodos y propiedades
antes de aadirlo al formulario:
Dim c As Control
Dim miC As Micontrol
c = Me.LoadControl("Micontrol.ascx")
miC = CType(c, Micontrol)
miC.ValorInicial = "Bienvenido a esta pgina"
Me.Form.Controls.Add(miC)
En este ejemplo hemos usado el control con su verdadero tipo para poder asignar la
propiedad ValorInicial antes de agregarlo a la pgina.

Ver vdeo 1 de esta leccin (controles de usuario)
Ver vdeo 2 de esta leccin (ampliando la capacidad bsica de los
controles de usuario)



www.detodoprogramacion.com


Tcnicas de trabajo y consejos varios
Para finalizar con este intenso mdulo de fundamentos de las aplicaciones ASP.NET
vamos a comentar algunas tcnicas de trabajo comunes que le sern de ayuda en su
quehacer diario.
Tcnicas de trabajo y consejos varios
o Navegacin entre pginas
o Envo de datos entre pginas
o Transferir el control entre pginas
o Reutilizacin de cdigo en una aplicacin









www.detodoprogramacion.com


Tcnicas de trabajo y consejos varios
Navegacin entre pginas
Antes de nada me parece necesario comentar que en las aplicaciones ASP.NET se
utilizan seguramente muchas menos pginas que en el caso de que la misma
aplicacin estuviese escrita con ASP clsico. Esto se debe a que, gracias a los post-
back y los correspondientes eventos de servidor se encapsula ms la funcionalidad en
un slo archivo. Por ejemplo en una aplicacin ASP 3.0 clsica para recoger los datos
de un usuario con mucha probabilidad escribiramos dos (o incluso tres o cuatro)
pginas: la pgina HTML con el formulario, la pgina ASP a la que se envan los datos
del formulario y puede que una pgina o dos para informar al usuario del xito o del
fracaso de su accin. En ASP.NET todo esto se resolvera con una sola pgina ASPX,
un evento de servidor y probablemente mostrando y ocultando controles Web desde
dicho evento.
Por supuesto una aplicacin estar formada de todos modos por un nmero ms o
menos elevado de pginas a las que se debe dirigir al usuario. Existen diversas
maneras de dirigir a un usuario hacia otra pgina o recurso de la aplicacin.
La primera de ellas, y la ms sencilla, consiste en utilizar controles del tipo
HyperLink que tiene este aspecto en el cuadro de herramientas: .
Estableciendo su propiedad NavigateUrl estaremos indicando a qu pgina queremos
enviar al usuario cuando pulse sobre el enlace resultante. Si la pgina es una de las
que pertenecen a nuestra aplicacin ser muy fcil seleccionarla gracias al dilogo
especial que aparece para ello:
www.detodoprogramacion.com

Figura 3.4.1.- Dilogo de seleccin de pginas de nuestra aplicacin.
Adems si ajustamos la propiedad Text de este control ese ser el texto que se
muestre para el enlace de la pgina. Es posible utilizar un grfico en lugar de texto
para el enlace si se utiliza la propiedad ImageUrl.
Nota:
Existen controles especializados en crear rboles de navegacin en una
pgina pero por debajo usan enlaces como stos. Los estudiaremos en
un prximo mdulo.
La otra manera de enviar a los usuarios a una pgina propia o ajena consiste en hacer
uso del mtodo Redirect de la clase HttpResponse del contexto de llamada de la
pgina. As podremos controlar desde un evento de servidor a dnde enviaremos al
usuario. Por ejemplo, si queremos enviarlo a una pgina diferente segn lo que haya
escogido en un control de seleccin podramos escribir algo similar a esto en el evento
de pulsacin de un botn:
If opciones.ListIndex = 0 Then
Response.Redirect("opcion1.aspx")
Else
Response.Redirect("opcion2.aspx")
End If
El mtodo Redirect enva al navegador del usuario una cabecera especial de
redireccin que le indica que, en lugar de descargar los contenidos de la pgina
www.detodoprogramacion.com
actual, debe solicitar una nueva. Esto provoca una nueva peticin de pgina desde el
navegador por lo que no es la forma de navegacin de mayor rendimiento (hay el
doble de viajes al servidor que en un enlace directo). Sin embargo dota de gran
flexibilidad a la hora de decidir qu hacer ante la solicitud de pgina de un usuario o
para redirigir al final de un proceso ejecutado en el servidor.
Envo de datos entre pginas
Como hemos visto el comportamiento normal durante la pulsacin de un botn u otro
evento de controles servidor es el de realizar un post-back a la pgina actual. Sin
embargo puede haber ocasiones en las que, por el motivo que sea, se necesita
realizar ese envo de datos a otra pgina diferente, pero eso s, conservando el acceso
a todos los controles y datos de la pgina original (que como sabemos estn
contenidos en el ViewState).
ASP.NET 2.0 ha aadido una nueva funcionalidad denominada Cross Page Posting,
que permite precisamente esto. Para conseguirlo lo nico que hay que hacer es
ajustar la propiedad PostBackUrl del control cuyos eventos queremos gestionar
desde otra pgina asignndole la ruta virtual de sta ltima.
Los datos se reciben en la otra pgina pero todava tenemos acceso a los datos de la
pgina original a travs de la propiedad PreviousPage de la nueva. Se trata de un
objeto Page reconstruido a partir del ViewState recibido. Si la usamos as, de modo
genrico, tendremos que utilizar el mtodo FindControl de la clase Page para
localizar cualquier control que hubiese en la pgina original. Por supuesto si ambas
pginas pertenecen al mismo espacio de nombres (o lo hemos declarado) podemos
forzar el uso de la pgina como la clase original de sta usando CType y acceder
directamente a sus mtodos, propiedades y controles.
Tambin es posible determinar desde una pgina si los datos que est recibiendo son
de su propio Post-back o pertenece a otra pgina mediante la propiedad
IsCrossPagePostBack, que es muy similar a la propiedad IsPostBack que ya hemos
estudiado.
Esta tcnica es de un uso poco frecuente pero se trata de una novedad poco conocida
que me ha parecido interesante incluir aqu.
Transferir el control entre pginas
A veces puede ser til procesar el cdigo de una pgina y justo despus transferir el
control a otra pgina ejecutando tambin su cdigo. El mtodo Transfer de la clase
HttpServer ejecuta dinmicamente el cdigo de una pgina desde otra cualquiera.
La forma de hacerlo es la siguiente:
Server.Transfer("otrapagina.aspx")
Al contrario que el uso de Redirect, Server.Transfer no cambia la URL que el usuario
ve en su navegador ya que desde fuera no se observa ninguna variacin en la pgina
ejecutada. Es una ejecucin en el servidor, sin redireccin en el cliente.
www.detodoprogramacion.com
Este mtodo es anlogo al del mismo nombre en ASP clsico, si bien en ASP.NET su
utilidad es menor puesto que, como veremos, existen maneras mucho mejores y ms
recomendables de reutilizar cdigo de uso comn en las pginas.
Reutilizacin de cdigo en una aplicacin
A menudo, al escribir una aplicacin, tenemos necesidades similares en diversas
partes de sta. Por ello sera absurdo escribir una y otra vez el mismo cdigo dentro
de los manejadores, al cargar una pgina y dems eventos. Lo mejor es encapsular el
cdigo en diversos mtodos y llamar a stos cuando sea necesario. Todo esto sonar
de perogrullo a cualquier programador experimentado.
En ASP clsico, por ejemplo, se solan agrupar las funciones de uso comn dentro de
archivos de inclusin que luego se utilizaban en las diferentes pginas gracias a una
directiva <!-- #include -->. Si bien esto constitua una manera bsica de reutilizar
cdigo no ofreca la flexibilidad de un lenguaje capaz de crear bibliotecas de objetos y
mtodos.
En .NET es posible crear nuevas clases que encapsulen funcionalidades comunes y
que sean reutilizables en cualquier punto de la aplicacin. En ASP.NET 2.0 existen una
serie de carpetas con nombres especiales que cuelgan de la carpeta principal de la
aplicacin y que llevan asociado un comportamiento especial. Una de estas carpetas
es 'App_Code'. Bsicamente, todo el cdigo que se coloque bajo esta carpeta
se compila de manera automtica.
Tal y como hemos estudiado anteriormente, cuando se solicita una pgina sta se
compila de manera automtica junto con su archivo de "code-beside" de forma que, a
medida que se accede a las diferentes partes de una aplicacin se va compilando por
completo. Dadas las caractersticas de Visual Studio, el cdigo residente en archivos
que no sean pginas o clases parciales de "code-beside" no se compila ya que jams
navegamos por l ni se referencia desde otras pginas. La excepcin a esta regla es el
cdigo que coloquemos en la carpeta App_Code que se compila automticamente al
comenzar la aplicacin.
Por ello, una buena forma de reutilizar cdigo entre pginas es agregar clases
especializadas a la carpeta App_Code. De hecho si presionamos con el botn
secundario sobre el proyecto en el explorador de soluciones y agregamos un nuevo
elemento de tipo Clase se nos mostrar una advertencia diciendo, grosso modo, que
debemos aadirla a App_Code si queremos que funcione. Incluso se crea
automticamente la carpeta si no lo hemos hecho ya con anterioridad:

Figura 3.4.2.- Advertencia para colocar cdigo en App_Code.
Incluso si intentamos agregar un nuevo elemento a la carpeta App_Code slo se nos
ofrecer la posibilidad de incluir nuevas clases, archivos de texto (para comentarios,
www.detodoprogramacion.com
por ejemplo) o DataSets. Estos ltimos son DataSets tipados que no dejan de ser
clases con un diseador asociado como veremos en el siguiente mdulo.
Una vez creadas nuevas clases en estas carpeta podemos aadirle mtodos,
propiedades y campos para dotarlas de la funcionalidad que requiramos. Por supuesto
son clases normales de .NET por lo que podremos derivarlas de otras clases para
obtener funcionalidad "gratis", hacer que implementen interfaces o incluirlas dentro
de mdulos o espacios de nombres para ordenarlas.
Si lo que desea es compartir cdigo entre distintas aplicaciones o encapsular
funcionalidad en una librera independiente, puede crear un proyecto de tipo librera
de clases. Este proyecto genera un archivo .DLL que puede compartir entre distintas
aplicaciones. Con esto podr reutilizar sus clases en tantos proyectos como quiera,
incluso en distintos tipos de proyectos como Aplicaciones Web y Aplicaciones
Windows.
Nota:
Si dispone de la versin Visual Web Developer no podr generar
bibliotecas DLL.

Ver vdeo de esta leccin (Reutilizacin de cdigo)













www.detodoprogramacion.com


Contenido
Sin lugar a dudas uno de los mbitos ms importantes de un lenguaje o entorno de
programacin es su capacidad de acceso a datos. Prcticamente todas las aplicaciones
conllevan la realizacin de accesos a datos.
Le gustar saber que la plataforma .NET, y por lo tanto ASP.NET, ofrecen un potente
modelo de acceso a fuentes de datos. Se le conoce con el nombre genrico de
ADO.NET.
Nota:
No se deje engaar por el nombre: ADO.NET no casi nada que ver con el
anterior ADO utilizado en los tiempos de ActiveX y COM. S, dispone de
conexiones, comandos e incluso una clase que recuerda a los Recordset,
pero crame cuando le digo que es mejor que se olvide para siempre de
todos ellos. Tanto la filosofa de trabajo como la tecnologa son
diferentes por completo y es mejor que utilice una estrategia de "ojos
limpios" para acercarse correctamente a la nueva tecnologa.
Los conocimientos adquiridos en este mdulo le servirn para cualquier tipo de
desarrollo con .NET, no slo para aplicaciones Web. Los conceptos explicados son
vlidos tambin para cualquier versin de .NET no slo para la 2.0.
Leccin 1: Introduccin a ADO.NET
o Introduccin
o La capa conectada
o La capa desconectada
o Vinculacin de datos a controles Web
Leccin 2: Acceso a datos manual
www.detodoprogramacion.com
o Escritura manual de cdigo
o DataAdapter: puente entre dos mundos
o Consultas parametrizadas
o Altas bajas y modificaciones
Leccin 3: Acceso a datos con Visual Studio 2005
o Controles de datos
Orgenes de datos
Controles enlazados
Concurrencia optimista
Uso de los controles enlazados en la prctica
o DataSets tipados



















www.detodoprogramacion.com


Introduccin a ADO.NET
Esta leccin presenta los fundamentos de ADO.NET, su arquitectura y sus principales
clases. Una vez que sepamos por donde pisamos pasaremos a estudiar ms a fondo
cada uno de los conceptos analizados aqu.
Leccin 1: Introduccin a ADO.NET
o Introduccin
o La capa conectada
o La capa desconectada
o Vinculacin de datos a controles Web









www.detodoprogramacion.com


Introduccin a ADO.NET
Como cualquier otro modelo de acceso a datos, ADO.NET es un conjunto de clases
relacionadas entre s que estn especializadas en ofrecer toda la funcionalidad que un
programador necesita para realizar acceso a datos y manejarlos una vez los ha
obtenido.
Las clases genricas expuestas por ADO.NET se encuentran bajo el espacio de
nombres System.Data. Este espacio de nombres define clases genricas de acceso a
datos que posteriormente son extendidas para ofrecer caractersticas y funciones
especficas de cada proveedor.
El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos
es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de
datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets
su funcionalidad va mucho ms all como se ver en breve.
Arquitectura de ADO.NET
El concepto ms importante que hay que tener claro sobre ADO.NET es su modo de
funcionar, que se revela claramente al analizar su arquitectura:
www.detodoprogramacion.com

Figura 4.1.- Arquitectura de ADO.NET
Existen dos capas fundamentales dentro de su arquitectura: la capa conectada y la
desconectada.











www.detodoprogramacion.com


La capa conectada
La capa conectada de ADO.NET contiene objetos especializados en la conexin con los
orgenes de datos. As, la clase genrica Connection se utiliza para establecer
conexiones a los orgenes de datos. La clase Command se encarga de enviar
comandos de toda ndole al origen de datos. Por fin la clase DataReader est
especializada en leer los resultados de los comandos.
La clase DataAdapter hace uso de las tres anteriores para actuar de puente entre la
capa conectada y la desconectada como veremos despus.
Estas clases son abstractas, es decir, no tienen una implementacin real de la que se
pueda hacer uso directamente. Es en este punto en donde entran en juego los
proveedores de datos. Cada origen de datos tiene un modo especial de
comunicarse con los programas que los utilizan, adems de otras particularidades que
se deben contemplar. Un proveedor de datos de ADO.NET es una implementacin
concreta de las clases conectadas abstractas que hemos visto, que hereda de stas y
que tiene en cuenta ya todas las particularidades del origen de datos en cuestin.
As, por ejemplo, las clases especficas para acceder a SQL Server se llaman
SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se
encuentran bajo el espacio de nombres System.Data.SqlClient. Es decir, al
contrario que en ADO clsico no hay una nica clase Connection o Command que se
use en cada caso, si no que existen clases especializadas para conectarse y recuperar
informacin de cada tipo de origen de datos.
Nota:
El hecho de utilizar clases concretas para acceso a las fuentes de datos
no significa que no sea posible escribir cdigo independiente del origen
de datos. Todo lo contrario. La plataforma .NET ofrece facilidades de
www.detodoprogramacion.com
escritura de cdigo genrico basadas en el uso de herencia e
implementacin de interfaces. De hecho la versin 2.0 de .NET ofrece
grandes novedades especficamente en este mbito.
Existen proveedores nativos, que son los que se comunican directamente con el
origen de datos (por ejemplo el de SQL Server o el de Oracle), y proveedores
"puente", que se utilizan para acceder a travs de ODBC u OLEDB cuando no existe
un proveedor nativo para un determinado origen de datos.
Nota:
Estos proveedores puente, si bien muy tiles en determinadas
circunstancias, ofrecen un rendimiento menor debido a la capa
intermedia que estn utilizando (ODBC u OLEDB). Un programador novel
puede sentir la tentacin de utilizar siempre el proveedor puente para
OLEDB y as escribir cdigo compatible con diversos gestores de datos
de forma muy sencilla. Se trata de un error y siempre que sea posible es
mejor utilizar un proveedor nativo.
La plataforma .NET proporciona "de serie" los siguientes proveedores de acceso a
datos.
Proveedor Espacio de nombres Descripcin
ODBC .NET Data
Provider
System.Data.Odbc Permite conectar nuestras
aplicaciones a fuentes de
datos a travs de ODBC.
OLE DB .NET
Data Provider
System.Data.OleDb Realiza la conexin
utilizando un proveedor
OLEDB, al igual que el
ADO clsico.
Oracle Client
.NET Data
Provider
System.Data.OracleClient Proveedor de datos para
acceder a Oracle.
SQL Server .NET
Data Provider
System.Data.SqlClient Permite la conexin
optimizada a SQL Server
7.0 o posterior,
incluyenbdo la ltima
versin SQL Server 2005.
Los proveedores de acceso a datos que distribuye Microsoft en ADO.NET y algunos
desarrollados por otras empresas o terceros, contienen los mismos objetos, aunque
los nombres de stos, sus propiedades y mtodos, pueden ser diferentes.
Existen, por supuesto, proveedores para tipos de orgenes de datos de cualquier
gestor de datos existente en el mercado. stos los desarrolla normalmente la empresa
responsable del producto. Si bien stos optimizan el acceso a estos orgenes de datos
nosotros siempre podremos realizarlo mediante ODBC u OLEDB si tenemos necesidad.
En resumen: con la capa conectada de ADO.NET realizamos la conexin y
comunicacin con los orgenes de datos. Cada proveedor de datos implementa su
www.detodoprogramacion.com
propia versin de las clases Connection, Command, DataReader y DataAdapter (entre
otras).
Las clases derivadas de Connection se utilizan para realizar la conexin y enviar
y recibir informacin.
Las clases derivadas de Command permiten ejecutar sentencias SQL y
procedimientos almacenados en el gestor de datos.
Las clases derivadas de DataReader se emplean para obtener los posibles
resultados de un comando utilizando para ello el conducto de comunicacin
establecido por Connection.


Ver vdeo de esta leccin (Las clases de datos conectadas)
















www.detodoprogramacion.com


La capa desconectada
Una vez que ya se han recuperado los datos desde un origen de datos la conexin a
ste ya no es necesaria. Sin embargo sigue siendo necesario trabajar con los datos
obtenidos de una manera flexible. Es aqu cuando la capa de datos desconectada
entra en juego. Adems, en muchas ocasiones es necesario tratar con datos que no
han sido obtenidos desde un origen de datos relacional con el que se requiera una
conexin. A veces nicamente necesitamos un almacn de datos temporal pero que
ofrezca caractersticas avanzadas de gestin y acceso a la informacin.
Por otra parte las conexiones con las bases de datos son uno de los recursos ms
escasos con los que contamos al desarrollar. Su mala utilizacin es la causa ms
frecuente de cuellos de botella en las aplicaciones y de que stas no escalen como es
debido. Esta afirmacin es especialmente importante en las aplicaciones Web en las
que se pueden recibir muchas solicitudes simultneas de cualquier parte del mundo.
Finalmente otro motivo por el que es importante el uso de los datos desconectado de
su origen es la transferencia de informacin entre capas de una aplicacin.
stas pueden encontrarse distribuidas por diferentes equipos, e incluso en diferentes
lugares del mundo gracias a Internet. Por ello es necesario disponer de algn modo
genrico y eficiente de poder transportar los datos entre diferentes lugares, utilizarlos
en cualquiera de ellos y posteriormente tener la capacidad de conciliar los cambios
realizados sobre ellos con el origen de datos del que proceden. Todo esto y mucho
ms es lo que nos otorga el uso de los objetos DataSet, ncleo central de la capa
desconectada de ADO.NET.
Nota:
Otra interesante caractersticas de los DataSet es que permiten
gestionar simultneamente diversas tablas (relaciones) de datos, cada
www.detodoprogramacion.com
una de un origen diferente si es necesario, teniendo en cuenta las
restricciones y las relaciones existentes entre ellas.
Los DataSet, como cualquier otra clase no sellada de .NET, se pueden extender
mediante herencia. Ello facilita una tcnica avanzada que consiste en crear tipos
nuevos de DataSet especializados en la gestin de una informacin concreta (por
ejemplo un conjunto de tablas relacionadas). Estas nuevas tipos clases se denominan
genricamente DataSet Tipados, y permiten el acceso mucho ms cmodo a los
datos que representan, verificando reglas de negocio, y validaciones de tipos de datos
ms estrictas.
Los objetos DataSet no dependen de proveedor de datos alguno y su funcionamiento
es independiente de cmo hayan sido obtenidos los datos que contienen. Este es el
concepto ms importante que debemos recordar.
El proceso general de trabajo de ADO.NET para acceder a un gestor de datos (SQL
Server, por ejemplo) es casi siempre el mismo: se abre una conexin (clase
Connection), se lanza una consulta SQL o procedimiento almacenado mediante un
objeto de la clase Command, y se almacenan en memoria los resultados dentro de un
objeto DataSet, cerrando la conexin.
Nota:
Aunque este es el comportamiento habitual de una aplicacin de datos
existen casos en los que no es recomendable almacenar en memoria (en
un DataSet) todos los resultados de una consulta, bien por ser muchos
registros o por contener datos muy grandes. En este tipo de casos se
puede usar u objeto DataReader directamente para leer la informacin,
tratarla y no almacenarla en lugar alguno. De todos modos lo ms
frecuente es realizar el proceso descrito.
Unin entre capa conectada y desconectada
La clase DataAdapter se ha incluido anteriormente en la capa conectada por que est
implementada por cada proveedor de un modo diferente. En realidad es una clase que
pone sus pies en ambos mundos (conectado y sin conexin) y sirve de nexo entre
ellos.
Un DataAdapter sabe omo manejar correctamente los objetos proporcionados por su
proveedor especfico (fundamentalmente los vistos: Connection, Command y
DataReader) y proporciona mtodos para trasegar informacin desde el servidor a
DataSets desconectados y viceversa haciendo uso de dichos objetos especficos del
proveedor.
As, por ejemplo, el mtodo Fill de un DataSet se utiliza para introducir los resultados
de una consula dentro de un DataSet para luego trabajar con ellos sin preocuparnos
de su origen. Del mismo modo su mtodo Update se utiliza para conciliar
automticamente con el origen de datos los datos modificados en un DataSet
mientras no haba conexin.
www.detodoprogramacion.com
Otras clases dependientes de DataSet
Como hemos dicho antes un DataSet podra asimilarse a un pequeo gestor de datos
en memoria. Como tal un DataSet permite mantener diversas tablas as como las
relaciones entre ellas, incluso forzando que se cumplan restricciones de creacin y
actualizacin, como en una base de datos "real". Para ello se apoya en el uso de otras
clases especializadas que son las siguientes:
DataTable: representa una tabla o relacin de datos. Se puede asimilar a una
tabla de un gestor de datos. Los datos obtenidos de una consulta de tipo
SELECT de SQL se almacenan en un objeto de esta clase.
DataColumn: ofrece informacin sobre cada uno de los campos de los
registros almacenados en un DataTable, como su nombre o su tipo.
DataRow: representa un registro de la tabla virtual definida por el DataTable.
Contiene tantos elementos como campos tiene la tabla, cada uno del tipo
definido por el objeto DataColumn correspondiente.
Constraint: las clases Constraint se emplean para definir resticciones en los
tipos de datos contenidos en un DataTable. Por ejemplo se puede usar un
objeto de esta clase para indicar que un determinado campo debe ser nico o
que se trata de una clave externa que debe ser tenida en cuenta en
actualizaciones o borrados en cascada.
DataRelations: define la relacin existente entre dos objetos DataTable.
Normalmente se suelen utilizar un identificador comn a ambas tablas aunque
pueden ser combinaciones de ms de uno de ellos. De este modo se sabe cmo
obtener informacin de una tabla a partir de informacin en otra. Por ejemplo el
identificador de una factura (su nmero, por ejemplo) puede servir para
relacionar su registro con los registros de detalle de factura que estn
contenidos en otra tabla.
DataView: representa una vista concreta de un DataTable. Normalmente se
trata de ordenaciones o filtros sobre los datos originales. Todas las tablas
disponen de una vista por dfecto (propiedad DefaultView) que ofrece los datos
tal y como se han introducido en sta y es la vista que se usa habitualmente.


Ver vdeo de esta leccin (Un vistazo a un DataSet)








www.detodoprogramacion.com


Vinculacin de datos a controles Web
Otra caracterstica fundamental de ASP.NET que lo convierte en una herramienta
ventajosa para el desarrollo de aplicaciones Web es la capacidad de vincular datos a
controles Web.
La mayor parte de los controles que podemos arrastrar sobre una pgina ASPX se
pueden vincular a los objetos DataSet, DataTable y DataReader o a informaciones
concretas contenidas en stos.
Ello facilita mucho el trabajo con datos desde la interfaz de usuario ya que no hay que
molestarse en generar tablas con ellos, escribir JavaScript o proporcionar complejos
medios propios para permitir su edicin o navegacin si hacemos un uso adecuado de
la vinculacin y los controles disponibles.
Todo ello, gracias a ASP.NET y Visual Studio, equipara en muchos aspectos el
desarrollo Web al clsico desarrollo de aplicaciones de escritorio donde este tipo de
facilidades han estado disponibles desde hace aos. Sin embargo en una aplicacin
Web donde no existe una conexin permanente disponible entre la visualizacin
(navegador) y el lugar en el que se ejecuta el cdigo no es algo fcil de conseguir. El
uso de un modelo consistente como ADO.NET (idntico en Web, escritorio y otros
entornos) junto con las capacidades nativas de ASP.NET para abstraernos de estas
dificultades (ViewState, Postback...) consiguen el "milagro".
En este mdulo veremos tambin lo sencillo que resulta crear interfaces para explotar
los datos desde una pgina Web.


www.detodoprogramacion.com


Acceso a datos manual
Tras haber aprendido un poco de teora sobre ADO.NET a continuacin explicaremos
cmo se utilizan las clases de acceso datos para escribir cdigo de acceso a datos de
manera manual.
Si bien es un tema algo rido y adems en un gran porcentaje de los casos
utilizaremos herramientas que nos faciliten la creacin automtica de cdigo, es
fundamental conocer la forma de trabajar sin ayuda para entender el funcionamiento
real de los objetos de datos.
As que nimo y estudie con detenimiento esta leccin.
Leccin 2: Acceso a datos manual
o Escritura manual de cdigo
o DataAdapter: puente entre dos mundos
o Consultas parametrizadas
o Altas bajas y modificaciones









www.detodoprogramacion.com


Escritura manual de cdigo
En este apartado vamos a analizar cmo es el cdigo necesario para recuperar y
actualizar datos con ADO.NET. Posteriormente veremos como sacar partido a las
facilidades del entorno de desarrollo Visual Studio 2005 para no tener que escribir el
cdigo a mano. Sin embargo es til aprender a hacerlo de esta manera para entender
bien su funcionamiento.
Comandos de seleccin simples
La mayor parte de las consultas que se lanzan contra una base de datos suelen
utilizarse para obtener un conjunto de registros para tratar. Este tipo de consultas
suelen ser expresiones SQL de tipo SELECT. El siguiente fragmento de cdigo muestra
los pasos necesarios para mostrar en una pgina los registros resultantes de una
consulta:
www.detodoprogramacion.com

No se trata de un cdigo optimizado (es ms bien burdo) pero nos ayudar a
entender perfectamente el proceso. Los datos los obtendremos de la conocida base de
datos de ejemplo Northwind (que viene con todas las versiones de SQL Server).
Nota:
Para poder escribir cdigo de acceso a datos en nuestro mdulo
debemos agregar referencias a los espacios de nombres que contienen
las clases que vamos a utilizar. Para ello usamos las dos sentrencias
Imports siguientes:



La primera de ellas agrega las clases genricas de acceso a datos (como
DataSet) y la siguiente las especficas de SQL Server. Si no lo hacemos
recibiremos un error.
Lo primero que se debe hacer es instanciar un objeto que represente la conexin a la
base de datos. Dado que nos estamos conectando a SQL Server esta conexin ser
del tipo SqlConnection. Es lo que se hace en la primera lnea del cdigo anterior. La
conexin debe realizarse con un servidor de datos y un esquema de datos concreto.
Esto se indica mediante la cadena de conexin (al igual que se haca en ADO
tradicional). En este caso la cadena de conexin es la tpica de SQL Server. Cada
gestor de datos tiene la suya y hay que construirla de manera adecuada. El entorno
de desarrollo Visual Studio 2005 nos ayuda a crearlas como veremos luego.
Una vez creado el objeto con el que nos conectaremos hay que definir el comando a
lanzar a la base de datos. Para ello se utiliza un objeto SqlCommand. Las propiedades
bsicas que hay que establecer para ste son la consulta que se lanzar (propiedad
www.detodoprogramacion.com
CommandText) y la conexin que se emplear para lanzarla (propiedad
Connection) que es lo que se refleja en las lneas 6 y 7.
Ahora que ya sabemos cmo nos conectaremos y qu queremos obtener debemos
lanzar la consulta y recoger el resultado de alguna manera.
La clase Command dispone de diversos mtodos para ejecutar consultas:
ExecuteReader: este mtodo lanza la consulta a la base de datos y devuelve
una referencia a una instancia de la clase DataReader (SqlDataReader en el
caso de SQL Server). Podemos utilizar el DataReader para recorrer los datos y
procesarlos.
ExecuteNonQuery: ejecuta la consulta sin devolver resultado alguno.
Simplemente enva la consulta al servidor y devuelve el nmero de registros
afectados por sta. til para realizar consultas de insercin (INSERT),
actualizacin (UPDATE) y borrado (DELETE).
ExecuteScalar: lanza la consulta y devuelve un objeto con el valor del primer
campo del primer registro que se obtenga de dicha consulta. Es til para lanzar
consultas de agregacin como sumas (SUM), cuentas (SELECT COUNT * ....) y
similares de las que slo necesitamos un valor como resultado.
En el ejemplo hemos utilizado el primer mtodo ya que requerimos que devuelva
varios registros con diferentes campos. Entonces lo que hacemos es (lneas a partir
de la 9):
1. Abrir la conexin.
2. Crear una variable para contener una referencia a un objeto de la clase
DataReader que es el que nos permitir acceder a los resultados. Fjese en que
no se puede instanciar un DataReader (la declaracin no lleva la palabra clave
New).
3. Se obtiene el resultado mediante el mtodo ExecuteReader, recogindolo en la
variable (dr) recin declarada.
4. Se procesan los resultados (lneas 14-18).
5. Se cierra la conexin.
El objeto DataReader es asimilable a un cursor de servidor de slo lectura y hacia
adelante (conocidos como de manguera de bombero o firehose). Es decir, los datos
devueltos por el DataReader slo se pueden leer y no actualizar. Adems de esto slo
se pueden leer en secuencia hacia adelante (no hay forma de regresar sobre lo
andado).
La propiedad HasRows nos indica si hay o no resultados devueltos. El mtodo Read
avanza una posicin en los registros devolviendo True si quedan registros pendientes
de leer. Con esta informacin es muy fcil entender las lneas 14 a 18.
La clusula Using
Qu ocurre si se produce un error durante el procesamiento del bucle anterior en el
que se trata el DataReader?. La respuesta es que la conexin, que debemos tener
abierta durante el procesamiento, no se cerrar pues el cdigo no llega al final.
www.detodoprogramacion.com
Esto es algo muy grave ya que las conexiones que no se cierran no se pueden
reutilizar y por lo tanto puede llegar un momento en que no tengamos conexiones
disponibles, lo que limita enormemente la escalabilidad del sistema.
Podemos evitar el problema escribiendo:

De este modo, con la clusula Finally nos aseguramos que siempre se va a cerrar la
conexin.
De todos modos escribir este cdigo es algo tedioso sobre todo si queremos que la
excepcin se replique y slo metemos la clusula Finally por el hecho de cerrar la
conexin.
Para facilitar el trabajo VB.NET en .NET 2.0 incluye una clusula especial denominada
Using que habilita la destruccin automtica de los objetos a los que se hace
referencia. As el cdigo anterior quedara simplemente:

Al terminar la clusula Using (aunque haya un error por medio) se llama de manera
automtica al mtodo Dispose del objeto utilizado (en este caso una conexin). Entre
www.detodoprogramacion.com
otras cosas este mtodo se encarga de cerrar el objeto si estaba abierto, por lo que
no nos tendremos que preocupar de este aspecto.
Grupos de registros
Aunque los DataReader se asemejan al funcionamiento de un cursor firehose, en
realidad difieren bastante de stos. Imaginemos que conectamos con la base de datos
en el ejemplo anterior y, mientras estamos procesando el bucle de los registros, se
interrumpe la conexin a la base de datos pr el motivo que sea.
En principio en el caso de un cursor firehose tradicional obtendramos un error porque
se ha roto la conexin con el servidor. En el caso de un DataReader es posible que
sigamos ejecutando varias vueltas ms del bucle sin problemas. Esto se debe a que,
en realidad, el DataReader obtiene los registros en grupos a travs de la conexin y
va solicitando nuevos grupos a medida que los necesita.
Es algo que hay que tener en cuenta a la hora de utilizarlos.
Ventajas e inconvenientes
El cdigo anterior, aunque sencillo, es un poco lioso y el uso de los DataReader est
algo limitado dada su idiosincrasia (de slo lectura y hacia adelante). Este cdigo es
adecuado si no necesitamos almacenar los resultados de la consulta en memoria ni
regresar sobre ellos una vez procesados una primjera vez. Tambin es muy til para
obtener resultados con miles o millones de registros que queremos tratar
secuencialmente pero no almacenar en memoria.
Sin embargo para un uso cotidiano se trata de un cdigo muy poco til y complicado
de utilizar salvo para cosas muy sencillas. Adems slo hemos utilizado clases de la
capa conectada de ADO.NET. Todava debemos aprender a obtener los resultados
dentro de un DataSet para su explotacin de manera cmoda. Hay que tender un
puente entre ambos mundos (conectado y desconectado): el DataAdapter.
















www.detodoprogramacion.com


DataAdapter: puente entre mundos
Si lo que deseamos es poder almacena temporalmente en memoria los datos
obtenidos de una consulta debemos recurrir al uso de objetos de la clase DataSet.
Como sabemos se trata de un almacenamiento en memoria desvinculado por
completo del origen de los datos.
Si el ejemplo anterior lo modificamos para convertirlo en una funcin que nos
devuelva un DataSet con los datos obtenidos a partir de la consulta, el resultado sera
similar a este:
www.detodoprogramacion.com

La primera parte del cdigo es como la anterior. Se crean una conexin y un
comando. Lo que difiere bastante es la segunda parte. Hay varias diferencias
importantes:
1. Ya no aparece en el cdigo objeto DataReader de tipo alguno.
2. No se abre ni se cierra la conexin a la base de datos.
3. Se crea un nuevo DataSet y aparece un objeto de la clase DataAdapter.
Un DataAdapter es una clase que conoce las particularidades de la capa conectada de
un determinado proveedor y es capaz de "comunicar" informacin entre sta y la capa
desconectada formada por los DataSet.
El mtodo Fill de un DataAdapter se encarga e rellenar un DataSet con los datos
obtenidos a partir de una consulta (o procedimiento almacenado) definida a travs de
un comando. Su propiedad SelectCommand se usa para indicar qu comando se
utilizar para rellenar el DataSet.
Internamente el mtodo Fill emplea el objeto DataReader devuelto por ExecuteReader
y rellena el DataSet con l por lo que sera factible crear un cdigo equivalente. Sin
embargo es muy cmodo y nos evita problemas y el tener que "reinventar la rueda"
en cada proyecto.
El objeto DataSet
Los objetos DataSet contienen a su vez objetos DataTable que son los que contienen
realmente los datos. Para acceder a las tablas de un DataSet se utiliza su coleccin
Tables. Se puede acceder a las tablas por posicin (nmeros enteros) o por nombre
si lo sabemos.
www.detodoprogramacion.com
En un ejemplo sencillo como el anterior (y por otro lado uno de los ms comunes) se
crea una nica tabla en el DataSet de nombre "Table1" y posicin 0.
Las tablas contienen dos colecciones interesantes:
Columns: conjunto de objetos de tipo DataColumn que ofrecen informacin
sobre los campos de la tabla (nombre, tipo, longitud...).
Rows: coleccin de objetos de la clase DataRow que contienen informacin
concreta sobre cada campo de un registro de la base de datos.
Con esta informacin resulta muy sencillo tratar los datos de una consulta. Podemos
acceder directamente a cualquier registro de la tabla usando su posicin en la
coleccin de filas. Por ejemplo para acceder al quinto registro de una tabla basta con
escribir:
Dim dr As DataRow
dr = ds.Tables(0).Rows(4)
(ntese que las colecciones comienzan a numerarse en 0, de ah que el quinto
registro tenga ndice 4).
Podemos acceder a cualquier campo del registro usando su posicin o bien su
nombre, as:
ds.Tables(0).Rows(4)("CompanyName")
que devolver un objeto del tipo adecuado para el campo que representa (una
cadena, un objeto de fecha, un booleano, etc...).
Nota:
Es muy sencillo definir objetos DataTable que dispongan de los campos
que deseemos sin depender de origen alguno de datos. Emplee el
mtodo Add de la coleccin Columns para crear nuevos campos, algunos
de los cuales pueden ser incluso derivados mediante una frmula de los
valores de otros. Esto permite definir estructuras de almacenamiento a
medida en memoria sin preocuparnos de usar una base de datos para
ello.
Ventajas del uso de objetos DataSet
Es posible cargar datos de varias tablas en un mismo DataSet, incluso aunque
procedan de bases de datos diferentes, y relacionarlas en memoria. Es posible
establecer relaciones entre ellas para mantener la consistencia, as como hacer un
mantenimiento en memoria de los datos (altas, bajas y modificaciones).
Posteriormente se puede sincronizar el DataSet con el servidor usando un
DataAdapter, realizando el proceso contrario al de obtencin de datos. Luego lo
veremos.
www.detodoprogramacion.com
La principal ventaja de un DataSet es que podemos almacenarlo en donde queramos
(en una variable global, en cach, incluso a disco a una base de datos) para trabajar
con l sin estar conectado a una base de datos. De hecho se pueden transferir
DataSet completos entre diferentes mquinas o por Internet, trabajar con ellos en
remoto, almacenarlos, recuperarlos y finalmente transferirlos en cualquier momento
de nuevo al origen (enteros o slo los cambios) para sincronizarlos.
Es posible moverse con libertad entre los registros de una tabla y sus registros
relacionados en otras tablas. Y sobre todo, se pueden vincular con elementos de la
interfaz grfica para mostrar los datos automticamente.



































www.detodoprogramacion.com


Consultas parametrizadas
Las consultas simples como la que acabamos de utilizar en los ejemplos anteriores
son muy raras. En la realidad las consultas son mucho ms complejas, suelen
intervenir varias tablas y dependen de diversos parmetros que le aaden
condiciones.
Por ejemplo, si en la base de datos Northwind queremos obtener slo aquellos
clientes de un pas determinado. Podramos escribir de nuevo la funcin DameClientes
para que se pareciese a la siguiente:
www.detodoprogramacion.com

Esta funcin acepta un pas como parmetro y lo nico qe hace es concatenar a la
consulta una nueva condicin que introduce el pas.
Esto, sin duda, funcionara. Sin embargo presenta multitud de problemas
seguramente no demasiado obvios para los programadores noveles. Los ms
importantes son los siguientes:
1. Este cdigo es vulnerable a problemas de seguridad provocados por ataques
de inyeccin de SQL. Esto puede poner en peligro fcilmente nuestra aplicacin
e incluso todo nuestro sistema en casos graves. El estudio de esta problemtica
se sale del mbito de este curso, pero crame cuando le digo que se trata de un
gravsimo problema que debemos evitar a toda costa.
2. Si se solicitan 100 consultas idnticas al servidor en las que slo vara el
nombre del pas por el que se filtra, ste no tiene modo de saber que son las
mismas y sacar factor comn. Es decir, no se puede reutilizar el plan de
consulta de la primera de ellas para las dems por lo que se debe calcular de
nuevo cada vez, incidiendo en el rendimiento y la escalabilidad de la aplicacin.
Obviamente en consultas ms compllicadas es un problema ms importante que
en esta.
3. Este cdigo es ms difcil de transportar a otros sistemas de bases de datos ya
que hay que incluir los delimitadores y notaciones especficos de cada gestor.
Por ejemplo en SQL Server los delimitadores de fechas son comillas simples ('),
mientras que en Access son almohadillas (#) y la sentencia usada no se puede
reutilizar.
La forma correcta de realizar este tipo de consultas es utilizar parmetros en la
consulta. Ello evita los problemas enumerados.
www.detodoprogramacion.com
Los objetos de tipo Command disponen de una coleccin llamada Parameters que
sirve para asignar dichos parmetros. stos previamente se definen en la consulta
utilizando comodines que marquen su ubicacin.
Nota:
Cada proveedor de datos utiliza su propia convencin para indicar la
posicin de los parmetros en una consulta. En el caso de SQL Server se
indican con una arroba '@' seguida de un identificador. En otros
proveedores no se puede definir nombre para los parmetros, slo se
marca su posicin con un caracter especial.
La funcin anterior empleando parmetros sera la siguiente:

Se ha resaltado los cambios.
Como vemos en lugar de concatenar cadenas se marca la posicin de las partes de la
consulta que varan con un parmetro que consta de una arroba seguida de un
identificador.
Luego hay que declarar el parmetro aadindolo a la coleccin de parmetros. Para
ello se indica su nombre y el tipo de datos que representa (en este caso un NVarChar
de SQL Server, que es una cadena de longitud variable).
Por fin se asigna su valor concreto antes de lanzar la consulta.
El proveedor de datos crea la consulta de la manera correcta, usando los
delimitadores adecuados y tratando los datos del modo que sea preciso para asegurar
www.detodoprogramacion.com
que es correcta. Ello elimina los problemas de los que hablbamos anteriormente y
permite optimizar el uso de consultas.










































www.detodoprogramacion.com


Altas bajas y modificaciones
Con lo que hemos visto hasta ahora ya estamos en condiciones de escribir cdigo
para realizar altas, bajas y modificaciones de registros. Al fin y al cabo stas son
simplemente consultas SQL del tipo adecuado (INSERT, DELETE o UPDATE) que se
deben enviar al servidor.
As pues, para crear un nuevo cliente podemos escribir una funcin como la siguiente:
www.detodoprogramacion.com
Es un cdigo muy similar al anterior que realizaba una seleccin de datos. En este
caso se ha definido una consulta de insercin con tres parmetros. En lugar de usar
ExecuteReader o un DataAdapter en este caso se utiliza el mtodo ExecuteNonQuery.
ste lanza la consulta (es decir, se inserta el nuevo registro) y devuelve el nmero de
registros afectados por la consulta (que en el caso de una insercin siempre es 1 si se
inserta correctamente o 0 si ha habido un error y lo captursemosr).
Las actualizaciones y eliminaciones de registros se podran conseguir de modo similar.
Trabajando desconectados
El cdigo anterior funciona perfectamente pero no es la forma ptima de trabajar
cuando tenemos que tratar con datos desconectados contenidos en objetos DataSet.
Los DataSet normalmente circulan, independientes de cualquier origen de datos,
entre las diferentes capas de una aplicacin e incluso se mueven entre contextos de
ejecucin y mquinas (por ejemplo a travs de un servicio Web como veremos).
Hemos dicho que son como pequeas bases de datos, por lo que la forma habitual de
trabajar con ellos es aadir, eliminar y modificar registros directamente sobre sus
tablas, sin pensar en la ubicacin real de estos datos.
www.detodoprogramacion.com
As pues, para crear un nuevo registro en un DataSet debemos usar el mtodo
NewRow de la DataTable en la que lo queremos insertar. El nuevo registro tiene la
misma estructura (el mismo "esquema") que el resto de registros y slo tendremos
que rellenar sus datos. Una vez rellenados aadiremos el nuevo registro a la coleccin
de filas de la tabla. As por ejemplo si tenemos almacenado un DataSet con una tabla
con los datos de los clientes obtenidos con la funcin de ejemplo DameClientes,
podramos agregar uno nuevo de la siguiente manera:

Es decir, se crea la nueva fila/registro, se rellenan sus campos y se aade a la
coleccin de filas con el mtodo Add de sta.
La actualizacin de datos es ms sencilla an ya que basta con acceder directamente
al registro que nos interesa modificar y cambiar los valores de sus campos. Por
ejemplo, para modificar la direccin del cliente cuyos datos estn en el quinto registro
de nuestra tabla slo hay que escribir:

Por fin, para eliminar un registro slo hay que usar su mtodo Delete, as:

que borrara el quinto registro de nuestra tabla en memoria.
Conciliando los cambios con el origen
Es muy fcil trabajar con los Dataset en memoria de este modo. Slo hay un
"pequeo" problema: los cambios se realizan en memoria pero, al no estar vinculado
el DataSet con origen de datos alguno, no los veremos reflejados en la base de datos
que es lo que buscamos.
Debemos realizar una sincronizacin entre la representacin en memoria de los datos
y su ubicacin fsica real, para lo cual debemos hacer que los cambios trasciendan a la
capa conectada. Al igual que cuando los recuperamos, el trasiego en el otro sentido se
realiza con la ayuda del puente que representa la clase DataAdapter.
Al igual que utilizbamos la propiedad SelectCommand para indicar cmo se
recuperaban los datos hacia un DataSet, ahora debemos utilizar las propiedades
InsertCommand, UpdateCommand y DeleteCommand para indicar qu
comandos se deben usar para agregar, modificar y eliminar los registros modificados
en memoria a travs del DataSet.
www.detodoprogramacion.com
Una vez especificados estos comandos slo resta llamar al mtodo Update del
DataAdapter para que se ocupe de sincronizar automticamente todos los cambios
que hayamos realizado en las tablas en memoria. Este mtodo acepta como
argumentos un DataSet completo, una DataTable o incluso un DataRow si slo
queremos actualizar un nico registro.
Definicin de los comandos
Los comandos de insercin, modificacin o borrado para el DataAdapter se definen del
mismo modo que en el cdigo de ejemplo al principio de este apartado, es decir, se
define la consulta apropieada y sus parmetros. En esta ocasin como los parmetros
sern rellenados automticamente por el DataAdapter hay qeu utilizar una sobrecarga
del mtodo Add de la coleccin de parmetros que incluye el nombre del campo
asociado con el parmetro, as:

En este caso se define el parmetro "@Direccin", de tipo NVarChar y longitud 60 que
se refiere siempre al valor del campo "Address" dela tabla.
Por ejemplo, para definir la consulta de eliminacin de registros de la tabla de clientes
usaramos el siguiente cdigo:

siendo CustomerID la clave primaria de la tabla.
Una vez definidos los tres parmetros de alta, baja y modificacin slo resta llamar a
Update para que el DataAdapter se ocupe de toda la sincronizacin.
Ventajas
Este modelo est lleno de ventajas aunque a primera vista pueda parecer algo
engorroso.
Nota:
Luego veremos que podemos usar las herramientas que nos proporciona
Visual Studio 2005 para definir de manera automtica los comandos de
manipulacin de datos sin necesidad de pasar el trabajo de hacerlo
manualmente.
Para empezar podemos trabajar con los datos en total libertad sin preocuparnos de si
existe conexin o no con el origen y aunque el DataSet se manipule en una ubicacin
fsica a miles de kilmetros del origen y desconectado de ste o los cambios se
almacenen a disco y se concilien das ms tarde.
www.detodoprogramacion.com
Se pueden realizar multitud de modificaciones en los datos y luego conciliarlas
simultneamente en lugar de hacerlo en tiempo real de una en una.
El paso de datos entre capas y funciones se simplifica. Lo habitual antes era definir
funciones con tantos parmetros como datos se quisieran modificar en un registro.
Por ejemplo, para insertar un registro en una tabla que tiene 20 campos se defina
una funcin con 20 parmetros (muchos de ellos opcionales) o, en el mejor de los
casos, se pasaba una clase creada a medida que representaba lo valores del registro.
Ahora basta con pasar un DataSet, un DataTable o un dataRow que ya contiene toda
la informacin que necesitamos saber sobre los registros y su tabla asociada.
Lo mejor es que es posible saber mediante ciertas propiedades qu registros han
cambiado (nuevos, modificados, borrados) y mover entre capas exclusivamente
estos. La propiedad HasChanges de los DataSet, DataTable y DataRow nos informa
de si el objeto ha sufrido cambios de algn tipo.
El mtodo GetChanges de los objetos DataSet y DataTable devuelve un subconjunto
de los datos que contiene exclusivamente los cambios. As, aunque en un DataSet
tengamos 1000 registros, si slo hemos modificado 2 slo ser necesario trasegar la
informacin de estos a la hora de enviarlos a otra capa o funcin para sincronizarlos
con la base de datos.
El mtodo GetChanges se puede invocar sin parmetros o indicando qu tipo de
cambios queremos obtener, lo que se indica con un valor de la enumeracin
DataRowState:
Valor Significado
Added Registros que no estaban
originalmente.
Deleted Registros que se han eliminado
Modified Registros cuyos valores se han
modificado
UnChanged Registros que no se han
modificado
Detached Registros que se han desasignado
de una tabla (pero no borrado con
Delete)
Se puede dejar un DataSet en estado sin modificar llamando a su mtodo
AceptChanges. Esto es lo que hace un DataAdapter tras haber sincronizado los
cambios con el origen de datos.






www.detodoprogramacion.com


Acceso a datos con Visual Studio 2005
Ahora que ya hemos visto la forma de trabajo manual con ADO.NET y dominamos los
fundamentos, vamos a sacar partido a todas las ventajas que nos proporciona un
entorno como Visual Studio 2005 que, como veremos, nos permiten hacer casi
cualquier tarea de datos sin necesidad de escribir cdigo.
Leccin 3: Acceso a datos con Visual Studio 2005
o Controles de datos
Orgenes de datos
Controles enlazados
Concurrencia optimista
Uso de los controles enlazados en la prctica
o DataSets tipados












www.detodoprogramacion.com



Controles de datos
Aparte de la escritura manual de cdigo y el uso
directo de objetos de ADO.NET, ASP.NET 2.0
proporciona un nuevo modelo de trabajo declarativo
para acceso a datos que nos permite realziar tareas
comunes de acceso a datos sin escribir cdigo alguno.
ASP.NET 2.0 presenta dos nuevos tipos de controles
Web que participan en este modelo declarativo de
enlace a datos. Estos controles nos abstraen por
completo de las complejidades de manejo de las
clases de ADO.NET por un lado, y de las dificultades
inherentes al modo de trabajo desconectado de las
pginas Web. Equiparan en muchos aspectos el
desarrollo web al tradicional desarrollo de aplicaciones
de escritorio.
Estos controles se encuentran agrupados en el cuadro de herramientas bajo el
nombre de "Datos", tal y como se ve en la figura.
Orgenes de datos
Estos controles de datos representan conexiones con diferentes tipos de orgenes de
informacin que van desde bases de datos a objetos de negocio. No disponen de
apariencia visual pero se arrastran igualmente sobre los formularios Web para
trabajar con ellos visualmente y poder usar sus paneles de tareas. Abstraen al
programador de las complejidades relacionadas con el manejo de los datos,
www.detodoprogramacion.com
permitiendo de manera automtica selecionarlos, actualizarlos, ordenarlos,
paginarlos, etc..
ASP.NET 2.0 ofrece los siguientes controles de origen de datos que se pueden ver en
la figura anterior:
Control Descripcin
SqlDataSource Enlaza con cualquier base de
datos para que exista un
proveedor de ADO.NET.
AccessdataSource Esta especializado en trabajar
con bases de datos Microsoft
Access.
ObjectDataSource Se enlaza con objetos de
negocio y capas personalizadas
de acceso a datos.
XmlDataSource Trata datos contenidos en
documentos XML.
SiteMapDataSource Se enlaza con la jerarqua de
clases expuesta por el modelo
de navegacin de sitios de
ASP.NET 2.0.
ATENCIN!: El control SqlDataSource sirve para enlazar con
cualquier gestor de datos relacional para la que haya proveedor
ADO.NET disponible, no slo para enlazar con SQL Server. No se deje
despistar por su nombre.
Concurrencia optimista
Durante la configuracin de un origten de datos SQL (luego lo ver en el primer vdeo
de esta leccin) una de las opciones avanzadas que se presenta habla de la
Concurrencia optimista. La concurrencia optimista evita la actualizacin de
registros en el caso de que haya variado cualquiera de sus campos desde que se
obtuvieron de la fuente de datos. Este comportamiento puede ser bueno en ciertas
ocasiones, cuando queremos preservar los cambios realizados por cualquier usuario.
En otras sin embargo no resulta de utilidad y s aade una gran sobrecarga al acceso
a datos.
Se le denomina concurrencia optimista porque parte de la base de que la posibilidad
de coincidencia de dos usuarios sobre el mismo registro es baja y es un caso que
apenas se dar. Al caso contrario a la concurrencia optimista se le denomina
concurrencia pesimista.
Nota:
En mi opinin debera llamarse "concurrencia realista" ya que, lo cierto
es que si se analiza con detenimiento la posibilidad de conflicto en un
sistema grande tiende a ser realmente pequea en la mayora de los
casos. Y de todos modos el sobreescribir cierta informacin no suele ser
www.detodoprogramacion.com
un problema grave salvo cuando hablamos de cuestiones de dinero,
facturas y similares.
Cuando se establece la concurrencia optimista las consultas que genera el asistente
de Visual Studio incluyen todos los campos del registro como condicin de bsqueda
del mismo, por ejemplo:
DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID
AND
[CompanyName] = @original_CompanyName AND [ContactName] =
@original_ContactName
AND [ContactTitle] = @original_ContactTitle AND [Address] =
@original_Address AND
[City] = @original_City AND [Region] = @original_Region AND
[PostalCode] =
@original_PostalCode AND [Country] = @original_Country AND [Phone] =
@original_Phone AND [Fax] = @original_Fax
mientras que en un caso de concurrencia pesimista se emplea simplemente la clave
primaria del registro para localizarlo:
DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID
Es decisin suya qu tipo de actualizacin utilizar pero en la mayor parte de los casos
usar seguramente la pesimista que, de hecho, es la que usted utiliza normalmente si
escribe las funciones a mano de manera independiente.
Controles enlazados a datos
Se trata de controles de interfaz de usuario que, haciendo uso de los anteriores,
muestran la informacin a travs de la pgina. Pueden sacar partido a todas las
propiedades de los orgenes de datos y por lo tanto habilitan de manera sencilla la
edicin, eliminacin, ordenacin, filtrado y paginacin de los datos entre otras cosas.
Para conectar un control enlazado a un DataSource slo hay que establecer su
propiedad DataSourceID indicando el nombre apropiado. As de facil.
Nota:
Si usted ya conoce los controles enlazados a datos de ASP.NET 1.x como
el DataGrid, el DataRepeater, etc... estos controles le resultarn ms
cmodos de utilizar pues al contrario que con aquellos no hay que
escribir cdigo alguno. Aunque estos controles "antiguos" no aparecen
en el cuadro de herramientas siguen estando soportados y los puede
seguir utilizando. Incluso si lo desea puede aadirlos al cuadro de
herramientas. De todos modos se recomienda utilizar el nuevo modelo
declarativo de acceso a datos.
www.detodoprogramacion.com
Uso de los controles de datos en la prctica
La mejor forma de conocer la manera de trabajar con estos controles es vindolos
actuar en la prctica. Los vdeos de esta leccin muestran un ejemplo completo de
uso de los controles en el que se explotan unos datos para su visualizacin, edicin y
eliminacin. Por favor, examnelo con atencin y luego trate de practicarlo por su
cuenta con ejemplos similares.

Ver vdeo 1 de esta leccin (Configurar un origen de datos)
Ver vdeo 2 de esta leccin (Explotar el origen de datos)
Ver vdeo 3 de esta leccin (Crear vistas maestro-detalle)
































www.detodoprogramacion.com


DataSet tipados
La clase DataSet, como cualquier otra clase no sellada de .NET, puede ser extendida
mediante herencia para aadirle nuevas funcionalidades y aprovechar las ya
existentes. Si creamos una nueva clase que herede de DataSet y sta la
especializamos en el tratamiento de un conjunto de datos determinado que
conocemos de antemano nos encontramos un DataSet especializado.
Por ejemplo, podemos crear un DataSet especial que tengan en cuenta las
particularidades de los datos que maneja para validarlos antes de permitir su
insercin, que verifique las relaciones con otros datos o que los transforme o controle
el acceso a los mismos. Nosotros slo tendramos que ocuparnos de estas tareas
dejando a la clase DataSet de la que hemos heredado todos los puntos complejos que
tienen que ver con la gestin de datos pura y dura.
Esta es, en esencia, la idea que subyace bajo los DataSet tipados de Visual Studio
2005. Se trata de clases especializadas derivadas de DataSet que ofrecen una forma
ms rpida y sencilla de acceder a los datos que albergan. Adems Visual Studio nos
permite crear este tipo de DataSet de forma visual y usando asistentes. En el vdeo se
ilustra la manera de conseguirlo.
Los DataSet tipados parten del conocimiento preciso de la estructura de una base de
datos para definir su funcionalidad. Esta es su principal diferencia con los DataSet
normales puesto que stos son genricos y no saben nada acerca de los datos que
albergan. Los tipados slo sirven para albergar una informacin muy concreta. Ganan
en especializacin y pierden en versatilidad.
Para agregar un DataSet tipado a nuestro proyecto slo hay que presionar con el
botn secundario sobre la carpeta App_Code y en el dilogo que aparece elegir el
icono de DataSet. La extensin del archivo generado es '.xsd' porque lo que en
www.detodoprogramacion.com
realidad albergan es un esquema XML que define la estructura de los datos en los que
se van a especializar.
Una vez agregado el DataSet aparece una superficie de diseo y un asistente como el
de la figura.

Figura 4.5.- Primer paso del asistente de configuracin de un TableAdapter.
Este asistente nos permite configurar un objeto TableAdapter que se encargar de
trasegar datos entre el DataSet tipado que estamos creando y la base de datos. Un
TableAdapter es una clase que encapsula a un DataAdapter especializado en los datos
que vamos a procesar con la tabla del dataSet tipado que estamos definiendo. De
hecho sus mtodos son, por defecto, los mismos que los de un DataAdapter normal
(Fill, Update...).
Con l dispondremos de mtodos para recuperar informacin, crear nuevos registros,
actualizarlos y eliminarlos, slo que los correspondientes comandos estarn creados
de manera automtica o asistindonos en ello. As, por defecto, se definen un par de
mtodos para obtener los datos subyacentes rellenando un DataSet que se le pase
(mtodo Fill) o devolviendo directamente un DataTable (mtodo GetData). Adems
el mtodo Update sirve para conciliar automticamente los cambios del un DataSet
tipado con la base de datos original.
No vamos a analizar desde el texto la definicin de estos objetos adaptadores pero
puede conocerlo viendo el vdeo de esta leccin.
Truco:
Podemos ver el cdigo que se genera de manera automtica para crear
el DataAdapter si hacemos doble-clic sobre l desde el examinador de
objetos de Visual Studio (CTRL+ALT+J). Esto har que se abra el archivo
de cdigo auto-generado por ASP.NET desde la ubicacin real de
www.detodoprogramacion.com
ejecucin (normalmente una ruta del estilo
C:\Windows\Microsoft.NET\....). Es muy interesante echarle un vistazo a
este cdigo para aprender el funcionamiento interno de los DataSet
tipados.
Partes de un DataSet tipado
Al igual que un DataSet normal, uno tipado consta de un conjunto de tablas y
relaciones entre ellas. En este caso sin embargo podemos acceder a las tablas y a sus
campos utilizando directamente sus nombres en lugar de recorrer la coleccin de
tablas, lo cual lo hace ms fcil de usar.
Cada una de las tablas del DataSet lleva asociado como mnimo un TableAdapter.
Entre los dos objetos (el DataTable y el o los TableAdapter relacionados) se reparten
el trabajo. El DataTable tipado mantiene en memoria la informacin y el TableAdapter
acta de puente con la tabla real en la base de datos.
Nota:
Como sabemos (y veremos en el vdeo tambin) las tablas de un
DataSet no tienen porqu coincidir con tablas reales de una base de
datos ya que pueden ser resultados obtenidos de una consulta compleja
que involucre a varias tablas. En estos casos es ms complicada la
actualziacin y se suelen usar nicamente para recuperar datos. la
alternativa habitual es tratar de replicar la estructura fsica de la base de
datos en la estructura en memoria del DataSet de modo que se tiene
acceso estructurado a la misma informacin y gracias a las relaciones y
restricciones se conserva la consistencia de los datos tambien estando
desconectados.
El DataSet tipado dispone de propiedades que coinciden con los nombres de los
objetos que contienen. As, por ejemplo, si tenemos una tabla "Clientes" con un
campo "Nombre" podemos acceder a l directamente con este cdigo:
ds.Clientes(0).Nombre
que nos dara el nombre del primer cliente de la tabla de clientes en el DataSet 'ds'.
esta propiedad nombre adems ya sera un campo de tipo String que es el tipo
adecuado para la informacin albergada, por lo que se simplifica mucho su uso.
En un DataSet normal para obtener lo mismo tendramos que haber escrito:
ds..Tables(0).Rows(0)("Nombre").ToString()
que obviamente es mucho menos legible.
La cosa no termina aqu ya que adems se definen clases especficas para representar
los registros de las tablas. Por ejemplo si la tabla se llama 'Clientes' existir una clase
ClientesRow que dispone de propiedades con el mismo nombre y tipo que los campos
www.detodoprogramacion.com
correspondientes en la tabla de la base de datos y que hemos usado en la lnea de
ejemplo. As, para aadir un cliente podramos escribir:
Dim cliente As New Cliente
cliente.Nombre = "Pepe"
....
ds.Clientes.AddClientesRow(cliente)
Ntese que el mtodo Add del DataTable se ha sustituido por uno con nombre
especializado que nos ayuda a saber mejor por donde pisamos, pero su funcin es
idntica.
Para rellenar una tabla de un DataSet tipado se usa su correspondiente TableAdapter
as:
Dim clientes As New ClientesDS
Dim ta As New ClientesTableAdapters.ClientesTableAdapter()
ta.Fill(clientes.Clientes)
clientes.Clientes(0).Nombre = "Pepe"
....
o tambin usando el mtodo GetData para obtener la tabla directamente si slo nos
interesa esa parte concreta del DataSet (que puede constar de varias tablas):
Dim clientes As Clientes.ClientesDataTable
Dim ta As New ClientesTableAdapters.ClientesTableAdapter()
clientes = ta.GetData()
clientes(0).Nombre = "Pepe"
....
Para un mismo DataTable tipado se pueden definir diversos TableAdapter
especializados aparte del bsico que permite llenar todos los datos: para filtrar podr
diversos parmetros normalmente.
El uso de DataSet tipados es muy recomendable puesto que simplifica mucho el
trabajo puesto que podemos realizar casi todo el trabajo utilizando asistentes y
accediendo a la informacin de manera muy cmodo. Adems es un modo muy
sencillo de separar la funcionalidad de la base de datos del resto del cdigo. As, si se
hace necesario en el futuro, se puede exponer esta parte de manera independiente
mediante un, por ejemplo, un servicio Web que utilice el DataSet tipado y sus
TableAdapters para acceder a los datos desde una ubicacin remota.
Ver vdeo de esta leccin (Dataset tipados)
www.detodoprogramacion.com


Contenido
En este mdulo vamos a aprender ciertas cuestiones avanzadas de ASP.NET 2.0 que
nos ayudarn a crear aplicaciones ms potentes y con menos esfuerzo que con
cualquier otra herramienta de desarrollo, incluyendo versiones anteriores de .NET.
Veremos como conseguir pginas con un aspecto y funcionalidad consistentes a lo
largo de toda la aplicacin Web. Tambin conoceremos los nuevos controles de
seguridad que vienen con ASP.NET 2.0, y estudiaremos la forma de mantener
informacin en memoria para agilizar las aplicaciones.
Leccin 1: Pginas principales o Master Pages
o Introduccin
o Qu son las Master Pages?
o Definicin de una Master Page
o Master Pages anidadas
o Acceso a los elementos de una Master Page
Leccin 2: Temas y Skins
o Hojas de estilo
Soporte de estilos en ASP.NET
o Temas y mscaras (Skins)
La carpeta App_Themes
Estructura de un archivo .skin
Propiedades que se pueden personaliza
o Asignacin de temas
Asignacin global de temas
Precedencia de propiedades
Deshabilitar temas en controles concretos
Clases de un mismo tipo de control
Inclusin automtica de hojas de estilo
www.detodoprogramacion.com
Rutas de imgenes
Leccin 3: Estado de las aplicaciones
o Mantenimiento de sesiones
Variables de sesin
Funcionamiento bsico de las sesiones
Sesiones sin cookies
Almacenamiento de sesiones
Tipos de objetos almacenables
o Informacin comn
Variables de aplicacin
Concurrencia en variables de aplicacin
Almacenamiento en cach
o Cach de salida
Directiva Outputcache
Atributos de OutputCache
Donde se hace la cach?
Almacenamiento en disco
Sustitucin post-cach
Leccin 4: Seguridad de las aplicaciones
o Autenticacin y autorizacin de usuarios
Autenticacin de IIS/Windows
Autenticacin Forms en ASP.NET
o Autorizacin de usuarios
Autorizacin de URLs
Autorizacin declarativa
Autorizacin imperativa
o La nueva API: Membership y Roles
Membership
Roles
Administracin de seguridad de sitios Web
o Los controles Web de seguridad
El control Login
El control LoginStatus
El control LoginName
El control LoginView
Los controles restantes








www.detodoprogramacion.com


Pginas principales o Master Pages
Lo ms habitual cuando se crea una aplicacin o un sitio Web es que las pginas que
lo conforman sean todas bastante parecidas o al menos que existan varios grupos de
pginas similares que slo varan ciertos contenidos entre ellas. Por ejemplo, puede
haber una categora de pginas para mostrar artculos en el que todas son iguales
excepto por el contenido del propio artculo en su parte central, mientras que en otra
zona de la aplicacin el diseo es completamente diferente pero sus pginas se
parecen todas entre s.
Por ejemplo, la siguiente figura muestra capturas de dos pginas pertenecientes al
portal MSDN:
www.detodoprogramacion.com

Figura 5.1.- Ejemplo de dos pginas similares en MSDN
Ambas pginas difieren nicamente en el contenido y los mens que muestran en el
lateral (los banners del lateral son rotativos), y conservan una esttica y una serie de
elementos que permanecen constantes en todas las pginas del sitio.
Tradicionalmente para conseguir esta similitud entre pginas haba que crearlas
individualmente o recurrir a artificios propios como por ejemplo el de utilizar archivos
de inclusin para renderizar ciertas partes de las pginas desde un mismo origen en
disco. An en este ltimo caso la capacidad de modificacin era limitada y
normalmente se reduca a las cabeceras y pies de las pginas y poco ms. En el
primero de los casos (retocar una a una) cualquier cambio esttico de un sitio
medianamente grande era poco menos que una locura de realizar.
ASP.NET 2.0 ofrece una nueva caracterstica destinada a paliar esta tradicional
carencia y permite definir pginas cuyo aspecto y funcionalidad deriva de unas
pginas especiales comunes llamadas Pginas principales o Master Pages.
Nota:
Aunque normalmente soy partidario de utilizar los trminos en castellano
siempre que los haya, en este caso har una excepcin y durante el
resto del texto emplear el trmino anglosajn Master Pages (o MP) para
referirme a esta caracterstica. El motivo es que este trmino es el ms
aceptado y el que veremos con ms frecuencia.
Qu son las Master Pages?
Una Master Page proporciona una forma de definir una estructura e interfaz comunes
para un grupo de pginas pertenecientes a un mismo sitio Web. Esta estructura
comn se almacena en un nico archivo independiente. Ello facilita mucho su
www.detodoprogramacion.com
mantenimiento puesto que, para actualizar todas las pginas que lo utilizan, basta
con editar dicho archivo.
Una MP es en realidad como una pgina ASPX normal que contiene cdigo, elementos
HTML y controles Web de servidor. Sin embargo posee una extensin diferente
(.master) y utilizan una directiva <% @ master %> en lugar de una directiva <% @
page %>. Por lo dems se pueden considerar prcticamente equivalentes. Esto es
importante porque significa que ya sabemos todo lo necesario para crearlas.
Una pgina ASPX normal puede derivar su estructura a partir de una MP simplemente
aadiendo un atributo MasterPageFile a su directiva de pgina, as:

que indica el archivo de pgina principal que se utilizar para su estructura.
Definicin de una Master Page
Para agregar una Master Page a nuestro proyecto slo hay que elegir el icono Pgina
Principal en el dilgo de agregar nueva referencia de cualquier carpeta del mismo:

Figura 5.2.- Plantilla de Master Page.
Al abrir una MP aparece un diseador idntico al de una pgina ASPX normal.
Podemos arrastrar sobre su superficie cualquier control as como editar su HTML de la
manera usual. Tambin lleva un archivo de cdigo asociado en el que se puede
responder a sus diversos eventos. La nica diferencia apreciable a simple vista
respecto a una pgina normal es que contiene por defecto un control de tipo
ContentPlaceHolder. La sintaxis de este control es anloga a la siguiente:

Su nica propiedad interesante es precisamente su identificador ya que este tipo de
control se utiliza para marcar las posiciones en las que irn los diferentes contenidos
de las pginas derivadas dentro de la plantilla de estructura que es una Master Page.
www.detodoprogramacion.com
De este modo, cuando una pgina normal derive de una MP, slo se podr introducir
cdigo dentro de las zonas definidas por estos comodines de contenido.
Cuando aadimos una nueva pgina ASPX a nuestro proyecto y existe al menos una
Master Page, podemos marcar una opcin para que, antes de crearla, nos permita
seleccionar de qu MP derivar:

Figura 5.3.- Seleccin de una MP al crear una nueva pgina.
Esto nos evita tener que escribir el atributo MasterPageFile manualmente.
Al editar una pgina que deriva de una Master Page aparece el aspecto y estructura
de la pgina principal en el diseador, pero slo se pueden tocar las partes
correspondientes a los comodines de contenido.
Master Pages anidadas
Una Master Page a su vez puede derivar de otra que previamente hayamos definido,
por lo que heredar la estructura y contenidos de sta. Al igual que en el caso de las
pginas normales slo hace falta establecer el atributo MasterPageFile.
Esta caracterstica se suele utilizar para definir en una de ellas la estructura general
del sitio Web. En otra de las MP se define nicamente la estructura de los contenidos
que contiene la estructura general.
La nica "pega" que tiene el uso de Master Pages anidadas es que no estn
soportadas por el diseador de Visual Studio, por lo que habr que aadir los
controles directamente a mano desde la vista de marcado de la pgina. Siempre
podremos disearlas visualmente antes de hacerlas derivar de una Master Page
anidada y as salvar esta limitacin.
www.detodoprogramacion.com
Acceso a los elementos de una Master Page
Es posible acceder a los controles y elementos de una pgina principal desde el cdigo
de una pgina derivada a travs de una directiva especial llamada MasterType. Slo
hay que indicar la ruta de la Master Page a la que queremos acceder, as:

Una vez hecho esto podemos acceder a los elementos de la pgina de la que deriva la
actual a travs de su propiedad Master.
Por ejemplo, si nuestra Master Page tiene un elemento de imagen llamado 'Logo' y
queremos variarlo en cada pgina mediante cdigo slo habra que escribir:
Master.FindControl("Logo")
Lo mejor, sin embargo, es definir propiedades en la Master Page que encapsulen el
acceso a sus elementos. El cdigo anterior devuelve un objeto de tipo Control que
deberemos convertir en un control de imagen y asignarle la ruta al logo a utilizar. Es
ms mucho ms fcil, menos propenso a errores y de mejor mantenimiento futuro el
definir una propiedad 'Logo' en nuestra Master Page y acceder a ella escribiendo, por
ejemplo:
Master.Logo = "http://www.microsoft.com/logo_msdn.gif"
que nos aislar de lo que ocurra debajo para gestionar ese logo.

Ver vdeo de esta leccin (Master Pages)








www.detodoprogramacion.com


Temas y Skins
Gracias a las Master Pages podemos definir una estructura comn para las pginas de
nuestra aplicacin Web. Sin embargo an no hemos resuelto todas las cuestiones
sobre el mantenimiento de la interfaz que habamos planteado. Los controles que
aadamos a las zonas de contenido de nuestras pginas todava tendrn el aspecto
predeterminado. Podemos configurar su aspecto estableciendo las propiedades de
apariencia del control (como BackColor, Font, etc...). El problema que tiene este
mtodo es que, si deseamos cambiar por completo la apariencia de estos controles,
tendramos que tocar una por una todas las pginas. Esta no es una opcin admisible
en cuanto la aplicacin dispone de ms de unas pocas pginas.
Veamos las opciones que nos ofrece ASP.NET 2.0 para solventar esta otra parte de un
mismo problema.
Leccin 2: Temas y Skins
o Hojas de estilo
Soporte de estilos en ASP.NET
o Temas y mscaras (Skins)
La carpeta App_Themes
Estructura de un archivo .skin
Propiedades que se pueden personaliza
o Asignacin de temas
Asignacin global de temas
Precedencia de propiedades
Deshabilitar temas en controles concretos
Clases de un mismo tipo de control
Inclusin automtica de hojas de estilo
Rutas de imgenes

www.detodoprogramacion.com


Hojas de estilo
HTML ofrece una interesante opcin para independizar el aspecto de sus elementos
del contenido de las pginas a travs del uso de las hojas de estilo en cascada
(Cascading Style-Sheets o CSS). Las hojas CSS permiten definir el aspecto de
cualquier elemento HTML contenido en una pgina. Aunque se pueden definir dentro
de la propia pgina, hacerlo as les hace perder su verdadero sentido que no es otro
que el de separar la definicin del aspecto. As, es posible crear archivos con
extensin '.css' que se vinculan a las diferentes pginas de un sitio y definen el
aspecto de sus elementos.
Dentro de una hoja CSS se definen fundamentalmente dos tipos de estilos:
Redefinicin de etiquetas: indican qu aspecto deben tener todas las
etiquetas de un determinado tipo en las pginas a las que est vinculado el
archivo. Por ejemplo:
a {
text-decoration: none;
color: #DBB94F;
}


body {
background-color: #656565;
background-image: url(Images/background.gif);
background-repeat: repeat;
margin: 0;
padding: 0;
www.detodoprogramacion.com
text-align: center;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 0.7em;
color: #FFFFFF;
}
En este fragmento, las etiquetas definen el aspecto que deben tomar los enlaces y el
cuerpo de la pgina.
Clases: definen aspectos que no estn asociados a una etiqueta HTML concreta
sino que se pueden asignar mediante el atributo class a cualquiera de ellas. Por
ejemplo:
EstiloSimple {
text-decoration: none;
color: #DBB94F;
}


.....


<a href="http://msdn.microsoft.com" class="EstiloSimple">MSDN</a>
En este caso se define la clase llamada EstiloSimple, y cualquier etiqueta HTML a la
que se le asigne mediante su atributo class adquirir el aspecto marcado.
Para asignar un archivo CSS a una pgina slo hay que incluir en su cabecera una
linea anloga a esta:
<link href="mi_hoja.css" rel="StyleSheet" />
La gran ventaja de esta tcnica es que basta con tocar el archivo CSS para que todas
las pginas que lo utilizan vean su aspecto modificado de manera acorde a los
cambios. Da igual que sea slo una o haya miles. Al tener el aspecto centralizado en
una ubicacin nica el mantenimiento es muy sencillo.
Soporte de estilos en ASP.NET
Lo anterior es una caracterstica de HTML independiente de lenguajes de
programacin como ASP.NET. Por supuesto ASP.NET tiene en cuenta y soporta
perfectamente las hojas CSS.
Se puede aadir una etiqueta <LINK> a la cabecera de una pgina ASPX y los
elementos HTML que se generan a partir de los controles que contiene se mostrarn
siguiendo las indicaciones de la misma.
www.detodoprogramacion.com
El entorno de desarrollo de Visual Studio permite definir los estilos de los controles
HTML de servidor de ASP.NET utilizando su propiedad Style, tanto en tiempo de
diseo como durante la ejecucin. El diseador de pginas ASPX incluso ofrece un
dilogo especializado para crear los estilos.

Figura 5.4.- Dilogo de configuracin de estilo para un
control HTML.
En el caso de los controles Web de servidor se utilizan sus
propiedades de aspecto (que se traducen en estilos al
renderizarse en un navegador moderno), y adems disponen
de una propiedad llamada CssClass para establecer
mediante cdigo el nombre de las clase que se quiere aplicar
al control (se traduce en un atributo Class normal de HTML
en tiempo de ejecucin).
Tambin se puede aplicar un estilo concreto a ciertos
controles directamente desde el marcado de la pgina ASPX,
como por ejemplo:

www.detodoprogramacion.com
<ASP:Calendar ... runat="server">
<TitleStyle BorderColor="blue" BorderWidth="1"
BackColor="olivedrab" Height="50px" />
</ASP:Calendar>
si bien en este caso no se usan atributos normales de CSS.





















www.detodoprogramacion.com


Temas y mscaras (Skins)
Si bien las hojas de estilo resuelven en gran parte el problema de independizar el
aspecto de la definicin de contenidos de una pgina, no se adaptan por completo a
los controles ASP.NET. Adems dejan fuera algunas funcionalidades, como los valores
por defecto de propiedades de controles (por ejemplo el texto inicial de un campo) o
el aspecto de controles Web complejos como calendarios o rejillas que no se pueden
expresar nicamente con un estilo CSS.
ASP.NET 2.0 introduce una interesante novedad que se complementa la perfeccin
con las Master Pages para solventar el problema del aspecto: los temas y mscaras
de controles Web.
La funcionalidad ofrecida por los temas de ASP.NET 2.0 se entiende fcilmente si los
asemejamos con las hojas de estilo. Los temas de ASP.NET son como hojas de estilo
que se aplican a controles Web y sus elementos tienen una sintaxis prcticamente
idntica a la de los controles cuyo aspecto definen. Enseguida lo entenderemos.
La carpeta App_Themes
Un tema de ASP.NET 2.0 est formado por uno o varios archivos de tipo .skin junto
con las imagenes y hojas de estilo CSS que stos utilicen, que se almacenan dentro
de una carpeta con el nombre del tema dentro de una carpeta especial. Esta carpeta
de nombre especial es App_Themes.
Podemos aadir una carpeta de temas con el men de agregar carpeta de un
proyecto de Visual Studio:
www.detodoprogramacion.com

Figura 5.5.- Nueva carpeta especial App_Theme.
Una vez creada la carpeta de temas deberemos crear un archivo .skin para comenzar
a definir con l nuestro primer tema. Para ello agregaremos un nuevo elemento. En el
dilogo que aparece seleccionaremos un archivo de mscara, como se muestra en la
figura:

Figura 5.6.- Nuevo archivo de mscara (Skin)
www.detodoprogramacion.com
El primer archivo de mscara que agreguemos definir
automticamente una carpeta de tema con su mismo
nombre para contenerlo. Podemos definir manualmente
tantas carpetas de tema como queramos usando el men de
agregar nuevas carpetas. Dentro de cada una de esas
carpetas puede haber tantos archivos de mscara, hojas de
estilo y grficos como necesitemos.
Por ejemplo el grfico del lateral muestra una carpeta
App_Theme que contiene dos temas y cada uno de ellos a
su vez contiene un archivo .skin, hojas CSS y grficos
especficos del tema.
Estructura de un archivo .skin
Un archivo de mscara contiene definiciones de controles ASP.NET a los que se le
establecen valores de propiedades que sern aplicadas de modo automtico cuando
aparezcan en una pgina que use el tema al que pertenece la mscara.
Por ejemplo, si un archivo .skin contiene el siguiente cdigo:

conseguiremos que las pginas que lo apliquen dispongan de controles TextBox con el
fondo gris claro y el borde punteado de 1 pixel de ancho. Las rejillas que se utilicen
automticamente tendrn el fondo blanco y las lneas pares azules.
Si nos fijamos, la nica diferencia entre un elemento del archivo de mscara y el
marcado de un control est en que los primeros carecen del atributo de identificacin
ID. Por lo dems son prcticamente idnticos.
TRUCO:
Dado que Visual Studio no proporciona asistencia para crear archivos de
mscara (es un simple editor de texto), una forma sencilla de definir sus
elementos es utilizar una pgina ASPX vaca para arrastrar y configurar
controles con los aspectos deseados. Luego slo hay que copiar su
definicin al archivo .skin eliminando todos los atributos ID.
Propiedades que se pueden personalizar
Aunque los archivos de mscara estn pensados para facilitar la aplicacin de
propiedades estticas de los controles, lo cierto es que se puede definir casi cualquier
otra propiedad de un control. Por ejemplo, si escribimos los siguiente en el archivo
.skin de un tema:
www.detodoprogramacion.com

todos los controles de tipo TextBox de nuestra aplicacin mostrarn el texto "(valor)"
al cargar las pgina que usen este tema (ntese el atributo Text en la primera lnea).
En realidad cualquier propiedad de un control web puede personalizarse mediante un
archivo de mscara a menos que su creador haya indicado explcitamente lo
contrario. Esta particularidad puede resultar muy interesante en ciertos casos.
Nota:
Los creadores de controles pueden emplear el atributo
ThemeableAttribute para indicar que una propiedad no es
personalizable mediante una mscara.
























www.detodoprogramacion.com


Asignacin de temas
Ahora que ya conocemos la teora acerca de los temas y sabemos crear archivos de
mscara para los temas vamos a aprender a utilizarlos en la prctica.
Para que una pgina se adapte automticamente a un tema definido en la carpeta
App_Themes lo nico que tenemos que hacer es asignar un atributo Theme en la
directiva de la pgina, as:

El segundo atributo indica el tema que se va a aplicar. El entorno de desarrollo de
Visual Studio nos ofrece de manera automtica una lista de temas disponibles al
escribir este atributo por lo que es muy fcil escribirlo.
Nada ms establecer el atributo la pgina se personaliza en tiempo de ejecucin
siguiendo los dictados de los archivos .skin que haya definidos para el tema.
Dado que podemos disponer de varios temas se puede asignar uno diferente a cada
grupo de pginas de una aplicacin segn las necesidades.
Nota:
Lo ms interesante de este atributo Theme es que se puede establecer
en cualquier momento. Es decir, podemos desarrollar una aplicacin
completa sin pensar siquiera en los temas, y aadrselos sin demasiado
esfuerzo al final con slo asignarlo. Ello permite adems separar la labor
de diseo de la de desarrollo que incluso la puede hacer un equipo de
trabajo diferente.
www.detodoprogramacion.com
Asignacin global de temas
El uso del atributo Theme es muy adecuado cuando slo tenemos unas pocas pginas
a las que aplicrselo. En aplicaciones grandes el hecho de tener que recorrer las
pginas una por una para asignarlo puede ser muy tedioso, con lo que perderamos
bastante de la productividad ganada.
Para evitar esta situacin ASP.NET ofrece otra forma de establecer los temas de forma
global. Consiste en aadir un nuevo nodo de tipo <pages theme=.../> al archivo de
configuracin de la aplicacin, el archivo web.config. La entrada sera similar a la
siguiente:

Al hacerlo todas las pginas de la aplicacin utilizarn el tema indicado sin necesidad
de establecerlo manualmente.
Si se define un tema especfico para una pgina, ste tendr precedencia sobre el
ajuste de Web.config. De hecho si deseamos que una pgina no utilice tema alguno
slo hay que establecer su atributo Theme a una cadena vaca ("").
Nota:
Dado que una aplicacin Web puede disponer de varios archivos de
configuracin (uno por cada carpeta) si queremos que la aplicacin
emplee un tema diferente en diferentes zonas slo tenemos que guardar
todas las pginas de cada zona en una carpeta diferente y crear archivos
web.config especficos para indicar el tema en cada una de ellas. Las
carpetas que no dispongan de su propio web.config heredarn el tema
principal del sitio.
Precedencia de propiedades
Cuando un elemento de una mscara define un atributo para un control, ste tiene
precedencia sobre el mismo atributo en caso de que se haya asignado tambin en la
pgina. Por ejemplo, si en una pgina tenemos un TextBox cuyo color de fondo lo
hemos establecido en amarillo, pero en el archivo .skin del tema que utiliza la pgina
este color indica que debe ser gris, al ejecutar la aplicaicn se ver de color gris.
Una forma alternativa de definir un tema para una pgina que cambia este orden de
precedencia es emplear el atributo StylesheetTheme en lugar del ms comn Theme
que hemos visto hasta ahora:
...
www.detodoprogramacion.com
En este caso el valor establecido en la pgina para una propiedad tiene preferencia
sobre el valor del archivo de mscara en caso de haber coincidencia. Justo al contrario
que en el caso habitual.
Una posibilidad poco frecuente es utilizar ambos atributos (Theme y
StylesheetTheme) simultneamente. En este caso la precedencia lo que ocurre es lo
siguiente:
1. Se aplican los atributos del tema especificado en StylesheetTheme.
2. Se aplican los atributos definidos en la pgina que sobreescriben a los
del paso anterior en caso de coincidencia.
3. Se aplican los atributos del tema especificado en Theme que en caso de
coincidencia tienen por tanto preferencia sobre los anteriores.
Deshabilitar temas para controles concretos
En ocasiones es til dejar un control con su aspecto habitual de forma que no se vea
afectado por el tema asignado a la pgina. La forma de conseguirlo es asignando su
propiedad EnableTheming a False.
Clases de un mismo tipo de control
El hecho de declarar un elemento genrico dentro de un archivo de mscara es til
pero no lo suficiente. Lo ms normal es que no todas las etiquetas o botones (por
poner un ejemplo) tengan exactamente el mismo aspecto sino ms bien que existan
varios tipos de etiquetas y botones que se empleen segn la ocasin.
Al igual que en el caso de las hojas de estilo en los temas se pueden definir distintas
clases de un mismo control, cada una con unos atributos especficos. La forma de
distinguir unos de otros es a travs del atributo SkinID. Considere el siguiente
ejemplo:

En este caso se han definido tres clases de controles TextBox. Los dos primeros
tienen asignado un SkinID y slo se aplicarn a aquellos controles TextBox cuya
propiedad SkinID coincida con el SkinID de la definicin. La ltima definicin no tiene
asignado identificador alguno por lo que se considera la clase por defecto y se aplicar
a todos los controles de texto que no hayan indicado especficamente un SkinID.
www.detodoprogramacion.com
Lo habitual es separar los distintos grupos de controles es varios archivos .skin dentro
de la carpeta de un tema. Se reconocern como si estuvieran todos en el mismo
archivo pero es ms ordenado gestionarlos por separado.
Inclusin automtica de hojas de estilo
Dentro de la carpeta de un tema tienen cabida tambin hojas de estilo como ya
hemos mencionado. Cuando se copia una o ms hojas de estilo enla carpeta, stas se
aaden de manera automtica a la cabecera de las pginas que utilizan el tema
mediante etiquetas <link>. La nica condicin para que esto funcione es que el
atributo <head> de lapgina (que representa la cabecera) tenga el atributo de
ejecucin en el servidor runat="server", cosa que todas las pginas cumplen de
manera predeterminada.
Rutas de imgenes
Por supuesto en las propiedades de los elementos de una mscara se pueden utilizar
imgenes como en este ejemplo:

Debemos guardar las imgenes en alguna subcarpeta de la carpeta de recursos del
tema y utilizar rutas relativas a sta para los atributos que las utilicen, como en el
ejemplo. ASP.NET se encarga de modificar las rutas para que apunten al lugar
correcto tras la aplicacin del tema.

Ver vdeo de esta leccin (Uso de temas)


















www.detodoprogramacion.com


Estado de las aplicaciones
En esta leccin vamos a aprender la manera de mantener informacin en memoria
durante la vida de una aplicacin. Existen diferentes mtodos para mantener el
estado de una aplicacin y sus utilidades en la prctica son muchas, entre otras:
Almacenar temporalmente datos costosos de obtener para mejorar el
rendimiento.
Compartir informacin entre todas las pginas de una aplicacin,
distinguindola por cada usuario o de manera comn a todos.
Guardar detalles de un usuario entre diferentes visitas a una aplicacin.
Mejorar el rendimiento evitando que se rendericen por completo o en parte las
pginas de nuestro sitio Web.

Leccin 3: Estado de las aplicaciones
o Mantenimiento de sesiones
Variables de sesin
Funcionamiento bsico de las sesiones
Sesiones sin cookies
Almacenamiento de sesiones
Tipos de objetos almacenables
o Informacin comn
Variables de aplicacin
Concurrencia en variables de aplicacin
Almacenamiento en cach
o Cach de salida
Directiva Outputcache
Atributos de OutputCache
www.detodoprogramacion.com
Donde se hace la cach?
Almacenamiento en disco
Sustitucin post-cach








































www.detodoprogramacion.com


Mantenimiento de sesiones
HTTP es un protocolo sin estado y como tal no existe forma a priori de distinguir entre
las diferentes peticiones realizadas a un servidor Web. Sin embargo las aplicaciones
Web necesitan mantener de algn modo un estado que les permita agrupar de
manera lgica las llamadas. Sin ello no habra forma, por ejemplo, de distinguir dos
llamadas a una misma pgina de dos usuarios diferentes. Para conseguir este artificio
sobre un protocolo sin estado ASP.NET proporciona las sesiones.
Nota:
Cabra pensar que una buena forma de distinguir unas llamadas de otras
en una aplicacin Web es a travs de la direccin IP del cliente. Nada
ms lejos de la realidad. Dos usuarios diferentes que accedan detrs de
un mismo router (por ejemplo, dos personas en una misma oficina)
tienen la misma IP exactamente. Adems, desde el punto de vista de la
seguridad es muy mala idea usar invariantes de este estilo pues son
fciles de falsear.
Variables de sesin
ASP.NET ofrece una coleccin llamada Session en el objeto Page que nos permite
almacenar parejas de claves y valores que estn disponibles desde todas las pginas
de una aplicacin y se distinguen automticamente para cada cliente que las utilice.
Esto implica que podremos almacenar valores de cualquier tipo a los que podremos
cuando sea necesario mientras el usaurio que solicite las pginas sea el mismo. Por
convencin a las parejas de claves y valores almacenados en el objeto Session se les
denomina variables de sesin.
www.detodoprogramacion.com
Por ejemplo, si quiero contar cuantas veces ha pasado un usuario por una pgina
'a.aspx' puedo escribir en su evento Load lo siguiente:
Session("Cuenta") += 1;
Esto hara que el valor asociado con la clave "Cuenta" se incrementara en uno cada
vez que se cargue la pgina. Es decir, en palabras llanas, incrementa en la unidad el
valor de la variable de sesin "Cuenta".
Si creamos una segunda pgina 'b.aspx' en la que mostramos el valor de la variables
de sesin mediante:
Response.Write(Session("Cuenta"))
veremos que la variable se incrementa en cada ocasin como esperbamos, a pesar
de que, en principio, cada peticin HTTP es independiente de las dems. Si abrimos
un nuevo navegador veremos que las pginas en ste generan una cuenta
independiente.
Funcionamiento bsico de las sesiones
Si cada llamada HTTP es independiente de las dems, cmo es posible el
comportamiento anterior?. Por defecto ASP.NET mantiene la ilusin de las sesiones
mediante el uso de cookies de sesin. Este es un sistema anlogo (aunque
diferente) al que ya ofreca ASP 3.0 clsico para el mismo propsito.
Una cookie de sesin no es ms que una cabecera HTTP con un identificador nico
que el servidor enva al cliente en la primera peticin que ste hace y que el
navegador se encarga de reenviar automticamente en las sucesivas peticiones. As,
basta con comprobar esta cabecera en el servidor en cada peticin para averiguar qu
usuario es el que la realiza. As de simple.
Este es el aspecto de una cookie de sesin de ASP.NET:
ASP.NET_SessionId=43s3ir55u0vvlj55smesaj45
Este fragmento es el que se enva en la cabecera de las peticiones, siendo el valor
despus del igual el identificador nico utilizado para esa sesin. Estas cookies de
sesin no se almacenan jams a disco y slo existen mientras el navegador est
abierto. Si cerramos el navegador no podremos recuperar la anterior sesin.
Sesiones sin cookies
El sistema de cookies de sesin descrito funciona muy bien en la mayor parte de los
casos pero tiene algunos inconvenientes, el principal de los cuales es que si el usuario
ha deshabilitado las cookies de sesin todo dejar de funcionar.
Para evitar este problema ASP.NET dispone de un mtodo alternativo para
mantenimiento de sesin que no utiliza cookies ni cabeceras, sino que introduce una
www.detodoprogramacion.com
ruta virtual aleatoria en todas las peticiones de modo que todas son distintas. Si la
llamada a una pgina se efectuaba en esta URL:
http://www.miservidor.com/miapp/pagina.aspx
al habilitar las cookies sin sesin la llamada se convierte en algo similar a:
http://www.miservidor.com/miapp/(S(1rhk5t45tlxy3e45swjibe55))/pagina
.aspx
Como vemos se introduce una ltima carpeta virtual con un identificador aleatorio y
cifrado (del estilo del que iba en las cabeceras HTTP). Esta carpeta obviamente no
existe pero uno de los gestores de la llamada a las pginas de ASP.NET es capaz de
distinguir que se trata de un identificador de sesin y actuar de manera transparente
para mantenerla y enviar las peticiones a las pginas correctas.
Este mtodo es menos propenso a fallos que el anterior pero tiene el inconveniente de
que se generan URLs mucho ms largas y menos atractivas. Las sesiones sin cookies
no existan en ASP 3.0.
Habilitar este tipo de sesiones es muy sencillo. Basta con abrir el archivo de
configuracin de la aplicacin (web.config) y aadir el siguiente ajuste dentro del
nodo <system.web>:
<sessionState cookieless="UseUri" />
Almacenamiento de sesiones
La informacin referente a los datos de sesin se almacena por defecto en la memoria
del servidor. Ello suscita un problema importante cuando la aplicacin debe ser muy
escalable y tener capacidad para gestionar miles de peticiones simultneas. En estos
casos es frecuente ubicarla en varios servidores balanceados. A medida que llegan
nuevas peticin a la granja de servidores, stas se reparten por las distintas
mquinas que la constituyen, bien aleatoriamente, bien siguiendo algn sistema de
cuotas o asignndolas por orden (round-robin).
Dado que cada mquina mantiene su propia copia de las sesiones, a menos que cada
usuario se redirija siempre al mismo servidor, no habr forma de mantener una
sesin coherente, pues no existe una ubicacin compartida para almacenar los datos
de las sesiones.
Nota:
Existe forma de configurar las granjas de servidores con afinidad de
manera que cada usuario siempre se redirija al mismo servidor. An as
existen otros problemas con la sincronizacin de datos compartidos en
toda la aplciacin y adems el sistema reduce la escalabilidad.
ASP.NET 2.0 permite configurar el almacenamiento de sesiones para utilizar cualquier
proveedor de almacenamiento de sesin diferente al que usa por defecto (y que
www.detodoprogramacion.com
guarda todo en la memoria RAM local). Con la plataforma .NET se entregan dos
proveedores de almacenamiento de sesin adicionales que permiten almacenar los
datos en un servidor ASP.NET central o en una base de datos SQL Server
respectivamente.
Se establece el modo de almacenamiento a travs del archivo web.config:

Figura 5.7.- Configuracin del modo de sesin
La configuracin detallada de estas opciones avanzadas se sale del mbito de este
curso, pero conviene saber que existe esta posibilidad y entenderla bien para poder
emplearla en casos de necesidad.
Nota:
Gracias al modelo de extensibilidad mediante proveedores que ofrece
ASP.NET 2.0 es posible escribir nuestros propios proveedores para
almacenar la sesin del modo que ms nos convenga, si bien no es lo
habitual. Esta caracterstica incluso nos permite definir un formato
propio para los identificadores de sesin aunque hacerlo no es en
general una buena idea.
Duracin de las sesiones
Una sesin se mantiene en memoria en el servidor mientras no transcurra ms de un
determinado tiempo sin recibir actividad por parte de un usuario. Por defecto Internet
Information Server mantiene vivas las sesiones durante 20 minutos, pero se puede
cambiar este ajuste desde las propiedades avanzadas de cualquier servidor o
directorio virtual.
www.detodoprogramacion.com

Figura 5.8.- Establecimiento del tiempo de sesin en IIS
Tambin se puede establecer desde la configuracin de la aplicacin (web.config)
usando el atributo timeOut del mismo nodo que hemos estado usando hasta ahora:
<sessionState timeout="10"/>
Tambin se puede asignar mediante cdigo usando la propiedad Timeout del objeto
Session.
Session.Timeout = 10
Si transcurre el nmero de minutos marcados sin recibir nuevas peticiones de un
mismo usuario los datos de la sesin se eliminan automticamente. Hay que tener
cuidado con esto porque nunca sabemos cuando puede ocurrir, por lo que jams
debemos dar por hecho que una determinada variable de sesin existe.
Podemos forzar el abandono de una sesin desde el cdigo llamado al mtodo
Abandon del objeto Session:
Session.Abandon()
Tipos de objetos almacenables
En ASP 3.0 estaba limitado el tipo de objetos que podamos almacenar en variables de
sesin. Por ejemplo, no se deban almacenar objetos RecordSet de datos o perdamos
escalabilidad, y haba otros tipos de objetos que generaban un error al intentar
almacenarlos. El uso directo de ciertos objetos como las matrices desde variables de
sesin penalizaba el rendimiento.
www.detodoprogramacion.com
En el caso de ASP.NET no existen estas limitaciones y podemos almacenar cualqueir
objeto .NET sin problema cuando usamos el modelo en memoria. En el caso de los
modelos de almacenamiento centralizado los objetos a almacenar deben ser
serializables.

Ver vdeo de esta leccin (Sesiones de usuario)






































www.detodoprogramacion.com


Informacin comn
Variables de aplicacin
Las variables de sesin permiten guardar informacin que concierne a un usuario
concreto y que no es accesible para los dems. Las variables de aplicacin por el
contrario estn pensadas para almacenar en memoria datos que estn accesibles para
todos los usuarios al mismo tiempo.
Las variables de aplicacin se gestionan exactamente de la misma manera que las de
sesin pero usando la propiedad Application de la pgina en lugar de Session.
Por ejemplo, implementar un contador de llamadas a pginas de una aplicacin es
muy sencillo si utilizamos el objeto Application, ya que slo tendramos que escribir en
la carga de cada pgina:
Application("Contador") += 1
Esta variable estar accesible desde cualquier otra pgina de cualquier sesin de
usuario.
Concurrencia en variables de aplicacin
El cdigo anterior presenta un problema poco evidente que tiene que ver con la
concurrencia de uso de las variables de aplicacin. En una aplicacin Web pueden
estar ejecutndose al mismo tiempo varias pginas. De hecho es bastante probable
que existan muchas coincidencias a la hora de escribir en la variable anterior si
metemos ese cdigo en todas las pginas de una aplicacin y hay bastantes usuarios.
www.detodoprogramacion.com
Ello provocara inconsistencias en los valores y, a la larga, que el contenido de la
variable no contuviera el verdadero nmero de peticiones realizadas.
Para evitar estos problemas de concurrencia se definen dos mtodos del objeto
HttpApplication que permiten el acceso en exclusiva a las variables de sesin por
parte de una pgina. La forma correcta del cdigo anterior sera:
Application.Lock()
Application("Contador") += 1
Application.UnLock()
De este modo se bloquea el acceso de las dems pginas a las variables de aplicacin
mientras no se llame al mtodo de desbloqueo y se evitan as los problemas de
concurrencia. Hay que tener cuidado sin embargo con el uso que se hace de esta
caracterstica pues puede afectar a la escalabilidad por bloqueos en las otras pginas.
Nota:
En ASP 3.0 esta era la nica manera de compartir memoria en el mbito
de aplicacin, pero no est exenta de problemas. En ASP.NET se soporta
un mtodo mucho mejor a travs de objetos de cach que ahora
veremos y se desaconseja el uso de las variables de aplicacin en la
medida de lo posible.
Almacenamiento en cach
ASP.NET ofrece un potente sistema de almacenamiento en cach que guarda los
objetos en memoria y es privado para cada aplicacin. De forma anloga a los dos
casos anteriores, existe un objeto Cache que proporciona una interfaz indexada que
permite establecer y recuperar pares de clave-valor. As podemos escribir:
Cache("MiClave") = miValor
....
Response.Write( Cache("MiClave") )
La cach se usa habitualmente para almacenar datos que son costosos de obtener y
que pueden ser aprovechados por todos los usuarios, como por ejemplo un DataSet
resultante de una compleja consulta a una base de datos.
La ventaja fundamental de la cach de ASP.NET frente a las variables de aplicacin es
que es muy fcil conseguir la caducidad automtica de sus elementos.
Por ejemplo, imaginemos que llemos en la variable 'datos' el contenido de un archivo
XML y queremos guardarlo en memoria para uso comn y evitar as el contnuo
acceso a disco para leer el contenido. Si usamos una variable de aplicacin cmo nos
enteraremos de que el contenido del archivo ha cambiado y que, por lo tanto
debemos recargar los datos?
www.detodoprogramacion.com
No hay forma de hacerlo. Podemos establecer un mecanismo propio que cada cierto
tiempo recargue la variable, pero la solucin dista mucho de ser ptima.
Conseguirlo con la cach de ASP.NET es muy sencillo, basta con escribir la siguiente
lnea:
Cache.Insert("MisDatos", datos,
New CacheDependency(Server.MapPath("misdatos.xml")))
En lugar de usar la interfaz de indexacin directa de elementos del objeto Cache
usamos su mtodo Insert que en una de sus versiones sobrecargadas permite agregar
una dependencia a un archivo. A partir de ese momento si el archivo 'misdatos.xml'
cambia, el elemento desaparece de la cach y lo volveremos a cargar la prxima vez
que se consulte.
Tambin se puede establecer la fecha de caducidad de un elemento de la cach con
otra versin sobrecargada del mtodo Insert:
Cache.Insert("MisDatos", datos, Nothing, DateTime.Now.AddHours(2),
TimeSpan.Zero)
Esta lnea agrega el elemento sin dependencia en objeto alguno y con una fecha de
caducidad para dentro de dos horas.
Cache.Insert("MisDatos", datos, Nothing, DateTime.MaxValue,
TimeSpan.FromMinutes(30))
En este caso la caducidad es relativa e indica que el valor caducar en cuanto nadie
haga uso de el durante 30 minutos.
Se pueden agregar dependencias a archivos en disco y a claves en el registro y
tambin combinaciones de estas dependencias. La clase CacheDependency se
puede heredar para crear nuestros propios criterios de caducidad de cach. Incluso es
posible especificar un delegado a una funcin a la que queremos llamar
automticamente cuando el elemento expire y as recargarlo de inmediato.
Si estamos trabajando con SQL Server 2005 podemos aprovechar la existencia de su
sistema de encolado de mensajes (Message Broker) para crear dependencias de
cach en consultas, de forma que cuando se modifiquen los datos de una base de
datos se reciba una notificacin automtica.
Este mecanismo es muy potente y conviene aprender a usarlo bien.






www.detodoprogramacion.com


Cach de salida
La cach de salida de ASP.NET es un mecanismo que nos permite decidir qu partes
de una pgina deben generarse en cada solicitud y cules pueden ser aprovechadas
para posteriores peticiones. Su uso es extremadamente sencillo y pueden aumentar
de forma espectacular el rendimiento de cualquier aplicacin.
Si se defineuna directiva de cach para una pgina o un control de usuario, ASP.NET
no tiene que generarlos ni crear instancias de objetos, etc... tras la primera peticin,
por lo que se obtiene un rendimiento muy elevado ya que slo debe leer el resultado
de memoria y devolverlo.
Como se pueden aplicar las directivas de cach de salida a los controles de usuario, si
necesitamos hace cach slo de determinadas partes de una pgina y no de la pgina
entera, podemos convertir stas en controles de usuario y conseguir el efecto
buscado.
Directiva OutputCache
Para poder hacer cach del contenido de una pgina o un control de usuario hay que
indicar a ASP.NET de qu depende la caducidad de dicho contenido. Para ello se utiliza
la directiva OutpuCache.
La caducidad puede depender del tiempo, de algn parmetro, de una cabecera, etc...
Por ejemplo, la siguiente directiva:

www.detodoprogramacion.com
indica que el contenido completo de la pgina o control deber mantenerse en cach
durante 60 segundos y que la pgina no vara en funcin de parmetro GET o POST
alguno que se le pase. Todas las peticiones a esta pgina recibidas mientras est en
cach se obtienen directamente de ah, sin procesar la pgina. Tras pasar los 60
segundos la pgina se elimina de la cach y la siguiente peticin se procesa de modo
normal volviendo a guardar el resultado en la cach durante otros 60 segundos.
En pginas que, por ejemplo, visualizan muchos resultados obtenidos de una base de
datos y que varan con poca frecuencia puede aumentar muchsimo el rendimiento.
Atributos de OutputCache
Lo ms normal en muchas pginas es que el contenido vare en funcin de diferentes
caractersticas, no que permanezca invariable sin ms durante un determinado
tiempo. Para amoldarse a diferentes situaciones la directiva Outputcache dispone de
varios atributos que permiten elegir el criterio de cach de los contenidos y que son
los siguientes:
VaryByParam: permite especificar que se haga una cach por cada valor
diferente que tome un parmetro que se le pasa a la pgina y que se indica en
este atributo. Por ejemplo, si tenemos una pgina a la que se le pasa un
parmetro "pais" y que devuelve un listado de clientes en dicho pas, al indicar
VarByparam="Pais" conseguiremos una cach de resultados diferente para cada
valor del parmetro. Cuando se le pasa un nuevo valor se ejecuta la pgina y se
almacena el resultado para las restantes veces que se solicite con el mismo
parmetro (durante el tiempo especificado). Si hay ms de un parmetro se
pueden especificar separndolos por punto y coma.
VaryByHeader: guarda una cach para cada valor de la cabecera HTTP
indicada. Por ejemplo si se indica varByHeader="User-Agent" conseguiremos
una versin en cach de la pgina por cada tipo de navegador utilizado para
acceder a la pgina. Se pueden especificar varias cabeceras separndolas por
punto y coma.
VaryByControl: en el caso de controles de usuario su cach se fragmentar
por cada valor de las propiedades del control indicadas en el atributo. No es
vlido en directivas de pgina, slo de controles de usuario y se debe
especificar siempre el VarByparam aunque sea con valor "None".
VaryByCustom: permite implementar nuestro propio criterio de cach. Se
debe implementar la funcin global GetVaryByCustomString (dentro de
Global.asax) a la cual se le pasa el valor del atributo para que pueda decidir
cmo actuar. No vamos a entrar en ms detalles en este curso.
Dnde se hace la cach?
En muchos casos (VarByParam y VarByHeader) es posible especificar en dnde
queremos que se realice la cach. Si indicamos que debe hacerse el cliente, las
peticiones ni siquiera se reciben en el servidor, por lo que todava se gana ms
rendimiento al evitar la peticin. La ubicacin de la cach se indica mediante el
atributo Location de la directiva OutputCache y sus valores posibles son:
Server: valor por defecto. La cach se realiza en el servidor por ASP.NET.
www.detodoprogramacion.com
Client: la cach la hace el propio navegador. Las peticiones ni siquiera se
envan al servidor.
Downstream: se intenta que la cach se haga en el servidor Proxy que realiza
las peticiones (de haberlo).
None: no se realiza cach alguna.
Almacenamiento en disco
En ASP.NET 2.0 las versiones en cach de las pginas y controles se almacenan de
manera predeterminada tambin en disco, no slo en
memoria. Esto sirve para disponer de una cach aunque
haya poca memoria disponible y hace que sta sobreviva
incluso al reinicio del servidor. Se puede deshabilitar este almacenamiento a disco
estableciendo el atributo DiskCacheable a False en la directiva de cach de la pgina
o control.
Sustitucin post-cach
Esta es otra caracterstica de ASP.NET 2.0 que no estaba disponible en versiones
anteriores de la plataforma .NET.
En ASP.NET 1.x si hacamos cach de una pgina en la que todo permaneca
invariable excepto una pequea regin que mostraba, por ejemplo, la hora,
estbamos obligados a dividir la pgina en controles de usuario para evitar la cach
de esa pequea parte. ASP.NET 2.0 aade un nuevo tipo de control llamado
Substitution que permite hacer excepciones a la hora de almacenar en cach una
zona de una pgina. Este control est ubicado normalmente en la ltima posicin de
la lista de controles estndar en el cuadro de herramientas.
El control dispone de una propiedad MethodName que permite especificar el nombre
de un mtodo compartido (esttico) que devuelve una cadena con el texto o HTML a
mostrar en su lugar cuando se genere la pgina a partir de la cach. Este mtodo
toma como parmetro un objeto HttpContext que nos permite acceder al contexto
de la llamada.
Por ejemplo, definimos la siguiente funcin:

y aadimos un control Substitution como este:

Si hacemos cach de la pgina se mantendr todo el contenido excepto el de este
control que mostrar en cada caso el valor devuelto por la funcin compartida
DameLahora.

www.detodoprogramacion.com
Ver vdeo 1 de esta leccin (Uso de la cach de salida)
Ver vdeo 2 de esta leccin (Controles de usuario y post-cach)











































www.detodoprogramacion.com



Seguridad de las aplicaciones
Prcticamente cualquier aplicacin que creemos va a necesitar seguridad en el acceso
a sus diversas secciones. Lo habitual es tener apartados a los que slo pueden
acceder miembros registrados o una zona de administracin restringida a los gestores
del sistema.
ASP.NET 2.0 ofrece multitud de novedades en este aspecto que nos van a simplificar
mucho el trabajo.
Esta leccin habla sobre la seguridad de aplicaciones desde el punto de vista de la
autenticacin y la autorizacin de usuarios. Aprenderemos los fundamentos de gestin
de acceso usando las nuevas caractersticas de ASP.NET 2.0.

Leccin 4: Seguridad de las aplicaciones
o Autenticacin y autorizacin de usuarios
Autenticacin de IIS/Windows
Autenticacin Forms en ASP.NET
o Autorizacin de usuarios
Autorizacin de URLs
Autorizacin declarativa
Autorizacin imperativa
o La nueva API: Membership y Roles
Membership
Roles
Administracin de seguridad de sitios Web
www.detodoprogramacion.com
o Los controles Web de seguridad
El control Login
El control LoginStatus
El control LoginName
El control LoginView
Los controles restantes






































www.detodoprogramacion.com


Autenticacin y autorizacin de usuarios
Disponemos de diversas barreras a la hora de controlar el acceso a los recursos en
nuestras aplicaciones Web. La primera de ellas la constituye el propio servidor de
aplicaciones que en entornos de produccin es normalmente Internet Information
Server (IIS).
Autenticacin IIS/Windows
IIS permite definir mediante su configuracin tanto el modo en el que se autentica a
los usuarios como los permisos de acceso genricos que se ofrecen a los recursos que
sirve. La siguiente figura muestra el aspecto de las ventana que permite ajustar los
mtodos de autenticacin de usuarios que solicitar IIS a los usuarios:
www.detodoprogramacion.com

Figura 5.9.- Configuracin de seguridad de IIS
La ventana de la figura permite configurar si se admiten o no usuarios annimos, y en
este ltimo caso cmo se autenticarn stos contra el sistema. Se puede restringir
tambin el acceso a un recurso (carpeta, directorio virtual o archivo) en funcin de
direcciones IP y dominios.
No vamos a profundizar en este aspecto pues se sale del mbito del curso, pero baste
decir que, para sitios Web grandes accesibles desde Internet la autenticacin de IIS
(que se basa en usuarios de Windows) no es la ms habitual porque se necesitara
una licencia de acceso or cada usuario con nombre. ASP.NET ofrece un gran soporte
para trabajar con los usuarios una vez autenticados con el sistema,
fundamentalmente para averiguar si pertenecen a un determinado perfil de usuario,
incluso en entornos de seguridad centralizada con Directorio Activo.
Autenticacin Forms de ASP.NET
Desde la primera versin de ASP.NET existe un mtodo de autenticacin conocido
genricamente como "Forms" que permite a los programadores crear un sistema
propio de autenticacin de usuarios. En lugar de utilizar usuarios del sistema (IIS
debe permitir el acceso annimo a los recursos), en este caso es el programador el
que debe establecer su propio mecanismo de autenticacin, por ejemplo lanzando
consultas contra una base de datos (ms adelante volveremos sobre este asunto).
El funcionamiento es el siguiente:
www.detodoprogramacion.com

Figura 5.10.- Lgica de autenticacin personalizada en ASP.NET
Cuando un usuario solicita una pgina protegida ASP.NET comprueba si ste se
encuentra ya autenticado o no. Lo sabe porque cuando un usuario se ha autenticado
previamente esta informacin se almacena en una cookie encriptada. Si est
autenticado se le permite el acceso al recurso siendo responsabilidad del programador
definir cualquier comprobacin de autorizacin posterior. En caso de no estar
autenticado se le dirige de forma automtica a una pgina que le solicita las
credenciales de acceso.
Nota:
El uso de cookies era obligatorio en ASP.NET 1.x para utilizar la
autenticacin Forms. ASP.NET 2.0 soporta la autenticacin sin cookies de
un modo muy similar al que hemos visto para sesiones sin cookies:
introduciendo una ruta virtual codificada en todas las peticiones. Slo
hay que utilizar el ajuste <forms cookieless="UseUri"> en el archivo de
configuracin.
Activar la autenticacin Forms en una aplicacin es muy sencillo, y de hecho suele
estar activada por defecto cuando programamos con Visual Studio 2005. Basta con
editar el archivo web.config y aadir la siguiente lnea en la configuracin de
<system.web>:
<authentication mode="Forms"/>
Por defecto la pgina a la que se redirige a los usuarios annimos para que se
autentiquen se llama "login.aspx" pero se puede especificar cualquier otra usando el
atributo loginUrl, por ejemplo:
www.detodoprogramacion.com
<authentication mode="Forms">
<forms loginUrl="entrada.aspx"/>
</authentication>
A partir de ahora todos los usuarios annimos se redirigirn a "entrada.aspx" para
solicitarle las credenciales de acceso.







































www.detodoprogramacion.com


Autorizacin de usuarios
Una vez que un usuario est autenticado, el proceso que regula a qu recursos tendr
acceso se denomina autorizacin.
Para realizar el control de acceso no slo llega con indicar qu mtodo de
autenticacin se usar (en este caso Forms) . Adems hay que especificar a qu
recursos se debe controlar el acceso y de qu manera. En ASP.NET existen diversos
modos de definir la autorizacin de acceso.
Autorizacin de URLs
Consiste en la autorizacin de acceso a determinados recursos de la aplicacin Web
(pginas ASPX, carpetas, archivos...) refrindose a ellos a travs de su ruta relativa
en el archivo de configuracin de la aplicacin.
Se especifica el nivel de acceso requerido mediante una o varias entradas en el nodo
raz de web.config (nodo <configuration>) que tienen un aspecto anlogo al
siguiente:
<location path=facturas.aspx>
<system.web>
<authorization>
<allow users=jose, hector, pablo>
<allow roles=clientes, administradores>
www.detodoprogramacion.com
<deny users="?"/>
</authorization>
</system.web>
</location>
Como se puede observar, la sintaxis es muy sencilla y bastante evidente.
- El nodo location especifica la ruta relativa al directorio actual cuyo acceso se desea
controlar.
- Los nodos allow y deny se emplean para permitir o denegar el acceso a
determinados usuarios o roles de usuario. Se pueden especificar nombres concretos
para stos o utilizar comodines especiales, como en el caso del nodo deny del
ejemplo:
? : representa a los usuarios annimos. En el ejemplo anterior se deniega el
acceso a todos los usuarios que no se hayan autenticado previamente.
* : indica que el criterio se aplica a todos los usuarios, tanto annimos como
autenticados, independientemente de su perfil de usuario.
Pueden incluirse tantos nodos location como sea necesario dentro del archivo de
configuracin.
Lo habitual es incluir junto con el nodo de autenticacin un nodo de autorizacin
explcito que deniegue el acceso a todos los recursos a los usuarios annimos, as:
<authentication mode="Forms"/>
<authorization>
<deny users="?"/>
</authorization>
Dado que puede existir un archivo web.config por cada carpeta de la aplicacin se
pueden establecer distintos criterios de acceso a cada una, agrupando en ellas los
archivos con el mismo nivel de acceso.
Autorizacin declarativa
El sistema de autorizacin por URL es muy potente pues permite definir los permisos
de acceso de los usuarios a cualquier archivo controlado por ASP.NET y adems
hacerlo sin tocar el cdigo. Mediante la autorizacin declarativa de ASP.NET es
posible obtener un control mucho ms granular, llegando incluso a controlar accesos a
clases o mtodos concretos dentro de stas. Es decir, regula la autorizacin dentro
del cdigo de la aplicacin, definiendo a qu partes de ste se debe conceder el
acceso y cmo.
www.detodoprogramacion.com
Mediante simples atributos se controla el acceso a cada mtodo o propiedad de una
clase o a la clase misma:
<PrincipalPermission(SecurityAction.Demand, Authenticated:=true)> _
Class CuentaBancaria
<PrincipalPermission(SecurityAction.Demand, Role:=Cajero")> _
Public Function Consultar() As Integer
...
End Function

<PrincipalPermission(SecurityAction.Demand,
Role:="Interventor")> _
Public Sub ModificarSaldo()
...
End Sub
End Class
En este ejemplo se dispone de una clase llamada CuentaBancaria que representa un
componente de negocio de nuestra aplicacin (ubicado, por ejemplo, en la carpeta
App_Code. Con los atributos especificados se est indicando lo siguiente:
Para poder utilizar cualquier miembro de la clase es necesario que el usuario
actual se haya autenticado.
Slo los usuarios que pertenezcan al perfil "Cajero" tienen acceso a consultar
las cuentas.
Slo los usuarios que pertenezcan al rol "Interventor" pueden actualizar el saldo
de las cuentas.
Esta caracterstica requiere agregar una referencia a System.Security.Permissions
en la seccin Imports de la clase.
Autorizacin imperativa
Este tipo de autorizacin es la que nos permite entremezclar explcitamente en
nuestro cdigo comprobaciones acerca de la identidad de los usuarios, tomando
decisiones en funcin de stas. Ofrece un control todava ms granular, ya que puede
estar en cualquier lugar del cdigo, dentro de un miembro de una clase.
Se fundamenta en el uso de la propiedad User de la clase Page . Esta propiedad
devuelve una referencia a un objeto homnimo, es decir, de tipo User. Su mtodo
IsInRole permite averiguar la pertenencia del usuario actual a un determinado perfil
o rol y tomar decisiones en funcin del resultado.
Por ejemplo en la clase CuentaBancaria del ejemplo anterior permitira limitar el
importe de una transferencia en funcin del tipo de usuario que la realice, as:


www.detodoprogramacion.com
Public Sub Transferencia(cantidad As Decimal)
If cantidad > 1000 Then
If User.IsInRole(interventor) Then
'Transferir
End if
End If
End Sub
En este fragmento vemos como se usa el mencionado mtodo para comprobar si el
usuario es un interventor antes de permitir cualquier transferencia de ms de 1.000
euros.
La principal ventaja de esta forma de autorizacin es el fino control que concede. Sin
embargo conviene no abusar de su uso en la medida de lo posible ya que cualquier
cambio implica tocar el cdigo convirtindolo enseguida en muy dificil de mantener.






























www.detodoprogramacion.com




La nuevas API: Membership y Roles
Todo lo mencionado hasta ahora esmuy interesante pero todava carece de lo ms
importante: cmo autenticamos a los usuarios? Cmo sabemos a qu roles
pertenecen?
Hasta ahora estas preguntas las deba contestar el propio programador ya que en
ASP.NET 1.x era su responsabilidad definir los mtodos de autenticacin de sus
aplicaciones. Ello implicaba normalmente escribir cdigo de consulta contra bases de
datos que validase las credenciales de los usuarios y obtuviese los roles de los
mismos. Luego se creaban objetos de seguridad asignndole estos valores y
asocindolos al contexto de la aplicacin.
ASP.NET 2.0 nos libera por fin de todo ello y ofrece de serie una completa API de
gestin de usuarios que nos evita tener que reinventar la rueda en cada aplicacin.
Membership
Se trata de una nueva API que proporciona una sencilla interfaz de programacin para
almacenar y recuperar informacin sobre los usuarios de nuestras aplicaciones. Lo
ms interesante de todo es que, al igual muchas otras caractersticas nuevas de
ASP.NET 2.0, est basado en un patrn de diseo de proveedores, lo que permite
cambiar los mtodos de trabajo y almacenamiento sin tocar el cdigo de la aplicacin.
La figura siguiente ilustra mejor este concepto:
www.detodoprogramacion.com

Figura 5.11.- Patrn de Proveedores para gestin de usuarios
Por defecto esta API utiliza SQL Server 2005 para almacenar toda la informacin de
seguridad de una aplicacin y va a ser lo que utilicemos durante toda esta leccin.
Pero dada su arquitectura basada en proveedores podemos cambiar el modo de
gestin con slo un ajuste en el archivo de configuracin. incluso, como se ve aprecia
en la figura, es posible definir mtodos de gestin de usuarios propios sin modificar el
cdigo de nuestras aplicaciones. Esto nos permite reutilizar infraestructuras de
seguridad preexistentes que hubisemos creado para ASP.NET 1.x sin perder el
trabajo.
Membership consta de una clase con este nombre que contiene ciertos mtodos
compartidos para poder crear, eliminar y validar usuarios entre otras cosas. As, por
ejemplo, para crear un usuario escribiramos:
Membership.CreateUser("usuario", "clave")
y para validarlo slo hay que usar su mtodo ValidateUser:
Membership.ValidateUser("usuario", "clave")
que devuelve verdadero o falso en funcin de si las credenciales son o no vlidas.
www.detodoprogramacion.com
Existe tambin una clase MembershipUser que representa las propiedades de los
usuarios de la aplicacin.
Roles
Esta API complementa a la anterior para permitir la gestin de los roles de un usuario
y, al igual que sta, est basada en el mismo patrn de proveedores. No es necesario
utilizar el mismo proveedor para los roles que para los usuarios. Por ejemplo, se
pueden autenticar usuarios contra una base de datos SQL Server y obtener los roles
desde el Directorio Activo o las cuentas locales.
Al igual que en el caso anterior los mtodos de la clase Roles son todos estticos y
podemos usarlos sin instanciar nuevos objetos. Por ejemplo:
Roles.AdduserToRole("usuario", "administradores")
Este fragmento agrega un usuario al rol de administradores. Para obtener los roles a
los que pertenece un usuario podemos escribir:
Roles.getRolesforuser("usuario")
que devuelve una matriz de cadenas de texto. Si dejamos el parmetro usuario en
blanco nos devuelve los roles del usuario actualmente autenticado.
La API de roles ofrece tambin una caracterstica de cach automtica de credenciales
que, mediante el uso de una cookie HTTP encriptada, almacena los roles del usuario
durante la duracin de las sesiones para no tener que consultar el origen de datos
cada vez que comprobemos la pertenencia a roles. Esto aumenta el rendimiento en
muchas aplicaciones.
Administracin de seguridad de sitios Web
Con todo lo visto hasta ahora crear la seguridad de un sitio web es muy sencillo. Slo
hay que establecer la autenticacin Forms de ASP.NET y utilizar Membership y Roles
para gestionar a los usuarios.
An as todava queda trabajo. Hay que crear formularios de autenticacin y, antes de
nada, hay que gestionar los usuarios y los roles de la aplicacin.
ASP.NET 2.0 tampoco nos va a dejar solos con esto. Ofrece una completa herramienta
de administracin ya creada de serie y, como veremos enseguida, ni siquiera nos
obliga a crear interfaces comunes de autenticacin y gestin de sesiones.
Antes de nada hay que administrar usuarios y roles. Para ello slo tenemos que
presionar sobre el men Sitio webConfiguracin de ASP.NET y se abrir una web que
nos permite configurar la seguridad de la aplicacin.
www.detodoprogramacion.com

Figura 5.12.- Sitio de configuracin de la seguridad de ASP.NET 2.0
Con esta herramienta podemos dar de alta, modificar o
borrar usuarios y roles, adems de realizar algunos otros
ajustes. Al utilizarla se encarga de modificar el archivo
web.config de nuestra aplicacin si es necesario realizar
algn ajuste.
Adems crea un archivo de base de datos llamado
'ASPNETDB.mdf' en la carpeta App_data. Este archivo es
una base de datos de SQL Server 2005 que se usa para
almacenar toda la informacin de seguridad de los
usuarios. Se hace uso de la nueva caracterstica de
enlazado dinmico de bases de datos de SQL Server para
poder distribuir esta base de datos con la aplicacin y
enlazarla al motor de base de datos slo cuando se vaya a
utilizar.
Nota:
Si hace uso de esta herramienta para crear usuarios en la base de datos
tenga en cuenta que por defecto hay un ajuste de seguridad que implica
el uso de claves complejas. Cualquier clave que introduzca le devolver
el enigmtico mensaje "Introduzca otra contrasea" a menos que use
claves de al menos 7 caracteres de longitud e incluya en ellas un espacio
o un caracter no alfanumtico como un asterisco o un guin bajo. Este
ajuste se puede cambiar mediante configuracin.
El administrador de sitios Web utiliza las clases MemberShip y Roles para realizar su
trabajo. Disponemos de su cdigo fuente completo en la carpeta
www.detodoprogramacion.com
C:\WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx\ASP.NETWebAdminFiles\ y es
interesante examinarlo.

Ver vdeo de esta leccin (Uso de la administracin de sitios y de la API
Membership)







































www.detodoprogramacion.com


Los controles Web de seguridad
Como hemos podido comprobar en los epgrafes anteriores, la gestin de la seguridad
de nuestras aplicaciones se ha simplificado muchsimo con ASP.NET 2.0. Gracias a los
objetos Membership y Roles crear una interfaz de administracin de usuarios y control
de acceso es casi trivial. Podra ser ms fcil?
Pues lo cierto es que s. ASP.NET 2.0 nos facilita todava
ms el trabajo relacionado con la seguridad gracias a la
inclusin de los nuevos controles Web de seguridad. Los
podemos encontrar en el grupo Inicio de sesin del
cuadro de herramientas de Visual Studio.
Estos controles nos dan ya hechas multitud de
operaciones comunes de seguridad relacionadas con la
interfaz de usuario. Por ejemplo, el control Login permite
disponer de un completo dilogo de autenticacin con slo
arrastrarlo sobre un formulario Web. El
CreateUserWizard es un asistente con varios pasos que
permite la creacin automtica de nuevos usuarios. Todos ellos permiten la
personalizacin, tanto parcial por medio de propiedades, como absoluta usando
plantillas. En el caso de los asistentes tenemos libertad de aadir nuevos pasos o
modificar los predeterminados a voluntad.
El control Login
Este control permite definir un completo dilogo de autenticacin en cualquier pgina,
que adems soporta el uso de temas.
www.detodoprogramacion.com

Figura 5.13.- Control de inicio de sesin personalizado estticamente.
Adems de los elementos obvios permite configurar enlaces para acceder a la
creacin de nuevos usuarios, muestra mensajes de fallo de autenticacin, redirige
automticamente a otras pginas al autenticar si es necesario, etc... Todo ello se
controla con facilidad desde la ventana Propiedades de Visual Studio.
Para validar a los usuarios utiliza el mtodo ValidateUser de la clase Membership.
Por defecto, si ya hay un usuario autenticado, este control se oculta automticamente
salvo cuando se ubica en la pgina principal. Este comportamiento se cambia con la
propiedad AutoHide en caso de necesitarlo. As se permite cambiar la sesin de
usuario.
El control LoginStatus
Se utiliza para mostrar el estado actual de conexin de un usuario y permitir su
desconexin. Cuando hay un usuario autenticado el control muestra por defecto un
enlace que permite desconectarse. Lo que ello provoca es que se elimine la referencia
al usuario actual en la propiedad User de la clase Page y que se reenve a la pgina de
autenticacin especificada en web.config para una iniciar nueva sesin.
Cuando no hay usuario alguno autenticado en el sistema el enlace apunta
automticamente a la pgina de autenticacin definida.
Se puede personalizar por completo para mostrar cualquier otra cosa en la superficie
del control.
El control LoginName
Muestra el nombre del usuario actualmente autenticado.
El control LoginView
Se trata de un completo control que permite definir el contenido de una zona de la
pgina en funcin de si el usuario est o no autenticado, y en caso de estarlo incluso
en funcin del rol o roles a los que est asociado.
Es interesante observar su panel de tareas:
www.detodoprogramacion.com

Figura 5.14.- Control LoginView y su correspondiente panel de tareas.
La primera de las acciones, Editar RoleGroups, permite definir los casos que
existirn en funcin de los roles. Por ejemplo si queremos mostrar un mesnaje
diferente segn sea un usuario annimo, un usuario autenticado en general y un
usuario que pertenece al rol de administradores, tendramos que aadir un RoleGroup
con el texto "Administradores" ya que los otros dos casos siempre estn definidospor
defecto.
La lista Vistas contiene un elemento por cada RoleGroup adems de los
correspondientes ausuarios annimos y autenticados en general. Al elegir un
elemento cualquiera de esta lista cambia la plantilla mostrada en el diseador. En la
plantilla podemos introducir controles y cualquier otro elemento, y eso ser lo que
ver el usuario indicado por el RoleGroup correspondiente.
Gracias al control RoleView es extremadamente sencillo personalziar las vistas para
cada usuario disendolo visualmente.
Los controles restantes
PasswordRecovery, ChangePassword y CreateUserWizard nos facilitan la
recuperacin de claves, el cambio de clave y la creacin de usuarios respectivamente.
Al igual que los anteriores ofrecen una altsima capacidad de personalziacin que en el
caso del control de creacin de usuarios permite incluso aadir nuevos pasos en el
asistente (se trata de un control heredado del control de tipo Wizard que nos permite
crear asistentes con facilidad).
Todos ellos utilizan la API de Membership para trabajar y responden a los ajustes
impuestos en la configuracin de la aplicacin. As pues, por ejemplo, el control de
cambio de contrasea o el de creacin de usuarios exigirn a las contraseas la
complejidad indicada en la configuracin, y el de recuperacin de clave le har una
pregunta de seguridad si as est definido.
Gracias a estos controles y a la utilidad de administracin de seguridad de ASP.NET
podemos construir la seguridad completa de una aplicaicn Web en cuestin de
minutos, cuando lo habitual sera que tardsemos horas o das.

Ver vdeo de esta leccin (Uso de controles Web de seguridad)

www.detodoprogramacion.com


Contenido
Este mdulo presenta al alumno los fundamentos de los Servicios Web y las
Arquitecturas Orientadas a Servicios (SOA).
Tras una introduccin a los servicios Web y sus conceptos asociados se ve la forma de
crear y consumir servicios Web desde ASP.NET 2.0 usando Visual Studio 2005.
Leccin 1: Introduccin a los servicios Web
o Qu son los servicios Web?
o Comunicacin entre componentes
o SOAP
Breve historia de SOAP
Las bases tecnolgicas de SOAP
Descubrimiento de servicios: WSDL y UDDI
Leccin 2: Creacin de un servicio Web con ASP.NET 2.0
o
Proyectos de servicios Web
o Archivos del servicio Web
o Tipos de datos
o Descripcin de mtodos
o Parmetros opcionales y sobrecarga de mtodos
Leccin 3: Consumo de un servicio Web
o Examinando manualmente un servicio Web creado con ASP.NET
o Consumiendo un servicio Web desde ASP.NET 2.0
Generacin del proxy
cambio de ubicacin del servicio
Credenciales de acceso
www.detodoprogramacion.com


Qu son los servicios Web?
La expresin "Servicio Web" se oye con fuerza desde hace unos aos en el mbito del
desarrollo de aplicaciones e incluso en ambientes poco tcnicos y de direccin. Lo
cierto es que no se trata de un concepto tan novedoso como cabra esperar y las
innovaciones que conlleva no son tanto tecnolgicas, como conceptuales.
En esta leccin explicaremos desde un punto de vista no-tcnico los conceptos
relacionados con los Servicios Web, cmo funcionan, de dnde vienen y a dnde van.
Un poco de historia: modelos de desarrollo
El hecho de poder comunicar componentes de software entre s tiene una enorme
importancia. Hasta no hace tantos aos era muy tpico hacer aplicaciones de una
sola pieza, "monolticas":
www.detodoprogramacion.com

Figura 6.1.- Aplicacin "monoltica" aunque distribuida.
Estos programas podan acceder a un sistema gestor de datos a travs de la red, pero
toda la lgica del flujo de datos, la seguridad y las interacciones con las personas se
encontraban en el ordenador del usuario en forma de un gran ejecutable. Se suelen
conocer tambin como "fat clients". La situacin descrita no es la ideal ya que implica
problemas de toda ndole a la hora de instalar las aplicaciones y sobre todo cuando se
modifican o actualizan (mantenimiento complejo y engorroso).
Una metodologa de desarrollo mucho mejor aunque ms laboriosa a la hora de
programar es el modelo Cliente-Servidor en tres capas:

Figura 6.2.- Aplicacin Cliente Servidor en tres capas.
www.detodoprogramacion.com
En este modelo toda la lgica de los datos, su validacin, los permisos, etc, residen en
un servidor intermedio y son utilizados por todos los clientes a travs de una red. En
este caso en el ordenador del usuario lo nico que hay es una capa de presentacin
que se ocupa bsicamente de recoger y recibir datos, es decir, acta de intermediario
entre el usuario y las reglas de negocio residentes en la capa intermedia. Este modelo
es ms eficiente y est muy evolucionado respecto al anterior pero an se puede ir
ms all.
La arquitectura de desarrollo en n-capas (n-tier que dicen los anglosajones) lleva el
concepto cliente-servidor un paso hacia adelante, dividiendo la capa intermedia en
muchas otras capas especializadas cada una de las cuales puede residir en un
servidor diferente:

Figura 6.3.- Arquitectura de desarrollo basada en componentes.
En este modelo existe una gran variedad de componentes especializados en tareas
especficas como la validacin de datos, la autenticacin y seguridad o el acceso a
datos. Dichos componentes deben trabajar unos con otros como piezas de un
mecanismo, gestionando la informacin que circula entre el usuario y el servidor de
datos.
La belleza de este modelo radica en que cada uno de ellos (o cada grupo de ellos)
puede residir en un servidor diferente, siendo transparente su ubicacin para los
clientes que los utilizan. Ello aumenta mucho la escalabilidad de las aplicaciones, pues
basta con aadir nuevos servidores e instalar los componentes en ellos para poder
atender ms peticiones.
Por otra parte, y esto es muy interesante tambin, mientras sus interfaces de
programacin sean las mismas, es posible sustituir cualquier componente por otro
actualizado o que acte de manera distinta para corregir errores o cambiar el modo
de trabajo de la aplicacin global, y todo ello sin que los clientes sean conscientes de
ello. Obviamente esto ofrece ms ventajas an ya que, por ejemplo, no es necesario
reinstalar la aplicacin en cada cliente, sino que basta con sustituir un componente en
www.detodoprogramacion.com
un nico lugar y automticamente todos los usuarios tendrn su aplicacin
actualizada.
El concepto de Arquitectura Orientada a Servicios o SOA se basa en el uso de
este tipo de componentes que suplen las necesidades de una o varias aplicaciones,
son independientes entre s y trabajan independientemente del sistema operativo o la
plataforma.
Aunque muchos programadores piensan que SOA est relacionado nicamente con los
Servicios Web lo cierto es que se pueden conseguir arquitecturas SOA con otras
tecnologas como veremos.



















www.detodoprogramacion.com


Comunicacin entre componentes
Existen diversas dificultades tcnicas a la hora de llevar a la prctica las arquitecturas
orientadas a servicios. Entre stas estn la comunicacin entre las distintas capas y
componentes que constituyen la aplicacin, la gestin de peticiones y el balanceado
de carga entre servidores cuando un mismo componente reside en varios de ellos
(para aplicaciones muy grandes con muchos clientes), la gestin de transacciones
entre componentes y algunas otras cosas ms.
Existe la posibilidad de escribir un protocolo de comunicaciones propio que se ocupe
de todas estas cuestiones, pero por supuesto se trata de una opcin muy poco
realista dada la complejidad que conllevara. Para responder a estas necesidades de
los programadores, diversos fabricantes y asociaciones de la industria crearon
servicios y protocolos especficos orientados a la interaccin distribuida de
componentes. Aunque existe una gran variedad, de todos ellos los ms importantes
sin duda son:
DCOM (Distributed Common Object Model), la propuesta de Microsoft, ligada a sus
sistemas Windows. Se trata de algo ms que un protocolo de invocacin remota de
procedimientos (RPC) ya que su ltima encarnacin, COM+, incluye servicios
avanzados para balanceado de carga, gestin de transacciones o llamadas asncronas.
Los parmetros son transmitidos a travs de la red mediante un formato binario
propio llamado NDR (Network Data Representation).
RMI (Remote Method Invocation), es la metodologa de llamada remota a
procedimientos de Java. No se centra en la definicin de interfaces para
compatibilidad binaria de componentes, ni en otros conceptos avanzados, y se basa
en la existencia de un cliente y un servidor que actan de intermediarios entre los
componentes que se quieren comunicar. Es una tecnologa bastante simple que es
fcil de utilizar para aplicaciones bsicas.
www.detodoprogramacion.com
CORBA (Common Object Request Broker Architecture). Se trata de una serie de
convenciones que describen cmo deben comunicarse los distintos componentes,
cmo deben transferir los datos de las llamadas y sus resultados o cmo se describen
las interfaces de programacin de los componentes para que los dems sepan cmo
utilizarlos. Fue desarrollado por el OMG (Object Management Group) en la segunda
mitad de la dcada de los '90 y es el modelo que ms xito ha tenido en el mundo
UNIX. Su mtodo de empaquetado y transmisin de datos a travs de la red se llama
CDR (Common Data representation). Existen diversas implementaciones de distintos
fabricantes.
Estos modelos son buenos y muy eficientes, cumpliendo bien su trabajo pero tienen
algunas limitaciones importantes siendo las principales las siguientes:
Es difcil la comunicacin entre los distintos modelos
Estn ligados a plataformas de desarrollo especficas, lo que dificulta la
comunicacin entre ellas
Su utilizacin a travs de Internet se complica debido a cuestiones de seguridad
de las que enseguida hablaremos.
Existen en el mercado puentes CORBA/DCOM que permiten la comunicacin
entre componentes COM y componentes CORBA, pero su utilizacin es difcil y
aaden una nueva capa de complejidad a las aplicaciones adems de disminuir
su rendimiento.














www.detodoprogramacion.com


SOAP
Las expectativas actuales respecto a los componentes han aumentado. Al igual que
podemos usar un navegador web para acceder a cualquier pgina
independientemente del sistema operativo del servidor en que resida, por qu no
podramos invocar mtodos de componentes a travs de la red independientemente
de dnde se encuentren, del lenguaje en el que estn escritos y de la plataforma de
computacin en la que se ejecuten?.
Esto es precisamente lo que ofrecen los Servicios Web. Gracias a ellos se derriban la
antiguas divisiones resultantes de los modelos de componentes descritos, y la
integracin de las aplicaciones, la ubicuidad de sus componentes y su reutilizacin a
travs de la red se convierten en una realidad.
La tecnologa que est detrs de todo ello se llama SOAP (jabn en ingls). Este
acrnimo (Simple Object Access Protocol) describe un concepto tecnolgico basado en
la sencillez y la flexibilidad que hace uso de tecnologas y estndares comunes
para conseguir las promesas de la ubicuidad de los servicios, la transparencia de los
datos y la independencia de la plataforma que segn hemos visto, se hacen
necesarios en las aplicaciones actuales.
Breve historia de SOAP
SOAP empez como un protocolo de invocacin remota basado en XML diseado por
Dave Winer de UserLand, llamado XML-RPC. A partir de ste se obtuvo en Septiembre
de 1999 la versin 1.0 de SOAP, en la que participo activamente Microsoft y el
archiconocido experto en programacin Don Box.
Esta primera versin fue ms o menos despreciada por los principales fabricantes de
software que en esa poca tenan en marcha un proyecto ms ambicioso llamado
www.detodoprogramacion.com
ebXML. Esto puso en peligro en su nacimiento la existencia de SOAP ya que si los
grandes no lo apoyaban poco se poda hacer. Por fortuna uno de estos grandes
fabricantes, IBM, decidi apoyarlo y en la actualidad no slo acepta SOAP sino que es
uno de lo motores detrs de su desarrollo (dos importantes personas de IBM y su filial
Lotus, David Ehnebuske y Noah Mendelsohn, son autores de la especificacin 1.1 de
SOAP). Sun Microsystems tambin anunci oficialmente en Junio de 2000 que
soportaba el estndar. El hecho de que los tres gigantes del software (Microsoft, IBM
y Sun) apoyen SOAP ha hecho que muchos fabricantes de Middleware y puentes
CORBA-DCOM (como Roguewave o IONA) ofrezcan productos para SOAP, as como
otras muchas pequeas empresas de software.
El paso definitivo para asegurar el xito de SOAP y los servicios web es su envo al
W3C (World Wide Web Consortium) para proponerlo como estndar. La ltima versin
de la especificacin se puede encontrar en www.w3.org/TR/SOAP/.
Este soporte mayoritario hace que su xito y pervivencia estn asegurados y hoy
todas las herramientas de desarrollo del mercado ofrecen en menor o mayor medida
soporte para SOAP. Por supuesto .NET y Visual Studio son los entornos ms
avanzados en la adopcin de SOAP.
La base tecnolgica de SOAP
Lo interesante de SOAP es que utiliza para su implementacin tecnologas y
estndares muy conocidos y accesibles como son XML o el protocolo HTTP.
Dado que los mensajes entre componentes y los datos de los parmetros para
llamadas a mtodos remotos se envan en formato XML basado en texto plano,
SOAP se puede utilizar para comunicarse con cualquier plataforma de
computacin, consiguiendo la ansiada ubicuidad de los componentes.
El uso de HTTP como protocolo principal de comunicacin hace que cualquier
servidor web del mercado pueda actuar como servidor SOAP, reduciendo la
cantidad de software a desarrollar y haciendo la tecnologa disponible
inmediatamente. Adems en la mayora de los casos se puede hacer uso de
SOAP a travs de los cortafuegos que defienden las redes, ya que no suelen
tener bloqueadas las peticiones a travs del puerto 80, el puerto por defecto de
HTTP (de ah la ubicuidad, aunque se pueden usar otros puertos distintos al 80,
por supuesto).
La seguridad se puede conseguir a travs de los mtodos habituales en los servidores
web y por tanto se dispone de autenticacin de usuarios y cifrado de informacin de
forma transparente al programador, usando protocolos y tcnicas como IPSec o SSL,
ampliamente conocidos y usados en el mundo web.
Por otra parte la escalabilidad se obtiene a travs del propio servidor web o incluso
del sistema operativo, ya que la mayora de ellos (por ejemplo IIS) poseen
capacidades de ampliacin mediante clusters de servidores, enrutadores que
discriminan las peticiones y otras tcnicas para crear Web Farms, o conjuntos de
servidores web que trabajan como si fueran uno solo para as poder atender a ms
clientes simultneamente.
www.detodoprogramacion.com
Nota:
Existen ampliaciones al protocolo SOAP base que definen protocolos y
convenciones para tareas especficas como las mecionadas de seguridad,
enrutado de mensajes, los eventos y muchas otras cuestiones
avanzadas. En .NET se implementan mediante los concidos Web Services
Enhancements (WSE) actualmente por su versin 3.0, y en un futuro
inmediato con Windows Communication Foundation, la nueva plataforma
de servicios de comunicaciones de Windows. El estudio de stos se sale
del mbito de este curso.

Como vemos, las tecnologas utilizadas son conocidas y la especificacin SOAP se
refiere ms bien a la manera de usarlas. De este modo las reas cubiertas por la
especificacin se refieren a cmo se codifican los mensajes XML que contienen las
llamadas a procedimientos y sus respuestas, y a la manera en que HTTP debe
intercambiar estos mensajes. Si nos referimos a la esencia del estndar, SOAP trata
de sustituir a los diferentes formatos propietarios de empaquetamiento de datos que
utilizan otras tecnologas (como DCOM o CORBA con NDR y CDR respectivamente),
as como los protocolos propietarios empleados para transmitir estos datos
empaquetados.
HTTP es el nico protocolo definido en el estndar para SOAP pero ste es lo
suficientemente abierto como para permitir que se empleen otros protocolos distintos
para transmitir mensajes SOAP. Por citar unos pocos, se podra utilizar SMTP (correo
electrnico), MSMQ (Microsoft Messaging Queue) para enviar de manera asncrona las
llamadas a procedimientos con SOAP, etc...
Descubrimiento de servicios: WSDL y UDDI
Otro de los estndares que se definen en SOAP es WSDL (Web Service Definition
Language). Se trata de un formato estndar para describir las interfaces de los
servicios web. WSDL describe qu mtodos estn disponibles a travs de un servicio
Web y cules son los parmetros y valores devueltos por stos. Antes de usar un
componente que acta como servicio web se debe leer su archivo WSDL para
averiguar cmo utilizarlo.
Nota:
Para aquellos programadores que conocen otras arquitecturas podemos
decir que WSDL es el equivalente en XML a los lenguajes IDL (Interface
Description Language) de DCOM y CORBA.
Se ha definido tambin un formato estndar para publicacin de informacin de
servicios web llamado UDDI (Universal Description Discovery and Integration). Esta
especificacin permite la creacin de directorios de servicios web, donde se definen
mtodos que permiten consultarlos para encontrar fcilmente aquel servicio que se
necesite. Windows Server 2003 incluye gratuitamente un servidor para implementar
directorios UDDI en organizaciones.

www.detodoprogramacion.com


Creacin de un servicio Web
En el mdulo anterior se presentaron los servicios web: qu son, de dnde vienen y a
dnde van. Tras la teora veremos una sencilla aplicacin prctica construyendo, paso
a paso, un servicio web con Visual Studio 2005, y comprobaremos lo extremadamente
simple que es su creacin con esta herramienta.
Nuestro primer ejemplo ser un servicio web muy simple que se ocupar de devolver
la fecha y la hora actuales del servidor en el que se ejecute.
Proyectos de servicios Web
Para crear un nuevo proyecto que albergue servicios Web slo tenemos que utilizar el
men ArchivoNuevo sitio Web y elegir el tipo "Servicio Web" en lugar del habitual
"Sitio web ASP.NET" tal y como se muestra en la figura:
www.detodoprogramacion.com

Figura 6.4.- Nuevo proyecto de servicios Web
Nota:
En realidad tampoco es necesario puesto que se pueden crear archivos
de servicios web dentro de proyectos de aplicaciones Web "normales"
usando el dilogo Agregar nuevo elemento. Sin embargo, lo habitual es
que se guarden en proyectos separados para facilitar su posterior
gestin.
Archivos del servicio Web
Al aceptar se crean para nosotros diversos
archivos en el nuevo proyecto, tal y como se
observa en la figura del lateral. stos
constituyen el esqueleto de nuestro servicio.
La extensin asignada a los archivos que
representan un servicio Web en ASP.NET es
'.asmx'. En esta figura el archivo Service.asmx
es el que contiene la definicin de nuestro
servicio.
Si hacemos doble-clic sobre Service.asmx se abre su definicin en el editor de Visual
Studio. Lo nico que contiene es la siguiente lnea:

sta se parece mucho a la directiva de las pginas ASPX y, al igual que en ese caso,
define dnde se encuentra en cdigo que dotar de funcionalidad al servicio Web. En
este caso y dado que el servicio Web no posee elementos de interfaz de usuario, del
www.detodoprogramacion.com
nico archivo que nos tenemos que preocupar es del que se indica en el atributo
CodeBehind. ste contiene la definicin de la clase indicada en el atributo Class, y que
en nuestro ejemplo se llama Service.
La clase Service (podra llamarse de cualquier otro modo) est dentro del archivo
Service.vb, el cual se ubica dentro de la carpeta App_Code que como ya hemos
estudiado asegura la compilacin dinmica de los archivos de cdigo que contiene.
Si abrimos el archivo Service.vb, veremos que por defecto contiene el siguiente
cdigo:

Aparte de las preceptivas sentencias Imports, vemos que la clase Service hereda de la
clase WebService. Slo con hacer esto ya obtenemos la funcionalidad necesaria para
gestionar el XML, HTTP y dems tecnologas en las que se basan los servicios Web. su
gestin pasa inadvertida para nosotros.
Los mtodos que un servicio Web expone al exterior son mtodos normales de una
clase a los que se le ha aadido el atributo WebMethod, tal y como se observa en el
cdigo anterior. Es decir, para que uno de nuestros mtodos sea expuesto en un
servicio Web y pueda ser utilizado remotamente desde cualquier otra plataforma o
lenguaje basta con incluir el atributo WebMethod delante y que est contenido dentro
de una clase que hereda de WebService. As de sencillo.
Por ejemplo, elimine el mtodo de ejemplo HelloWorld que introduce Visual Studio y
escriba el siguiente cdigo:
www.detodoprogramacion.com

Ahora disponemos de un mtodo que devuelve la fecha y la hora actuales en el
servidor en el que se ejecute nuestro servicio Web y que puede ser utilizado desde
cualquier otra aplicacin independientemente del lenguaje con el que est construida
y del sistema operativo en el que trabaje. Enseguida veremos cmo.
Este ejemplo, aunque trivial, puede resultar til en entornos, como los de gestin, en
los que la sincronizacin horaria entre clientes y servidores es fundamental para
asegurar la coherencia de facturaciones y otros datos econmicos.
Tipos de datos
Vamos a mejorar un poco el ejemplo. Tratar una fecha a partir de una cadena es un
poco tedioso porque hay que analizarla para obtener sus diversas partes (da, mes,
ao, hora, minutos y segundos) y adems su formato depende del idioma definido en
el servidor, que no tiene porque ser el mismo que tienen los clientes. Lo ideal sera
obtener una representacin nica de una fecha sin preocuparnos de estos problemas.
Al igual que hemos definido como tipo devuelto una cadena podemos definir
perfectamente una fecha, quedando el cdigo as:

Lo nico que hemos cambiado es el tipo a devolver, pero hemos ganado mucho ya
que ste se interpretar correctamente como una fecha en cualquier aplicacin que
consuma nuestro servicio.
La especificacin estndar de SOAP define representaciones en formato XML para
todos los tipos de datos bsicos que nos podemos encontrar en las aplicaciones,
incluyendo cadenas, fechas, booleanos, etc... Cualquier clase (o tipo) que se use
como parmetro o como valor devuelto por un mtodo que se expondr en un
servicio Web se serializa a XML antes de ser enviada a travs de la red tanto en un
sentido como en el otro (cliente-servidor y viceversa).
Serializar a XML un objeto consiste en generar una representacin de los datos de
ste en formato XML de modo que posteriormente puedan ser deserializados en el
otro extremo para obtener un objeto equivalente al original. En el caso de tipos
bsicos la cosa es fcil aunque se debe seguir una convencin para hacerlo. En el caso
de otros objetos ms complejos (como los dataSet, por ejemplo) el formato XML
ovtenido es mucho ms complejo y no se encuentra estandarizado, si bien al ser XML
y disponer de su esquema es muy fcil utilizarlos desde cualquier lenguaje.
www.detodoprogramacion.com
Como resumen de este prrafo hay que quedarse con una idea: slo se pueden
emplear clases serializables como parmetros o valores devueltos por un mtodo
de un servicio Web.
Nota:
Los objetos de la clase DataSet de ADO.NET son objetos serializables
que estn adaptados a la perfeccin para su uso en un servicio Web. De
hecho es muy habitual que se utilicen como valores devueltos y como
parmetros en mtodos de servicios Web. Los DataSet tipados tambin
se incluyen en esta categora y de hecho pueden resultar incluso ms
sencillos de utilizar cuando el servicio se invoca desde entornos
diferentes a .NET.
Descripcin de mtodos
El atributo WebMethod no slo se usa para especificar que un mtodo determinado de
la clase se expondr para su consumo desde el exterior. Adems se usa para
especificar ciertos comportamientos del mtodo. A efectos de lo que nos interesa en
este curso veremos slo uno de los parmetros de este atributo: Description.
Con Description ofreceremos a los programadores que consuman nuestro servicio
informacin sobre lo qu hace el mtodo lo que puede ser de gran utilidad. Con ello
dejamos nuestro mtodo finalmente definido como:

Con esto queda definido nuestro sencillo servicio web de ejemplo. Enseguida veremos
cmo utilizarlo.
Parmetros opcionales y/o sobrecarga de mtodos Web
Imaginemos que tenemos que crear un servicio Web para una tarea determinada
(para simplificar, digamos, realizar una suma), y dicha tarea debe trabajar con
diferentes tipos de datos o debe poder usarse de varias formas con parmetros
diferentes.
En una clase .NET podemos crear versiones sobrecargadas de un mtodo cada una de
las cuales tomar el tipo de datos pertinente, siendo el propio compilador el que
llamar a la versin sobrecargada que convenga en cada caso.
En el caso de un servicio Web a priori puede parecer que no seremos capaces de
obtener el mismo efecto, ya que no podemos exponer dos mtodos Web con el
mismo nombre. Sin embargo existe otro parmetro del atributo WebMethod que
permite conseguir un efecto similar. Se trata de MessageName.
MessageName se utiliza para asignar alias a los mtodos Web que definamos, de
forma que podemos identificar de manera nica a cada uno de ellos, incluso aunque el
www.detodoprogramacion.com
nombre asignado a la funcin sea el mismo. De este modo, si queremos exponer
como servicio Web una clase que posee un mtodo con varias sobrecargas slo
tenemos que emplear este atributo asignndole un identificador diferente a cada una.
Por ejemplo:

Las dos funciones con el mismo nombre y diferentes parmetros son perfectamente
vlidas en VB.NET. Sin embargo si hubisemos colocado simplemente la palabra
WebMethod delante de ambas hubisemos obtenido un error a la hora de compilar ya
que no pueden exponerse dos mtodos con el mismo nombre en un servicio Web.
Cambiando el nombre del mensaje de una de ellas se pueden exponer sin problema
ya que a la hora de consumirlas, aunque tengan el mismo nombre, se distinguen
perfectamente por el nombre del mensaje empleado.
Con esto conseguimos el efecto de mtodos Web sobrecargados.

Ver vdeo de esta leccin (Creacin de un servicio Web de datos)





www.detodoprogramacion.com


Consumo de un servicio web
En esta leccin vamos a estudiar el comportamiento del servicio Web que hemos
creado y aprenderemos a consumirlo desde una pgina ASP.NET adems de a
examinarlos manualmente.
Leccin 3: Consumo de un servicio Web
o Examinando manualmente un servicio Web creado con ASP.NET
o Consumiendo un servicio Web desde ASP.NET 2.0
Generacin del proxy
cambio de ubicacin del servicio
Credenciales de acceso















www.detodoprogramacion.com


Examinando manualmente un servicio Web creado con ASP.NET
La manera ms sencilla de examinar un servicio Web creado con ASP.NET es
navegando con Internet Explorer a la URL del archivo asmx del servicio. En nuestro
ejemplo, si navegamos hacia el servicio horario anterior (basta con presionar F5
desde Visual Studio para conseguirlo), obtenemos una pgina como la de la figura:

Figura 6.5.- Aspecto de la pgina generada automticamente por ASP.NET
www.detodoprogramacion.com
Tal y como comentamos en la primera leccin, para que un cliente pueda consumir un
servicio Web deber primero leer el "contrato" de uso del servicio, es decir,
averiguar los mtodos que ste ofrece y la forma de invocarlos. Como recordar este
contrato est escrito con el lenguaje WSDL (Web Service Description Language). Para
obtener el WSDL correspondiente a nuestro servicio basta con presionar sobre el
enlace "descripcin de servicios" que ofrece la pgina autogenerada. El aspecto del
WSDL es este (parcial):

Figura 6.6.- WSDL de nuestro servicio Web horario.
Este cdigo XML es el que se utiliza para averiguar los mtodos disponibles y como
invocarlos. Como es bastante tedioso leerlo, ASP.NET simplemente lo procesa por
nosotros y genera una bonita pgina Web para informarnos del contenido del servicio
de una forma ms agradable para los humanos.
Lo interesante de esta pgina es que nos permite probar manualmente los mtodos
del servicio Web siempre y cuando utilicen parmetros y valores devueltos sencillos.
Nota:
Esta pgina autogenerada slo se muestra si se accede al servicio Web
en modo local. Si se intenta el acceso desde un equipo remoto no se
tendr acceso por cuestiones de seguridad, aunque es posible habilitarlo
en casos que se haga necesario (para depuracin remota, por ejemplo).
Sin embargo el WSDL (ruta al servicio Web seguido de ?WSDL) s es
accesible siempre ya que es necesario que otras mquinas lo puedan
leer para hacer uso del servicio.
Si presionamos el mtodo Hora obtendremos una pgina de pruebas que nos
permitir invocarlo. Adems dicha pgina nos ofrece ejemplos de mensajes SOAP de
solicitud y respuesta para acceder al mtodo:
www.detodoprogramacion.com

Figura 6.7.- Pgina de prueba delmtodo horario. Se ha resaltado una de las
solicitudes de ejemplo facilitadas.
Como vemos las llamadas a la funcin se realizan con XML. Y el resultado?.
Obviamente tambin ser XML. Si presionamos sobre el botn Invocar obtendremos
el resultado en una ventana aparte:

En este caso la invocacin, dado que la hacemos desde el navegador, se realiza
mediante un POST HTTP 8es decir, como si envisemos un formulario). El XML
devuelto ofrece nicamente el resultado de invocar el mtodo y al tratarse de una
fecha viene codificada de manera independiente al idioma o al sistema operativo, tal y
como define el estndar SOAP.
Cualquier cliente de SOAP sabe interpretar este valor como una fecha y por lo tanto
acceder a sus elementos es una tarea muy sencilla pues se convierte, en el caso de
.NET, en un objeto DateTime normal y corriente tras llamar a la funcin remota.

Ver vdeo de esta leccin (Consumo de un servicio Web - Examinando
manualmente un servicio web)


www.detodoprogramacion.com


Consumo de servicios Web con ASP.NET
Si crear servicios web le ha parecido fcil enseguida comprobar que utilizarlos es
incluso ms fcil todava con ASP.NET.
Crear un proxy para utilizar el servicio
Cree un nuevo proyecto de aplicacin Web y en la pgina Web por defecto agregue
una etiqueta Label1. Este etiqueta la usaremos para mostrar la hora en el servidor
obtenida mediante el uso del servicio Web creado en el apartado anterior.
Para poder hacer uso del servicio Web debemos aadir una referencia al mismo desde
nuestro proyecto. Esto se consigue presionando con el botn secundario sobre el nodo
del proyecto en el Explorador de soluciones y eligiendo la opcin Agregar referencia
Web:
www.detodoprogramacion.com

Figura 6.8.- Agregar referencia web
Al hacer esto se abre un dilogo que nos permite escribir la direccin del WSDL de
algn servicio Web concreto (si nos la sabemos) o buscar servicios Web en diversos
lugares.

Figura 6.9.- Buscar servicios web y agregarlos
Podemos buscar servicios en la misma solucin de Visual Studio, buscar todos los
servicios que haya instalados en la mquina local o examinar directorios UDDI para
conocer los servicios que contienen.
www.detodoprogramacion.com
En nuestro caso agregaremos una referencia al servicio Web de hora que creamos en
el apartado anterior escribiendo la URL en la lnea de direccin URL.

Figura 6.10.- Agregar el servicio Web de hora.
Al seleccionarlo se muestran sus mtodos y debemos asignarle un nombre con el que
accederemos a su funcionalidad desde el cdigo. Por defecto el nombre que Visual
Studio le otorga es localhost, pero debemos utilizar algo ms descriptivo, por ejemplo
ServicioHora como se ha hecho en la figura.
De manera automtica se aade una nueva carpeta
llamada App_WebReferences y dentro de ella una
carpeta por cada referencia a un servicio web que
hayamos aadido. Dentro de esta carpeta hay dos
archivos (.disco y .discomap) que contienen
informacin sobre cmo acceder al servicio Web y una
copia del archivo de definicin del servicio Web
(.wsdl) que indica a ASP.NET cmo utilizarlo.
A partir de ahora disponemos de un nuevo espacio de
nombres llamado como la referencia Web (en nuestro
caso ServicioHora) que contiene una clase con el
nombre de la clase que definimos al crear el servicio
Web (Service en nuestro ejemplo).
As, para utilizar cualquier mtodo del servicio slo
debemos instanciar un objeto de esta clase y llamar al mtodo que nos interese. Por
ejemplo, para mostrar la hora en el servidor en la etiqueta que hemos aadido a la
pgina escribiramos:
www.detodoprogramacion.com
Dim sh As New ServicioHora.Service()

Label1.Text = "Hora en el servidor: " + sh.Hora().ToString()
Por supuesto el mtodo Hora devuelve un objeto de la clase Date de VB.NET y
podemos utilizar cualquiera de sus mtodos, como por ejemplo ToLongDateString
para obtener la expresin larga de la fecha, u operar con l para ver la diferencia con
cualquier otra fecha, etc...
Es decir, si alguien aade la referencia Web por nosotros y no nos dice que estamos
usando un servicio Web desde nuestro cdigo no habr diferencia a la hora de usar
los objetos expuestos a travs del servicio, si bien stos pueden estar ejecutndose
en otro servidor e incluso en otro pas a travs de Internet.
A la clase auto-generada que representa en local a los objetos expuestos por el
servicio web se la denomina proxy.
Nota:
Hacer uso de este servicio Web desde una aplicacin Windows es igual
de fcil que desde una pgina ASP.NET. Tambin podemos permitir que
programadores de otras plataformas hagan uso de nuestro servicio.
Cambio de ubicacin del servicio
Lo ms habitual es que cuando estamos desarrollando el servicio y el cliente se
encuentren en la misma mquina. Incluso en caso de no ser as seguramente el
servicio que usemos para desarrollo no sea el mismo que se utiliza luego en
produccin, cuando la aplicacin est terminada y usndose en el entorno real.
Debido a ello la referencia que hemos aadido al servicio Web no ser vlida al poner
la aplicacin en produccin y deberemos hacer que apunte a la referencia web
correcta.
La propiedad Url de la clase proxy que se crea para acceder al servicio web nos
permite establecer en tiempo de ejecucin la direccin en la que est ubicado el
WSDL del servicio que realmente usaremos. ste obviamente debe ser idntico (su
WSDL debe ser idntica) al servicio web original que usamos en el desarrollo.
Por ejemplo si a la hora de poner en produccin la aplicacin de ejemplo el servicio
Web reside en un servidor cuya URL es www.serviciosweb.com escribiramos:
Dim sh As New ServicioHora.Service()
sh.Url = "http://www.serviciosweb.com/servicioHora.asmx"
....
Por supuesto lo habitual es almacenar esta direccin en el archivo web.config para
recuperarla en tiempo de ejecucin y poder variarla fcilmente sin tocar el cdigo.
www.detodoprogramacion.com
Credenciales de acceso
Podemos proteger el acceso a un servicio Web usando los mtodos de autenticacin u
autorizacin proporcionados por Internet Information Server. Si deshabilitamos la
autenticacin annima y marcamos la autenticacin de Windows, para poder acceder
al servicio deberemos facilitar credenciales de acceso validas. stas se corresponden
con el nombre de usuario y la contrasea de un usuario del sistema. El cdigo
necesario para hacerlo es el siguiente:
Dim sh As New ServicioHora.Service()
sh.Credentials = New System.Net.NetworkCredential("usuario",
"clavesecreta")
....
La propiedad Credentials se usa para enviar las credenciales de cualquier usuario al
servidor.
Se pueden usar las credenciales del usuario actualmente autenticado en la aplicacin
(sin tener que escribir nombre de usuario y contrasea alguno) usando la propiedad
UseDefaultCredentials:
Dim sh As New ServicioHora.Service()
sh..UseDefaultCredentials = True
....
Con esto obtendremos una barrera de proteccin bsica para nuestro servicio Web.
Nota:
Existen una serie de especificaciones adicionales para servicios Web
denominadas Web Service Enhancenments (WSE) que aaden funciones
especiales para autenticacin, privacidad, cifrado, enrutado, y otras
muchas tareas avanzadas. Estos WSE siguen las especificaciones
conocidas como WS-*, que son un estndar de la W3C y la nuev
aplataforma unificada de mensajera de Microsoft, Windows
Communication Foundation, tambin las implementa para sus
servicios web. El estudio de WSE se sale del mbito de este curso.

Ver vdeo de esta leccin (Consumo de un servicio Web - Orgenes de
datos de objetos)





www.detodoprogramacion.com

Aplicacin de ejemplo MSDN Video
A continuacin vamos a desarrollar una aplicacin que nos permita explorar las
principales caractersticas de Visual Studio 2005. Puede descargar el cdigo fuente en
su mquina y explorarlo o modificarlo para conocer de forma prctica cmo usar
ASP.NET para desarrollar aplicaciones reales. Tambin puede explorar los videos
donde construimos esta
aplicacin paso a paso.
La aplicacin
MSDN Video es una aplicacin
de ejemplo empresarial
desarrollada en Espaa por la
comunidad de desarrollo y
Microsoft. Puede utilizarse para
comprobar las mejores prcticas
en la construccin aplicaciones
distribuidas, escalables y con
distintos tipos de clientes
(Windows, Web y mviles).
La aplicacin que desarrollaremos en este tutorial es una versin reducida de MSDN
Video donde podr ver Visual Studio 2005 en accin en un escenario sencillo.
Cdigo fuente de MSDN Video
Puede descargar el cdigo fuente de MSDN Video y visionarlo o editarlo en su mquina.

Nota:
MSDN Video utiliza una base de datos para almacenar su estado. Si
desea ejecutar la aplicacin en su mquina necesitar SQL Server 2005
Express instalado.
www.detodoprogramacion.com
Videos explicativos
Si desea ver cmo se hizo esta aplicacin puede visionar estos videos donde
desarrollamos la aplicacin paso a paso:
Video 1. Introduccin MSDN Video Web y Modelo de Datos
Video 2. El Esqueleto de Presentacin MSDN Video Web
Video 3. Entidades de Negocio y Acceso a Datos de MSDN Video Web
Video 4. Funcionalidad y Enlace de Datos de MSDN Video Web
Video 5. Seguridad en MSDN Video Web
Video 6. Transacciones, Temas y Pieles y Conclusin de MSDN Video Web
MSDN Video empresarial
Puede descargar la versin empresarial de MSDN Video y ver cmo podemos convertir la
aplicacin que hemos desarrollado aqu en un sistema distribuido completo, con acceso a
travs de servicios web desde clientes Windows, Web y dispositivos mviles.
Web de MSDN Video
Cdigo fuente, tutoriales y videos explicativos de la versin completa de MSDN Video.
Desarrolla con MSDN
Puedes colaborar con MSDN Video, te proporcionamos materiales de formacin, videos y
eventos para que aprendas las tecnologas utilizadas en la aplicacin.



















Tomado de:
http://www.desarrollaconmsdn.com/msdn/Cursos/Curso_Desarrollo_web_con_Visual_Stud
io_2005/index.html
www.detodoprogramacion.com

www.detodoprogramacion.com

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y
ms Gratis para el Conocimiento...!
www.detodoprogramas.com
Vistanos y comprubalo



Material para los amantes de la Programacin Java,
C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,
CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas
www.detodoprogramacion.com
Visitanos

Libros Universitarios, Contabilidad, Matemticas, obras literarias,
Administracin, ingeniera y mas

Вам также может понравиться