MICROSOFT .NET FRAMEWORK 2.0 – PARTE 2

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

Reference Types

Reference Types

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

Tipos Stream

Tipos Stream

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.

Advertisement

2 respuestas a esta entrada.

  1. 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.

    Responder

    • 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.

      Responder

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.