Camino hacia la certificación .Net Web Developer Capítulo 1 - Tipos de variables, Boxing and Unboxing y Casting

Primera entrada, espero sea de su agrado y para aquellos ya expertos, sea algo nostálgico el recordar cómo empezamos en la programación, sin si quiera conocer esto. Empezemos....

En el curso que estoy tomando en Cibertec, me dieron un libro el cual es Microsoft Oficial Course 2956A Core Foundations of Microsoft .Net 2.0 Development (Luego publicaré una fotito :D)

El día de hoy avanzaré hasta donde pueda, creo que llegaré hasta la parte anterior a interfaces, pues este último tema es muy extenso.

Comenzaremos tal como lo hace el libro.

System Types

Estos son, si se puede decir, los tipos de dato pre-construidos. Además, son conocidos como tipos de dato primitivo. (No haré mucho hincapié en este tema que es algo extenso, pero lo mencionaré cuando sea necesario)

Tipos por valor

Son los system types que contienen su data actual asignado a sí mismos (luego explicaré por qué suena algo redundante esto).

Como ejemplos de este tipo tenemos:

- System.Char

- System.Int32

- System.Single, etc.

Características de los tipos por valor:

· Son almacenados en el snack de la memoria.

· Debido a que cada uno tiene directamente su valor, ningún par de tipos por valor, puede apuntar al mismo dato o valor.

· En las llamadas que se pasan por argumentos tipos por valor, lo que se genera es una copia, siendo ésta independiente de la otra. Es decir, si la copia modifica su valor dentro de la llamada, la variable de tipo por valor no se verá afectada.

Ejemplo:

class Program

{

static void Main(string[] args)

{

Int32 valor = 5;

Console.WriteLine(valor);

(new Program()).sumar(valor);

Console.WriteLine(valor);

Console.ReadLine();

}

public void sumar(Int32 valor){

valor += 1;

}

}

Una forma muy simple de visualizar la última característica que mencioné es este código simple, obviamente no sigue normas de nomenclatura ni demás, eso lo veremos luego en 3 secciones completas de prácticas a seguir.

Y antes de dejar este tema, cabe resaltar que un tipo por valor también pueden llegar a ser datos definidos por el desarrollador, como son:

· Estructuras

· Constantes

· Enumeradores

Tipos por referencia (Reference Types)

La diferencia más resaltante de estos system type, es que lo que almacenan es una dirección, la cual recién apunta dónde se encuentra su data. Con esto último podemos adelantarnos a algo, ya que lo único que contiene cada tipo por referencia es una dirección, podemos tener 2 tipos por referencia apuntando al mismo espacio de memoria.

Ahora que hablamos de memoria, destaquemos la 2da característica que lo hace diferente de los tipos por valor. Los tipos por referencia almacenan la dirección en el stack, tal como lo hacen los tipos por valor, PERO su data (es decir, hacia donde apunta la dirección) se encuentra en el heap, el cual es otro espacio de memoria que se encuentra separado del stack.

Tal como dicen, un gráfico explica mejor las cosas, así que acá lo tienen:









Esa es una forma de separar las cosas de mejor forma. si es que llego a conseguir una mejor imagen, en lugar de la que hice, la editaré al instante.

Ejemplo de tipos por referencia:

· Clases

· Interfaces

Boxing y Unboxing

Vamos a definirlas de una forma muy fácil y sencilla.

Boxing es el proceso de convertir un tipo por valor a un tipo por referencia.

Unboxing, como ya lo habrán supuesto, es el proceso de convertir un tipo por referencia a un tipo por valor.

Ejemplos simples:

Boxing

int a = 100;

object o = a;//Acá es donde sucede el boxing

a = 200;

Console.WriteLine("The value-type value = {0}",a );

Console.WriteLine("The object-type value = {0}", o);

Unboxing:

int a = 100;

object o = a;//Acá es donde sucede el boxing

a = 200;

Console.WriteLine(a);

a = (int)o;

