Tipo y jerarquía de objetos<br />Los tipos a los que se refiere CTS no son sólo aquellos utilizables al declarar una varia...
Tipo y jerarquía de objetos<br />Esta diferenciación viene debida a que la memoria rápida no es muy grande, con lo que los...
Tipo y jerarquía de objetos<br />Un ejemplo de utilización de variables de los dos tipos, para que puedas apreciar las dif...
Tipo y jerarquía de objetos<br />La definición de tipos por parte del programador es intrínseca al módulo en el que se rea...
Tipo y jerarquía de objetos<br />Boxing (Embalaje) y Unboxing (desembalaje)<br />La operación de Boxingo embalaje sólo se ...
Tipo y jerarquía de objetos<br />Tipos por valor predefinidos más utilizados:<br />Aunque hay unos 300 más.<br />
Tipo y jerarquía de objetos<br />Tipos por referencia predefinidos más utilizados:<br />Aunque hay unos 2.500 más.<br />
Tipo y jerarquía de objetos<br />Tipos genéricos:<br />Son la solución aportada para solventar los problemas de boxing y u...
Tipo y jerarquía de objetos<br />Nullable<bool> b = null;  <br />bool? b = null;<br />if (b.HasValue) <br />	Console.Write...
Tipo y jerarquía de objetos<br />Tipos definidos por el usuario - Estructuras:<br />Son tipos de dato por valor, con lo qu...
Tipo y jerarquía de objetos<br />Para definir una estructura hemos de utilizar la palabra clave struct.<br />Las estructur...
Tipo y jerarquía de objetos<br />Tipos definidos por el usuario - Enumeraciones:<br />Las enumeraciones son tipos que pode...
Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Los tipos, además de contener los dato...
Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Este comportamiento es, por supuesto, ...
Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Como alternativa a este comportamiento...
Tipo y jerarquía de objetos<br />// Declaración del Array<br />Int[] tabla = {3, 1, 2};<br />// Ordena los valores mediant...
Tipo y jerarquía de objetos<br />Tipos por referencia – Streams<br />Permiten el acceso de lectura y/o escritura a disposi...
Upcoming SlideShare
Loading in …5
×

Framework .NET 3.5 05 Tipo y jerarquía de objetos

