Seguimos con el .Net Framework 2.0…
Traduccion del capitulo 1 del libro Microsoft .NET Framework 2.0 – Application Development Foundation (Las imagenes son copiadas del libro)
Leccion 2: Usando Tipos Por Referencia Comunes
La mayoría de los tipos del .Net Framework son tipos por referencia. Los tipos por referencia proveen gran flexibilidad y excelente rendimiento cuando son pasados como argumentos de métodos.
Que es un tipo por referencia (reference type)?
Los tipos por referencia almacenan la dirección de sus datos, también se conocen como punteros, sobre el stack. Los datos actuales de estas referencias son almacenados en un área de la memoria llamado el heap. El runtime administra la memoria usada por el heap a través de un proceso llamado el garbage collection. El garbage collection recupera la memoria periódicamente cuando se necesite, disponiendo de los ítems que llevan tiempo sin ser referenciados. El garbage collection ocurre solo cuando se necesita o es lanzado por la llamada a GC.Collect. Automaticamente el garbage collection esta optimizado para aquellas aplicaciones en donde la mayoría de las instancias son de vida corta, excepto para aquellas ubicadas al inicio de la aplicación.
Comparando el comportamiento entre value types y refence types
Los reference types representan una dirección del dato en lugar del dato en si mismo. Al asignar una variable value type a otra, se crea una nueva copia del dato en el stack de la memoria, en cambio, asignar una variable reference type a otra, solo crea una segunda copia de la referencia, ambas apuntando a la misma dirección de memoria. Cuando se modica una copia de una variable value type, solo esta se ve afectada (todas las copias pueden tener valores distinto). Cuando se modifica una copia de una variable reference type, todas sus copias se ven afectas (todas las copias apuntan a la misma dirección de memoria y todas modifican el mismos valor, todas tienen el mismo valor).
Built-in reference types
Hay alrededor de 2500 built-in reference types en el .Net Framework, todo lo que no derive de System.ValueType es un reference type. La siguiente tabla muestra los más comunes:
Tabla 1-2 Refence Types Comunes
String y StringBuilder
Los strings de System.String son inmutables en .Net. Esto quiere decir que ningún cambio a un string causa que el runtime cree un nuevo string y abandone el viejo, en código:
string s = “hola”; //crea hola
s += “ john”//matiene el anterior en memoria y crea uno nuevo: hola John; es decir hay ahora dos strings en memoria.
Solo el último string tiene una referencia, los otros serán puestos a disposición del garbage collection. Esto genera un uso excesivo del garbage collection y perjudica el desempeño de la aplicación. Hay varias formas de solucionarlo:
· Use los métodos Concat, Join o Format de la clase String para unir varias cadenas en una sola.
· Use la clase StringBuilder strings dinámicos (mutables).
Usar la clase StringBuilder es la solución más flexible ya que esta puede abarcar varias cadenas. El constructor por defecto crea un buffer long de 16 Bytes, el cual crece según sea necesario.
Como crear y ordenar arrays
La clase encargada del manejo de los arrays es System.Array.
Int[] miArray = {1, 3, 2};//declarando e inicializando un array
Array.sort(miArray);//ordenando un array
Como usar Streams
Permiten leer y escribir en disco y comunicarse a través de la red. La clase encargada del manejo de las tareas específicas de streams es System.IO.Stream. Los network streams se encuentran en System.Network.Sockets y los encrypted streams se encuentran en System.Security.Criptography.
Tabla 1-3 Tipos streams comunes
StreamWriter file = new StreamWriter(“text.txt”);//crear y escribir en un archive de texto
file.WritreLine(“Hola Mundo”);//escribir en el archivo de texto
file.Close();//cerrar el archivo
StreamReader file = new StramReader(“text.txt”);//abre el archivo
Console.WriteLine(file.ReadToEnd());//lee el archivo de principio a fin y lo imprime
file.Close();//cerrar el archivo
Como lanzar y capturar excepciones
Las excepciones son eventos inesperados que interrumpen la ejecución normal de un assembly. El .Net framework incluye varias clases que me permiten manejar errores, la más común es la clase Exception que contiene un mensaje de error, otras que describen diferente tipos de eventos derivan de System.SystemException y las definidas por el usuario derivan de System.ApplicationException. El runtime solo ejecuta un bloque catch, el que haga juego con la primera excepción. Es recomendable organizar los bloques catch del más específico al menos específico (filtrado de excepciones). Es muy útil utilizar el bloque finally para realizar tareas que se necesitan hacer ya sea que ocurra o no una excepción, ya que independientemente de que ocurra o no una excepción, todo lo que este dentro de este bloque será ejecutado. Aunque el manejo de excepciones cuesta un poco en el desempeño de la aplicación, facilita enormemente el debugging y mejora la experiencia de usuario.


Publicado por Leonardo Polo en febrero 24, 2009 at 7:53 pm
OK, muy buena informacion, quisiera conocer un poco mas de info acerca de captura de exepciones, en mi caso estoy trabajando un proyectico pequeño en el que uso VS2005 (visual basic) y access, aun no cuadro la captura de exepciones (ejemplo: la duplicacion de identificadores).
Te agradeceria cualquier informacion.
Publicado por johnalvarado en febrero 25, 2009 at 9:52 pm
Hola Leonardo, .Net ya trae un buen numero de excepciones que puedes manejar para cosas especificas, incluyendo excepciones a nivel de bases de datos. Tambien puedes crear las tuyas hererando de Exception.
Lo basico para el manejo de excepciones:
1. Todo lo que pueda generar una excepcion deberia ir dentro del bloque try.
2. El manejo a las excepciones (que hacer si pasa una) deberia ir dentro del bloque catch.
3. Todo lo que se debea liberar (recursos, por ejemplo cerrar una conexion, un archivo, etc.) y que se deba ejecutar ya sea que se genere una excepcion o no, deberia ir dentro del bloque finally.
Asi, por ejomplo:
try {
File
res = a / b;//error si b == 0;
}
catch(Exception e) {//o catch (DivideByZeroException dc): .Net ya trae la excepcion
Console.WriteLine("No es posible dividir entre cero");
}
finally {
file.close();//se cierra el archivo ya sea que se genere una excepcion o no.
}
Para las excepciones de SQL, mira la clase SQLException.
Espero aclare en algo tus dudas.