Console.WriteLine(a);

Como comentario para aquellos que desean tener un estilo de programación más elegante y más inteligente al momento de hacer las cosas. El boxing y unboxing hacen lento al compilador, pues no es buena práctica hacer esto, siempre hay que buscar alguna otra salida, si es que no la hay, ya en esos casos hay que utilizar el boxing y unboxing, pero donde no recomiendo usarlo es en un loop que va a iterar muchísimas veces, eso sería ser muy criminal con el compilador.

Casting

(Este es el último tema que tocaré por hoy, ya que no pensé que me iba a tomar tanto tiempo el explicar cosas que para nosotros son simples, pero para muchos que recién inician en este mundo es algo importante y les sirve de base)

Siempre hemos escuchado palabras que españolizamos diciendo “debes de castearlo”, “castéalo”, sí, sé que suena feo, pero muchas veces hablamos así y es verdad, dentro del mundo de la programación conocemos esta palabra muy bien.

Casting es el proceso de conversión de tipo de dato (OJO, no es necesariamente convertir un tipo por valor a un tipo por referencia) de uno a otro. Por ejemplo, convertir un Single a un Double, un Int32 a un Double, entre otros.

Existen 2 tipos de Casting:

Casting Implícito: Se da cuando se indica que se debe de hacer el casteo, sino que se le deja el trabajo al compilador. Ejemplo:

Int32 entero;

Double decim;

entero = 100;

decim = entero;

Casting explícito: Es cuando se indica que hay una conversión, ¿para qué hacerlo? para asegurarse que la conversión se realiza sin perder datos. Por ejemplo, en el caso anterior, qué hubiese pasado si la última línea fuese invertida, debido a cómo se almacena cada dato en el stack, se podría llegar a perder algunos datos. Para esto, se indica explícitamente que se desea hacer un casteo, para esto entraré en detalle en unos cuantos tipos de casteo:

· Ctype.- Es un casteo que se realiza aún en VB .net

· ConvertToXXXX.- Se puede utilizar tanto en VB, C# y demás lenguajes que vienen con el Visual Studio, ya que es parte del framework.

· CInt,CDbl,etc .- Se realizaba en VB6 y creo que hasta ahora se puede realizar.

· DirectCast.- Solo sirve para tipos por referencia, no para los tipos por valor.

· TryCast.- Es uno de los mejores casteos existentes en el framework, ya que permite manejar internamente la conversión, de tal forma que si sucede un error, no provoca la caída del programa, sino que maneja el error de forma interna.

La recomendación que les doy a todos aquellos que deseen manejar el casting, usen esta lista priorizando de abajo para arriba, es decir, si es que un día desean hacer un casteo, mejor hacerlo con el último, si es que por casualidad no se acuerdan, usen el DirectCast y así van subiendo hasta no acordarse nada XD.

Tómenlo muy en cuenta si es que desean manejar de una mejor forma sus conversiones de tipos de dato sin necesidad de colocarle un try catch o cosas por el estilo.

Este ha sido todo el primer artículo, luego proseguiré con otros temas como Special System Types, Generics y excepciones.

He intentado ser lo más detallista posible en varios puntos pues sé que este blog no va dirigido solo a personas que tienen más de un año desarrollando.

Mejoraré poco a poco mis artículos, así que las críticas y correcciones son bienvenidas.

Gracias totales =D

Estado: Cansado T_T



Shinji

3 comentarios:

Yog Sototh dijo...

Buena voz! En cibertec las certificaciones Microsoft son la voz! Pero yo seguiré fiel al Open Source. Bienvenido a la blogósfera Shinji!!

Anónimo dijo...

Felicitaciones ps tío, haber si escaneas todo el libro y lo subes a la mula XD

Diego Silva dijo...

Cibertec rules! :)
yo tambien seguire al Open Source... a ver si investigamos un poco del proyecto mono. vi un poco y me parecio muy interesante. Podemos aprender juntos y hacer proyectos interesantes..

que fuente este contigo!