800 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
800
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Framework .NET 3.5 05 Tipo y jerarquía de objetos

  1. 1. Tipo y jerarquía de objetos<br />Los tipos a los que se refiere CTS no son sólo aquellos utilizables al declarar una variable, en realidad incluyen todo aquello que se pueda instanciar en el código.<br />Es decir, los tipos son realmente objetos, e incluyen todos los objetos utilizables en el código, con lo que el CTS da instrucciones al CLR para la gestión de todo tipo de objetos.<br />Todos los tipos heredan de la clase base System.Object, por lo que los métodos y atributos de esta estarán disponibles en cualquier tipo que definamos.<br />Los tipos se dividen en dos categorías principales: tipos por valor y tipos por referencia, los cuales se diferencian en la forma en la que se gestionan en memoria. <br />Los tipos por valor se almacenan en la memoria rápida o pila (Stack), los tipos por referencia guardan en la pila la dirección de memoria lenta o montón (Heap) en la que realmente están situados los datos. <br />
  2. 2. Tipo y jerarquía de objetos<br />Esta diferenciación viene debida a que la memoria rápida no es muy grande, con lo que los datos ahí almacenados tienen una limitación de tamaño. Por lo tanto los tipos por valor siempre serán datos con poca ocupación de memoria, en cambio los tipos por referencia pueden tener cualquier tamaño, no sufriendo de las mismas limitaciones.<br />Las variables de tipos por referencia pueden ser varias apuntando a la misma dirección de memoria, por lo que si se ejecuta alguna modificación en los datos mediante una de ellas, se estará afectando a todas ellas, por existir sólo una copia de los datos.<br />Las variables de tipos por valor, en cambio, no sufren de éste problema, al tener, cada una de ellas, su propia copia de los datos.<br />El esquema de organización de los tipos en .NET Framework es el siguiente:<br />Tipos por valor<br />Integrados o Nativos<br />Enumeraciones<br />Definidos por el programador<br />Tipos por referencia<br />Auto-descritos<br />Arrays o Matrices<br />Delegados<br />Clases<br />Clases del programador<br />Punteros<br />Embalados (Boxing)<br />Interfaces<br />
  3. 3. Tipo y jerarquía de objetos<br />Un ejemplo de utilización de variables de los dos tipos, para que puedas apreciar las diferencias antes enumeradas:<br />class ClasePrueba<br />{<br /> public int Valor = 0;<br />}<br />class Program<br />{<br /> static void Main(string[] args)<br /> {<br /> int valorA = 0;<br /> int valorB = valorA;<br /> valorB = 999;<br /> ClasePrueba refA = new ClasePrueba();<br /> ClasePrueba refB = refA;<br /> refB.Valor = 999;<br /> Console.WriteLine("Val: {0}, {1}", valorA, valorB);<br /> Console.WriteLine("Ref: {0}, {1}", refA.Valor, refB.Valor);<br /> Console.ReadLine();<br /> }<br />}<br />El resultado sería:<br />Valores: 0, 999<br />Referencias: 999, 999<br />
  4. 4. Tipo y jerarquía de objetos<br />La definición de tipos por parte del programador es intrínseca al módulo en el que se realice, es decir, si defines dos tipos diferentes, pero con el mismo nombre, en diferentes módulos de ejecución, el sistema los tratará como tipos distintos y no habrá ningún problema. <br />Para definir un nuevo tipo siempre se partirá de un tipo existente, aunque sólo sea System.Object, y será necesario especificar su contenido:<br />Su nombre, que ha de ser una cadena de caracteres.<br />El tipo del que hereda, uno y sólo uno, ya que la herencia múltiple no está soportada por el entorno. Como mínimo, System.Object, si ningún otro tipo puede servirte de base para el que estés definiendo.<br />Sus atributos, o Metadatos adicionales proporcionados por el usuario.<br />Su visibilidad, public, protected, private, internaloassembly, ya se verá más adelante en detalle.<br />Las interfaces implementadas, sin limitación de número, pero deberán implementarse todas las del tipo base o heredado.<br />La definición de cada uno de sus miembros (eventos, campos, tipos anidados, métodos y propiedades), incluyendo su firma única.<br />
  5. 5. Tipo y jerarquía de objetos<br />Boxing (Embalaje) y Unboxing (desembalaje)<br />La operación de Boxingo embalaje sólo se aplica a los tipos por valor, consiste en la conversión de un tipo por valor a una variable Object almacenada en el Stack y una copia del tipo por valor almacenado en el Heap, al que apuntará la nueva variable de tipo Object. <br />La operación opuesta Unboxing o desembalaje, consiste en pasar de un tipo Object a un tipo por valor.<br />static void Main(string[] args)<br />{<br />// Tipo por valor<br /> int Importe = 1500;<br />// Embalaje - BOXING:<br /> object OtroImporte = Importe;<br />/* Si cambiamos el tipo por valor, la variable Object mantiene el valor<br /> original ya que los valores de ambas variables son copias independientes */<br /> Importe = 999;<br /> /* Desembalaje - UNBOXING:<br /> Crear un nuevo tipo por valor y asignarle el tipo Object */<br /> int NuevoImporte = (int)OtroImporte;<br /> Console.WriteLine("Valor: {0}, Referencia: {1}, Nuevo: {2}", <br /> Importe, OtroImporte, NuevoImporte);<br /> Console.ReadLine();<br />}<br />Valor: 999, Referencia: 1500, Nuevo: 1500<br />
  6. 6. Tipo y jerarquía de objetos<br />Tipos por valor predefinidos más utilizados:<br />Aunque hay unos 300 más.<br />
  7. 7. Tipo y jerarquía de objetos<br />Tipos por referencia predefinidos más utilizados:<br />Aunque hay unos 2.500 más.<br />
  8. 8. Tipo y jerarquía de objetos<br />Tipos genéricos:<br />Son la solución aportada para solventar los problemas de boxing y unboxing antes mencionados en el paso de parámetros a las clases, estructuras, interfaces y métodos que definamos, ya que permiten retrasar la definición del tipo concreto de dato a utilizar hasta la declaración e instanciación del objeto por parte del código cliente.<br />También nos permiten la definición de código no dependiente del tipo de dato, evitando la duplicidad de clases con la única diferencia del tipo de datos recibidos y/o devueltos.<br />La sintaxis específica es la de nombreClase<T>, en la que T es el nombre del tipo de dato que deberá suministrarse en el momento de definir o crear el objeto.<br />El IntelliSense integrado en el IDE nos facilitará una validación inicial del uso de nuestras clases genéricas.<br />Se pueden especificar restricciones a los tipos de datos que se admitan como argumentos.<br />
  9. 9. Tipo y jerarquía de objetos<br />Nullable<bool> b = null; <br />bool? b = null;<br />if (b.HasValue) <br /> Console.WriteLine("b is {0}.", b.Value); <br />else <br /> Console.WriteLine("b is not set.");<br />Tipos nullables:<br />Son aquellos tipos por valor que pueden contener un valor nulo (null).<br />Su sintaxis es Nullable<T> o T?<br />
  10. 10. Tipo y jerarquía de objetos<br />Tipos definidos por el usuario - Estructuras:<br />Son tipos de dato por valor, con lo que contendrán directamente sus valores, almacenándose en el stack, siendo esto lo que las diferencia de las clases.<br />Las estructuras se componen de otros tipos de dato, combinados para facilitar su manipulación.<br />Un ejemplo sencillo es System.Drawing.Point, la cual contiene unas propiedades enteras, X e Y, que definen la posición horizontal y vertical de una coordenada espacial.<br />Esta estructura dispone también de un constructor y unos miembros, para facilitar su utilización.<br />Using System.drawing;<br />// Creamos un punto<br />System.Drawing.Point p = new System.Drawing.Point(20, 30); <br />// Movemos el punto diagonalmente<br />p.Offset(-1, -1); <br />Console.WriteLine("Point X {0}, Y {1}", p.X, p.Y);<br />
  11. 11. Tipo y jerarquía de objetos<br />Para definir una estructura hemos de utilizar la palabra clave struct.<br />Las estructuras se pueden convertir de tipos por valor a tipos por referencia cambiando esta palabra clave por class. <br />Aunque las estructuras suelen ser más eficientes que las clases, siempre y cuando cumplan las siguientes condiciones:<br />Representen un valor lógico único.<br />El tamaño de instancia no sea superior a 16 bytes.<br />Que no cambie frecuentemente después de la creación.<br />Que no se transforme a tipo por referencia mediante casting.<br />
  12. 12. Tipo y jerarquía de objetos<br />Tipos definidos por el usuario - Enumeraciones:<br />Las enumeraciones son tipos que podemos definir para almacenar listas de valores fijos relacionados.<br />Los valores almacenados serán una lista de enteros, aunque nos referiremos a ellos, y visualizaremos sus valores, mediante sus símbolos correspondientes.<br />Evitando de esta manera los habituales errores de índice en nuestra programación.<br />Unos ejemplos de enumeraciones podrían ser los siguientes: <br />La lista de meses.<br />Los días de la semana.<br />Los mensajes de error.<br />¿Alguno más?<br />Para declarar una enumeración deberemos utilizar la palabra clave enum, seguida de su nombre y de la lista de los símbolos correspondientes a sus valores.<br />enum diaSemana {lunes, martes, miércoles, jueves, viernes, sébado, domingo};<br />
  13. 13. Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Los tipos, además de contener los datos correspondientes, suministran los medios para su manipulación y almacenamiento, en caso necesario, mediante los diferentes miembros definidos.<br />Por ejemplo:<br />string cadena = "Este es el texto almacenado";<br />cadena = cadena.Replace("almacenado","sustituido");<br />Console.WriteLine(cadena");<br />Este es el texto sustituido<br />El problema con este tipo de operaciones es que los objetos de tipo string son inmutables, es decir, la sustitución anterior no se efectuará sobre los datos iniciales de la instancia. En su lugar se creará una segunda copia de la cadena inicial, con el texto sustituido y se cambiará el puntero del objeto al nuevo contenido, quedando los datos anteriores sin referencia, a expensas de ser eliminados por el Garbage Collector.<br />
  14. 14. Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Este comportamiento es, por supuesto, transparente al programador, por lo que uno se puede preguntar cuál pueda ser la repercusión real de este comportamiento.<br />Se puede fácilmente imaginar una larga lista de valores de cadena de caracteres a la que se deba aplicar una modificación, concatenando un texto adicional o añadiendo una fecha, …<br />Cada modificación que se realice sobre cada una de las cadenas de texto creará una nueva cadena. Dada la velocidad actual de proceso de los ordenadores, la realización de la operación anterior puede llegar a procesar grandes cantidades de datos en muy poco tiempo. Lo cual, inicialmente, es lo adecuado. El problema es que esa cantidad de variables descartadas y pendientes de limpieza, puede llegar a saturar la memoria del ordenador, obligando a efectuar paginaciones y operaciones que harán más lenta la operativa.<br />
  15. 15. Tipo y jerarquía de objetos<br />Tipos por referencia – String y StringBuilder<br />Como alternativa a este comportamiento del tipo string, disponemos del tipo stringBuilder, el cual ha sido optimizado para este tipo de manipulaciones y efectúa las modificaciones sobre la misma instancia de datos, evitándose de esta forma la saturación antes comentada.<br />Adicionalmente, el tipo stringBuilder dispone de una sobrecarga de operadores que simplifica la operativa con ellos:<br />
  16. 16. Tipo y jerarquía de objetos<br />// Declaración del Array<br />Int[] tabla = {3, 1, 2};<br />// Ordena los valores mediante el método del tipo<br />Array.Sort(tabla);<br />// Muestra el resultado<br />Console.Writeline("{0}, {1}, {2}", tabla[0], tabla[1], tabla[2]);<br />1, 2, 3<br />Tipos por referencia – Arrays<br />Permiten almacenar colecciones de valores en un único objeto, accesibles mediante índice.<br />Se declaran utilizando los corchetes y separando sus elementos mediante comas.<br />Se pueden ordenar mediante su método sort:<br />
  17. 17. Tipo y jerarquía de objetos<br />Tipos por referencia – Streams<br />Permiten el acceso de lectura y/o escritura a dispositivos, tanto discos, como comunicaciones.<br />La clase System.IO.Stream es la clase base para los streams específicos para cada tipo de acceso.<br />Disponiéndose también de streams de acceso a redes en el espacio de nombres System.Network.Sockets y de streams encriptados en System.Security.Criptography.<br />Los streams básicos más comunes son:<br />

×