domingo, 21 de abril de 2013

Introducción a la plataforma .NET



Plataforma .NET







Hola GENTE de #LAWEB! hoy les vengo a hablar un poquito de .NET...

NET es un amplio conjunto de bibliotecas de  que pueden ser utilizadas por otras  para acelerar enormemente el desarrollo y obtener de manera automática características avanzadas de seguridad, rendimiento, etc.



.
NET es mucho más que eso ya que ofrece un entorno gestionado de ejecución de aplicaciones, nuevos lenguajes de programación y compiladores, y permite el desarrollo de todo tipo de funcionalidades: desde programas de consola o servicios Windows hasta aplicaciones para dispositivos móviles, pasando por desarrollos de escritorio o para Internet. 

El sistema de tipos… 

Visual C# 2010 está totalmente integrado con .NET Framework, por tanto los tipos de datos que podremos usar con este lenguaje serán los definidos en este "marco de trabajo". 
Los tipos de datos que podemos usar en Visual C# 2010 son los mismos tipos de datos definidos en .NET Framework y por tanto están soportados por todos los lenguajes que usan esta tecnología. Estos tipos comunes se conocen como el Common Type System, (CTS). 

El hecho de que los tipos de datos usados en todos los lenguajes .NET estén definidos por el propio Framework nos asegura que independientemente del lenguaje que estemos usando, siempre utilizaremos el mismo tipo interno de .NET, si bien cada lenguaje puede usar un nombre (o alias) para referirse a ellos, aunque lo importante es que siempre serán los mismos datos, independientemente de cómo se llame en cada lenguaje. 

Esto es una gran ventaja, ya que nos permite usarlos sin ningún tipo de problemas para acceder a ensamblados creados con otros lenguajes, siempre que esos lenguajes sean compatibles con los tipos de datos de .NET

Tipos primitivos…



Promociones numéricas implícitas (automáticas)… 
El compilador de C# siempre intentará usar el valor más adecuado cuando estamos utilizando distintos tipos de datos. 

Esas promociones, (convertir un valor de un tipo pequeño en otro de mayor capacidad), las realizará solamente en los tipos de datos que no produzcan pérdida de información o que están contempladas en el compilador. 
Por ejemplo, podemos asignar un valor de tipo short a un tipo long, ya que no se producirá ningún tipo de pérdida de información, porque el valor de un short es menor que el de un long.



Conversiones numéricas explícitas… 
Hay ocasiones en las que el compilador considera que no se pueden hacer ciertas conversiones o asignaciones entre variables o valores literales de distintos tipos de datos. 

Pero si nosotros sabemos que es posible hacerlas, podemos obligar al compilador a que las acepte. De esa forma no recibiremos ningún error y la aplicación se creará correctamente. 
Otra cosa es que cuando el programa esté en ejecución esa conversión que hemos hecho de forma explícita, es decir, obligando al compilador a hacerla, puede fallar, por la sencilla razón de que no se pueda hacer. 

Para hacer una conversión explícita, lo haremos de esta forma:



Es decir, incluimos entre paréntesis el tipo de datos al que queremos convertir y a continuación indicamos el valor a convertir.

¿Cuándo debemos usar las conversiones explícitas? 
Las conversiones explícitas las tenemos que usar en todos los casos que no se adecuen a los casos mostrados en la tabla de promociones numéricas implícitas. 

¿Siempre funcionan las conversiones explícitas? 
Habrá situaciones en que una conversión explícita produzca un error de desbordamiento o bien se asigne el valor máximo permitido por el tipo de destino desestimando el resto del valor asignado. 

Este comportamiento lo podemos cambiar de forma que si hacemos ese tipo de conversión, sólo se almacene en el tipo de menor capacidad el valor que pueda soportar, desechando el resto, pero debido a que esto puede producir pérdida de información, hay que hacerlo de forma explícita, indicándolo con la instrucción unchecked

En el siguiente ejemplo, se producirá un error de compilación indicándonos que el valor que queremos almacenar es muy grande para el tipo de destino: 



Para solucionarlo debemos usar la instrucción unchecked: 



Si en lugar de trabajar con un literal lo hacemos con una variable, el compilador no sabe qué valor contiene la variable, por tanto compilará sin problemas, aunque ese error de desbordamiento se puede producir en tiempo de ejecución. 

Funciones de conversión… 

Aunque C# no dispone de funciones de conversión, .NET Famework si que las tiene, además de que los propios tipos de datos soportan algunas, por ejemplo, para convertir un valor numérico en uno de tipo cadena, podemos usar el método ToString() que todos los tipos de .NET tienen. 

Pero si queremos realizar otras conversiones entre distintos tipos numéricos, usaremos la clase Convert, la cual tiene funciones para realizar conversiones entre los tipos numéricos soportados por .NET: 



Variables y Constantes… 
Disponer de todos estos tipos de datos no tendría ningún sentido si no los pudiéramos usar de alguna otra forma que de forma literal. Y aquí es donde entran en juego las variables y constantes. 

1.Constantes literales, por ejemplo, cuando usamos 12345, estamos usando un valor constante, ya que ese número siempre tendrá el mismo valor. 
2.Constantes con nombre, son constantes a las que le damos un nombre y tampoco pueden cambiar. 

Declarar constantes… 
Las constantes literales las usamos directamente, tal como hemos visto anteriormente, pero para usar las constantes con nombre debemos declararlas previamente, para ello utilizaremos la instrucción const, tal como vemos en este ejemplo: 



Como podemos comprobar, tenemos que utilizar una instrucción para indicar que es una constante, (const), seguida del tipo de datos y el valor que le asignaremos a esa constante. 

Declarar variables… 
En la declaración de las variables en Visual C# 2010, siempre hay que indicar el tipo de datos que tendrá la variable, por la sencilla razón de que las variables definidas en C# siempre se harán usando el tipo de datos sin necesidad de utilizar ninguna instrucción especial que indique que es una declaración. 


Las cadenas de caracteres en .NET, y por tanto en C#, se definen indicando la cadena entre comillas dobles. 



Para paliar este pobre rendimiento de las cadenas en .NET, podemos usar la clase StringBuilder, la cual deberíamos usar preferentemente cuando realicemos concatenaciones o uniones de cadenas, ya que esa clase no crea nuevas instancias y para ello se utilizan métodos que nos permiten realizar esa unión de cadenas; el ejemplo anterior lo podemos convertir de esta forma: 



Tipos Anónimos… 
En C# tenemos la posibilidad de utilizar una técnica que se conoce como tipos anónimos o variables inferidas automáticamente.



Tipos Nullables… 
En C# podemos declarar tipos nullables, definidos así porque pueden representar un tipo nulo ó null en su declaración. 


Enumeraciones: Constantes agrupadas… 
Una enumeración es una serie de constantes que están relacionadas entre sí. La utilidad de las enumeraciones es más manifiesta cuando queremos manejar una serie de valores constantes con nombre, es decir, podemos indicar un valor, pero en lugar de usar un literal numérico, usamos un nombre, ese nombre es, al fin y al cabo, una constante que tiene un valor numérico. 

Podemos declarar una enumeración de varias formas: 

1)Sin indicar el tipo de datos, por tanto serán de tipo int: 


Arrays (matrices)… 
Los arrays (o matrices) nos permitirán agrupar valores que de alguna forma queremos que estén relacionados entre sí. 

Declarar arrays… 
En C# los arrays se definen indicando un par de corchetes en el tipo de datos. 

Por ejemplo, para indicar que queremos tener un array llamado números para almacenar valores de tipo int, lo haremos de esta forma: 
Esta declaración simplemente indica que la variable números "será" un array, pero aún no está inicializada. 



Para iniciarla, al menos con valores cero, podemos hacerlo de estas dos formas, dependiendo de que ya hayamos declarado previamente la variable, (primera línea), o lo queramos hacer al declararla, (segunda línea): 


En ambos casos debemos usar new seguido del tipo de datos y entre corchetes el número de elementos que tendrá el array. Ese número indicará el total de elementos que tendrá el array, pero debido ha como .NET trata los arrays, el índice inferior será cero y el índice superior será uno menos del número de elementos que hemos indicado al crear el array. 

Para asignar valores a los elementos de un array, lo haremos como con cualquier variable, pero usando los corchetes y la posición en la que queremos guardar ese valor: 

Para recorrer todos los elementos que tenga un array podemos hacerlo de la forma tradicional, es decir, usando un bucle for con una variable que recorra todos los índices, en cuyo caso necesitamos averiguar el valor del índice superior del array, cosa que haremos por medio de la propiedad Length, tal como podemos ver en este código: 


Como vemos, para acceder a cada uno de los valores, el elemento al que queremos acceder lo indicamos dentro de corchete la otra forma de hacerlo es mediante un bucle foreach, pero debido a que foreach obtiene cada uno de los valores que le indiquemos, no necesitamos acceder directamente al array, sino que usaremos el valor obtenido en cada ciclo del bucle, tal como podemos comprobar en este trozo de código: 


Declarar e inicializar un array… 
Al igual que podemos declarar variables e inicializarlas al mismo tiempo, con los arrays también podemos hacerlo, aunque la sintaxis es un poco distinta, ya que en esta ocasión debemos indicar varios valores. Esos valores los indicaremos justo después de definir el array: 



