miércoles, 13 de octubre de 2010

Conversiones

La conversión se refiere a la capacidad de cambiar un objeto de un tipo a otro.Estas pueden ser implícitas o explícitas.

Impícitas -> Es posible una conversión automática.
Explícita -> Se invocan cuando existe la posibilidad de un error ó pérdida de datos.

Conversión boxing y unboxing
Aquí es donde los tipos primarios y los tipos de referencia pueden utilizarse indiferentemente. Las conversiones boxing y unboxing permiten tratar los tipos de valor como objetos.

Boxing
Es el proceso usado para convertir un tipo primitivo en un tipo de referencia. Para implementar esto, lo único que hace falta es asignar el tipo primitivo a un objeto.

Ej:
int numero = 123; // Declara un valor de tipo int
object objeto = numero // Boxing de la variable int a object.


Unboxing
Es el proceso contrario al boxing, ya conocemos el tipo subyacente de un objeto que ha sido convertido
(boxed), por lo tanto, lo único que debemos hacer es devolver al objeto a su tipo primitivo original, asignándolo de nuevo a un campo de su tipo primario original.

Ej:
int numero2 = (int)objeto; // Unboxing de la variable object a un nuevo int.

Para que funcione el unboxing, es necesario recuperar explícitamente el valor, devolviéndolo a su tipo
original. Cualquier intento de convertirlo en otro tipo daría lugar a una excepción del tipo System.InvalidCastException.

Conversiones Implícitas
Las conversiones implícitas tienen lugar de forma automática, sin necesidad de ninguna sintaxis ni ensayo adicional. Por ejemplo, la conversión de int a long sucede como una operación de asignación normal, según se aprecia en este ejemplo:

int entero = 5;
long largo = entero; //conversión implícita

 

Esta conversión tiene lugar sin ningún tipo de problema, debido a dos principios muy simples.
1- long es un valor de 64 bits e int es un valor de32 bits, por lo tanto el valor de tipo int cabe sin ningún problema en un tipo long.
2- No se generará ningún tipo de error, ya que la semántica de un valor int no cambia cuando se coloca en una variable long; sigue representando lo mismo “un número entero”. Cuando estos principios no se cumplen, es decir, no conducen a un resultado positivo, se debe utilizar la conversión explícita.

La siguiente tabla muestra las conversiones implícitas para los tipos simples en C#:
Conversiones Explícitas
Este tipo de conversión es requerida cuando existe la posibilidad de una pérdida de datos o la aparición de un error. Para implementar este tipo de conversión, se ha de insertar un operador cast delante de la expresión de origen. Un operador cast no es más que el nombre del tipo que va a ser convertido, encerrado entre paréntesis. Por ejemplo si viajamos en dirección contraria al del ejemplo visto en la conversión implícita, el paso de long a int requerirá de una conversión explícita, ya que existe la posibilidad de que un valor de tipo long no pueda ser representado en un int, para el caso del ejemplo en cuestión tenemos:
long largo = 5;

int entero = (int)largo; //Conversión explícita con cast de un tipo int


Conversiones con Parsing
El parseo de información, se trata de otro mecanismo para poder llevar información desde un string a un tipo de dato. Esta acción es facilitada por el método Parse() que implementan los tipos numéricos y de fecha, principalmente lo que se hace traducir la cadena enviada hacia el tipo de dato al que se le solicita el parseo, obteniendo un valor de tipo de dato solicitante. En el siguiente ejemplo se realiza un parseo desde una cadena a un tipo int y long;

string numero = "1234";
int _int = int.Parse(numero);
long _long = long.Parse(numero);
byte _byte = byte.Parse(numero); //Excepción del tipo OverflowException.


Para evitar que se pueda producir una excepción al momento de realizar el parsing, C# provee de un método para evaluar el parsing antes de realizarlo mediante el método TryParse(), este realizará una evaluación y retornará un valor del verdad indicando el éxito del proceso y adicionalmente el valor convertido en una variable de salida (out).

string numero = "123";
string noNumero = "123ABC";
int entero;
if (int.TryParse(numero, out entero))
{
Console.WriteLine("Parseo exitoso de: {0}", numero);
}
if (!int.TryParse(noNumero, out entero))
{
Console.WriteLine("Parseo NO exitoso de: {0}", noNumero);
}

No hay comentarios: