Sobre las Colecciones en .NET


¿Quien no ha utilizado un lista en algún desarrollo?, he visto como algunos desarrolladores (algunos novatos y otros no tanto) odian los famosos Arrays o arreglos y ven en la Lista (List<T>) un excelente compañero, pero quizás algunos consciente o inconscientemente obvian que detrás de esa dinámica lista en memoria sigue existiendo un Array como el de toda la vida… (¿Te acuerdas de VB 6.0?), pues si, a algunos les parecerá un hecho desastroso, otros quizás lo intuían, el objetivo de este post es profundizar en la razón de ser de esto.

Básicamente el tipo List no es más que un buen administrador de un arreglo común y corriente, y que si de tener cuidado se trata deberás tener el mismo que con los Arrays.

¿Como lo administra entonces?

Básicamente el Tipo List<T> contiene un arreglo del tipo definido es decir:

List<T> lista = new List<T>();
T[] arreglo = new T[];

Ambos son prácticamente iguales.

De hecho el tipo List internamente tiene un campo de Tipo T[] llamado _items, y otro llamado _emptyArray, el primero es la versión actual de la lista que estamos manejando y es este el que se re-dimensiona (crea y descarta) cuando hacemos uso de los metodos Add, AddRange, Remove, Clear, etc…

Un hecho muy importante es que esta re-dimensión se realiza con cierta lógica y este es el punto mas importante, predeterminadamente las lista si no se especifica una capacidad en el constructor, se crea con cero items y su array interno esta totalmente vacío.

T[] _items;
T[] _emptyArray = new T[];

//Constructor sin parámetros del tipo List<T>
public List()
{
   _items = _emptyArray;
}

Cuando agregamos el primer ítem (Invocamos al método Add(item); ) este se re-dimensiona a 4 ítems, es decir, olvida el arreglo anterior (vacío) y crea un nuevo arreglo con 4 ítems, asignando al primero de ellos el elemento que estamos agregando, luego de esto, las siguientes 3 inserciones con el método Add no modificarán el tamaño del arreglo (_items), para la quinta invocación del método Add, este crecerá el arreglo al doble del tamaño establecido (8 items) copiando los ítems ya asignados mas el ítem agregado dejando las últimas posiciones (3 items) vacías, repitiéndose este ciclo hasta que se llegue al limite de ítems permitidos.

Este límite es impuesto principalmente por uncampo interno de la clase Array asi:

internal const int MaxArrayLength = 0X7FEFFFFF;
/*Este valor correspondería a un
 entero de 2146435071, es decir
 unas 2GB de elementos.*/

¡Nota Importante!

 

  • Si tienes alguna idea de cuantos items podrá tener la lista a crear, es bueno que invoques la sobrecarga del constructor que pide como parámetro la capacidad inicial de la lista, esto evitará una re-dimensión innecesaria y constante del array interno, pero ten cuidado una capacidad sobre dimensionada podría saturar la memoria RAM.

Hasta aquí este post.

Juan Lombana

Anuncios

Generación de código con CodeDOM


CodeDOM (Code Document Object Model) es una tecnología que nos permite Generar y Compilar código dinámicamente, Todo se basa principalmente en representar el código sobre una estructura que vincula los objetos entre si, el inicio de esta estructura es el  CodeCompileUnit la cual es el inicio del árbol, todo esto es “Traducido” por un proveedor del lenguaje en el cual queramos generarlo (por defecto el Framework dispone de proveedores para C#, VB.Net y JScript).

Combinar esta técnica con otras podría representar una gran herramienta de la cual podríamos sacar ventaja:

Por ejemplo:
CodeDom + Serialization+ Reflection  = Aplicaciones Explosivas!!!
(Podriamos añadir aquí AppDomains y mucho más!).

Comenzando con CodeDOM

CodeDom funciona como un arbol de elementos jerarquicos, los cuales vamos referenciando y agregando al elemento principal (CodeCompileUnit).

He preparado unos videos con una aplicación de prueba.

1/3

2/3


3/3

Nota: Espero aun subir estos videos con una Buena Calidad… jejeje 🙂

Hasta la próxima.

Juan Manuel Lombana

Accediendo a Servicios Web Cross-Domain desde Silverlight


Después de un rato sin escribir, retomaré con algunos temas bastante interesantes, este es el primero de ellos.

Lo más común cuando desarrollamos un aplicación sobre silverlight es que esta tenga un servicio el cual le entrega los datos y la lógica del negocio, por comodidad el servicio siempre se encontraba en la aplicación web que hospedaba la aplicación de silverlight (o por lo menos así lo hacia yo para evitarme mayores problemas :$) , para estos casos la aplicación funcionaba perfectamente, pero cuando el servicio no se encontraba en este directorio era toda una odisea hacerlo funcionar!…

¿Cómo funcionan el acceso a los servicios Cross-Domain?

Cuando silverlight accede a un servicio web lo primero que verifica es el dominio en donde este se encuentra hospedado, si este se encuentra en un domino diferente al propio busca un par de archivos; el primer es el clientaccesspolicy.xml si este no existe silverlight buscará crossdomain.xml; estos archivos deben estar en la raíz del dominio en donde se hospeda el servicio web.

Los servicios más comunes en internet como Twitter, Amazon, Youtube disponen de archivos crossdomain.xml en la raiz de su dominio (Twitter tiene algunas restricciones en este archivo – Gracias Rodrigo)

Además de este hecho tener el servicio y el cliente de silverlight en un mismo directorio no es lo más seguro.

Manos a la Obra!

Después de tener listo nuestro servicio web (En otro proyecto obviamente) y tener creado nuestro cliente de silverlight dispuesto a consumir dicho servicio tendremos que crear el siguiente archivo.

El cual debe estar en la Raíz del Dominio en donde se hospeda el servicio web.

   <?xml version="1.0" encoding="utf-8"?>
   <access-policy>
      <cross-domain-access>
         <policy>
            <allow-from http-request-headers="*">
               <domain uri="*"/>
            </allow-from>
            <grant-to>
               <resource path="/" include-subpaths="true"/>
            </grant-to>
         </policy>
       </cross-domain-access>
   </access-policy>

Con esta configuración cualquier dominio podrá acceder a todos los recursos que se encuentran en el dominio actual.

Si el acceso al servicio se realiza sobre HTTPS desde un cliente en HTTP debe colocar la siguiente configuración entre los elementos <allow-from></allow-from>

<allow-from http-request-headers="*">
   <domain  uri="http://*"/>
</allow-from>

Es de anotar que Silverlight 4 nos evita esta configuración SI y SOLO SI el cliente de silverlight esta corriendo fuera del explorador con permisos Elevated-Trust (Como si se tratase de una aplicación windows común corriendo con privilegios).

Para ampliar mas información sobre este tema pueden visitar.

http://msdn.microsoft.com/es-es/library/cc197955%28VS.95%29.aspx

Hasta la Próxima.

Juan Manuel Lombana