October 2004 - Posts

Utilización de Tipos Parciales en .Net
20 October 04 10:56 PM | mmonterroca | with no comments

Acabo de terminar un articulo en cuanto a la utilización de Tipos Parciales en .Net (Clases Parciales, Estructuras Parciales, Interfases Parciales)

Espero sea de su interes.

 

http://neo-mx.com/blog/articles/169.aspx

 

Ejemplo de utilización de Generics
07 October 04 10:53 PM | mmonterroca | with no comments

Un ejemplo de generics

 

Todo elemento agregado a un arraylist de hecho a cualquier colección (a menos que creemos nuestra propia colección derivando de CollecionBase)  es almacenado como un objeto (System.Object) con lo cual siempre obligamos a que se este haciendo un boxing y unboxing del tipo que queramos agregar.

 

     ArrayList listaInt = new ArrayList();

 

            for (int intN = 0; intN <= 10; intN++)

            {

                listaInt.Add(intN); //Se almacenara como objeto

            }

 

            int valor = listaInt[0];

 

 

Si realizáramos la compilación de este código el compilador nos dará un error en la línea, int valor = listaInt[0];

Ya que un objeto no se puede convertir explícitamente a un tipo Int

 

 

Para poder realizar la compilación necesitamos convertir explícitamente el elemento a un tipo Int, una vez realizado esto, nuestro ejemplo compilara. Al realizar este proceso estamos haciendo el Boxing  de Integer a System.Object y el unboxing de System.Object a Integer L

 

intvalor = (int) listaInt[0];

 

Esto nos da pie a tener otro tipo de errores no contemplados dentro del desarrollo de nuestra aplicación, ya que como vimos el  ArrayList nos permite almacenar cualquier tipo de dato llegando a tener un caso como este.

 

ArrayListlista = new ArrayList();

            lista.Add(1);

            lista.Add(2);

            lista.Add("3");

            lista.Add(4);

            foreach (int elemento in lista)

            {

                Console.WriteLine("Elemento {0}",elemento);

            }

 

Este ejemplo no tendra errores al momento de la compilación, pero no sucedera lo mismo al momento de la ejecución, podran notar que el tercer elemento es de un tipo String, los demás elementos podremos considerarlos como Int, al realizar el barrido de los elementos especificamos que nuestra variable es de tipo Int, pero al llegar al elemento 3 la aplicación incurrira en una exepción ya que el elemento 3 como habiamos dicho es de tipo String

 

 

 

El verdadero problema es que esto no lo detectaremos hasta que nuestra aplicación este en ejecución ya que es muy común que almacenemos nuestros datos a partir de objetos de entrada, como textboxes, combos etc. sin hacer el Cast correspondiente al tipo de dato que en su momento necesitemos utilizar

 

 

Aquí es donde se puede ver una utilización de generics al poder crear una clase que funcionara como un Array pero al cual forzosamente es inicializado con el tipo de dato especifico con el cual queramos trabajar.

 

Para este caso se creo una clase llamada ArrayGenerics (el código de la clase se muestra al final)  la cual será inicializada con el tipo de datos que necesitemos en nuestro caso es un Integer (Int) el cual es especificado inmediatamente después del nombre de la clase , al ser inicializada con un tipo especifico esta clase no admitirá ningún tipo de dato diferente al especificado en nuestro caso solo admitirá tipos de datos Int

 

ArrayGenerics<int> listaGen = new ArrayGenerics<int>();

            listaGen.Agregar(1);

            listaGen.Agregar(2);

            listaGen.Agregar(3);

 

            foreach (int elemento in listaGen)

            {

                Console.WriteLine("Elemento {0}", elemento);

            }

 

 

 

 

Al haber sido inicializado con un tipo de dato especifico nos estamo olvidando de Boxing y Unboxing ya que el dato almacenado siempre será del tipo solicitado.

 

 

Si al ejemplo anterior quisieramos agregarle un tipo diferente, por ejemplo un string “3”  

 

ArrayGenerics<int> listaGen = new ArrayGenerics<int>();

            listaGen.Agregar(1);

            listaGen.Agregar(2);

            listaGen.Agregar(“3”);

 

este código nos generara el siguiente error:

 

 

El cual nos indica un mensaje de error el cual nos indica que no se puede convertir explícitamente un tipo de dato string  en un int, una de las ventajas es que este error nos lo dara en tiempo de compilación con lo cual podremos siempre evitar excepciones en tiempo de ejecución

 

Como mencionabamos, generic toma cualquier tipo de dato, en este caso utilizaremos la misma clase pero ahora para crear un arreglo de controles TextBox.

 

ArrayGenerics<TextBox> listaGen = new ArrayGenerics<TextBox>();

            listaGen.Agregar(new TextBox);

            listaGen.Agregar(new TextBox);

            listaGen.Agregar(new TextBox);

 

 

La clase por supuesto tendra que hacer referencía al namespace System.Collections.Generic

 

La única diferencia que tiene contra una clase “común” es la declaración de la misma, a la  cual se le incluye inmediatamente después del nombre de la clase la declaración de un nombre de datos genérico en nuestro caso el cual cuando la clase sea instancía sera reemplazado por el tipo especificado en ella.

 

ArrayGenerics<TextBox> listaGen = new ArrayGenerics<TextBox>();

 

 

En ejecución    será sustituido por

 

Aqui les dejo el código de la clase ArrayGenerics, la cual solo sirve de manera explicativa.

 

 

publicclass ArrayGenerics    //Definición de la clase con el que sera el que substituira con el tipo que se declare en la clase

    {

 

        private elemento ElementoAlm;   //Elemento actual alamacenado

        public ArrayGenerics()

        {

            ElementoAlm = null;

        }

 

        public void Agregar(TipoDato tp)//Se le pasa el tipo de dato definido (asignado cuando se declara la clase)

        {

            elemento tmpElemento = new elemento(tp);    //Elemento temporal

            tmpElemento.Siguiente = ElementoAlm;    //Se almacena el  elemento anterior como siguiente

            ElementoAlm = tmpElemento;  //Se asigna el nuevo elemento como el actual

        }

 

        public IEnumerator GetEnumerator()

        {

            elemento elementoActual = ElementoAlm;  //Se asigna el nodo actual

 

            while (elementoActual != null)

            {

                yield return elementoActual.Dato;   //Se regresa el elemento

                elementoActual = elementoActual.Siguiente;  //Se asigna el elemento almacenado como siguiente

            }

        }

 

        private class elemento

        {

            private elemento ElementoSiguiente = null;

            private TipoDato dato;

            public elemento(TipoDato tp)

            {

                dato = tp;

            }

 

            public TipoDato Dato

            {

                get{return dato;}

                set { dato = value; }

            }

 

            public elemento Siguiente

            {

                get { return ElementoSiguiente; }

                set { ElementoSiguiente = value; }

            }

        }

    }

 

 

 

 

 

 

 

[Now Playing: Genesis - Mama (05:20)]

Obtener servidores de Sql .Net
07 October 04 02:28 PM | mmonterroca | with no comments

Para obtener una lista de todos los servidores Sql disponibles hay que realizar lo siguiente

Agregar un referencia al objeto Microsoft.SQLDMO Objet Library

Y ejecutar el siguiente código

 

Dim sqlDmoCls As New SQLDMO.ApplicationClass

Dim intX As Integer

For intX = 0 To sqlDmoCls.ListAvailableSQLServers.Count - 1

Console.WriteLine(sqlDmoCls.ListAvailableSQLServers.Item(intX))

Next