En este caso, cuando iniciamos el array al declararlo, no debemos indicar el número de elementos que tendrá ese array, ya que ese valor lo averiguará el compilador cuando haga la asignación. Tampoco es válido indicar el número de elementos que queremos que tenga y solo asignarle unos cuantos menos (o más), ya que se producirá un error en tiempo de compilación. 

Si el array es bidimensional (o con más dimensiones), también podemos inicializarlos al declararlo, pero en este caso debemos usar doble juego de llaves:


En este código tendríamos un array bidimensional con los siguientes valores:
nombres[0,0]= Juan 
nombres[0,1]= Pepe 
nombres[1,0]= Ana
nombres[1,1]= Eva

 Como podemos ver en la declaración anterior, si definimos arrays con más de una dimensión, debemos indicarlas, en la declaración del tipo, usando una coma para separar cada dimensión, o lo que es más fácil de recordar: usando una coma menos del número de dimensiones que tendrá el array. En los valores a asignar, usaremos las llaves encerradas en otras llaves, según el número de dimensiones. 

Aunque, la verdad, es que hay algunas veces en las que hay que hacer un gran esfuerzo mental para asociar los elementos con los índices que tendrán en el array, por tanto, algunas veces puede que resulte más legible si indentamos o agrupamos esas asignaciones, tal como vemos en el siguiente código


Cambiar el tamaño de un array… 
Visual C# 2010 no nos ofrece una forma fácil de cambiar el tamaño de un array, de hecho no tiene ninguna instrucción que sirva para eso. 
Aunque redimensionar un array realmente no tiene ningún problema, ya que simplemente lo haremos de la misma forma que vimos anteriormente:


E incluso podemos asignarle nuevos valores al "redimensionarlo": 


Lo que no podemos hacer en C# es cambiar el tamaño de un array conservando el contenido anterior, algo que en otros lenguajes si es posible. La única forma de conseguirlo, es hacer una copia previa de ese array, redimensionarlo al nuevo tamaño y volver a copiar el contenido anterior.


Si el array contiene valores por valor, podemos usar otro método: Clone, ya que este método devuelve una copia "superficial" del objeto en cuestión, en nuestro caso el array; esa copia superficial significa que solo copiará el contenido del array, pero el valor que devuelve ese método es del tipo object, es decir el tipo genérico de .NET, por tanto tendríamos que hacer una conversión al tipo array.


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, en C# podemos hacerlo de dos formas: 
1)Redimensionando el array indicando que tiene cero elementos, aunque en el mejor de los casos, si no estamos trabajando con arrays de más de una dimensión, tendríamos un array de un elemento, ya que, como hemos comentado anteriormente, los arrays de .NET el índice inferior es cero. 
2)Asignar un valor null al array

Los arrays son tipos por referencia… 
En Visual C# 2010 los arrays son tipos por referencia, los tipos por referencia realmente lo que contienen son una referencia a los datos reales no los datos propiamente dichos 

¿Cuál es el problema? 


Definimos el array nombres y le asignamos cuatro valores. A continuación definimos otro array llamado otros y le asignamos lo que tiene nombres. Por último asignamos un nuevo valor al elemento cero del array nombres. 

¿Qué ha ocurrido? 
Debido a que los arrays son tipos por referencia, solamente existe una copia de los datos en la memoria y tanto la variable nombres como la variable otros lo que contienen es una referencia (o puntero) a los datos. 
Además de los métodos que hemos visto y de la propiedad Length que nos sirve para averiguar cuántos elementos tiene un array, tenemos más métodos y propiedades que podemos usar, por ejemplo para saber cuántas dimensiones tiene un array (Rank) o saber cuál es el índice superior de una dimensión determinada (GetUpperBound). 

¿Qué es ADO .NET? 
Es la tecnología principal para conectarse a un gestor de bases de datos, con un alto nivel de abstracción, lo que nos permite olvidarnos de los detalles de bajo nivel de las bases de datos. 

Además ADO.NET es una tecnología interoperativa. Aparte del almacenamiento y recuperación de datos, ADO.NET introduce la posibilidad de integrarse con el estándar XML, los datos pueden 'Serializarse' directamente a y desde XML lo que favorece el intercambio de información 

ADO.NET proporciona diferentes clases del nombre de espacio System.Data dentro de las cuáles, destacaremos por encima de todas, la clase DataView, la clase DataSet y la clase DataTable

Este conjunto de clases de carácter armónico, funcionan de igual forma con la capa inferior que es la que corresponde a los proveedores de acceso a datos con los que podemos trabajar. 

Esto facilita el trabajo en n-capas y la posible migración de aplicaciones que utilicen una determinada fuente de datos y deseemos en un momento dado, hacer uso de otra fuente de datos.

Capas o partes de ADO .NET… 
Dentro de ADO.NET tenemos dos partes importantes. 
•La primera de ellas es la que corresponde con el nombre de espacio System.Data y que constituye los objetos y clases globales de ADO.NET. 
•La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una determinada fuente de datos desde ADO.NET y que utilizan así mismo, las clases del nombre de espacio System.Data



Para resumir de alguna forma la imagen anterior, diremos que el trabajo de conexión con la base de datos, la ejecución de una instrucción SQL determinada, una vista, etc., la realiza el proveedor de acceso a datos. 

Recuperar esos datos para tratarlos, manipularlos o volcarlos a un determinado control o dispositivo, es acción de la capa superior que corresponde con el nombre de espacio System.Data. 

System.Data… 
La clase DataTable: Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos interactuar con ella. 

Ejemplo… 
En este veremos cómo utilizar un DataSet y nos muestra cómo podemos acceder a los objetos que dependen de un DataSet para recuperar por ejemplo, los campos y propiedades de una determinada tabla o tablas. 


La ejecución de este código generaría el siguiente resultado: 


Proveedores de acceso a datos… 
Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al acceso de datos y es la responsable de establecer la comunicación con las fuentes de datos. 

El objeto Command: Este objeto es el que representa una determinada sentencia SQL o un Stored Procedure. :jchan: Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos conjuntamente con el objeto DataAdapter que es el encargado de ejecutar la instrucción indicada. 

El objeto DataAdapter: Este objeto es quizás el objeto más complejo y a la vez complicado de todos los que forman parte de un proveedor de acceso a datos en .NET. Cuando deseamos establecer una comunicación entre una fuente de datos y un DataSet, utilizamos como intermediario a un objeto DataAdapter. 

A su vez, un DataAdapter contiene 4 objetos: 
1)SelectCommand es el objeto encargado de realizar los trabajos de selección de datos con una fuente de datos dada. En sí, es el que se encarga de devolver y rellenar los datos de una fuente de datos a un DataSet. 
2)DeleteCommand es el objeto encargado de realizar las acciones de borrado de datos. 3)InsertCommand es el objeto encargado de realizar las acciones de inserción de datos. 4)UpdateCommand es el objeto encargado de realizar las acciones de actualización de datos. 

Los objetos DeleteCommandInsertCommand yUpdateCommand son los objetos que se utilizan para manipular y transmitir datos de una fuente de datos determinada, al contrario del objeto SelectCommand que tan sólo interactúa con la fuente de datos para recuperar una porción o todos los datos indicados en el objeto Command. 

El objeto DataReader: Este objeto es el utilizado en una sola dirección de datos. Se trata de un objeto de acceso a datos muy rápido. Este objeto puede usar a su vez el objeto Command o el método ExecuteReader

Esquema general de la estructura de acceso a datos… 



Para comunicarnos con una fuente de datos, siempre deberemos establecer una conexión, independientemente de si la conexión con la fuente de datos va a permanecer a lo largo del tiempo o no.

•El objeto Connection nos permite por lo tanto, establecer la conexión con la fuente de datos. 
•El objeto DataSet nos permite por otro lado, recoger los datos de la fuente de datos y mandárselos a la aplicación. 
•Entre medias de estos dos objetos, encontramos el objeto DataAdapter que hace las funciones de puente o nexo de unión entre la conexión y el objeto DataSet

Arquitectura de Programación… 


1.Capa de Presentación: Son todas las páginas Web [HTML, ASPX, JS] que participan en la aplicación, desde aquí se ingresan los datos por medio de formularios. 
2.Capa de Comunicación: Constituye un conjunto de Servicios Web, que funcionan como una interfaz de comunicación con la capa lógica. 
3.Capa Lógica: Es un conjunto de clases que realizan el proceso lógico y matemático de la aplicación, así como también el almacenamiento temporal de la información. 
4.Capa de Acceso de Datos: En esta capa se realiza la obtención y almacenamiento de los datos por medio del Controlador de Datos que estarán en SQL Server. 

Esta INFORMACIÓN es de mi autoria  y pueden descargarla de en mi página de #SCRIB, es contenido propio y con derechos de autora @kgc19 


Introducción a la plataforma .Net (versión inicial incompleta)

Introducción a la plataforma .Net (versión completa)

 Dudas o comentario sobre el tema no duden en preguntar!!
Youtube Programación, ScribdTaringa, mis paginas
PURAVIDA desde !!  
 

No hay comentarios:

Publicar un comentario