sábado, 5 de abril de 2014

Receta No. 1-22 en C#: Definición de un Operador de Conversión

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
4.1 Palabra
4.2 Dígito
4.3 Celsius y Fahrenheit
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Conocemos que C# cuenta con diferentes tipos de datos integrados (i.e., byte, short, int, long, &c.), que por supuesto no requieren del uso del operador new para su uso, algo análogo ocurre con el tipo por referencia string (i.e., string cadena = "Cadena de caracteres") obsérvese la exclusión del operador new en la expresión izquierda. Esto es posible gracias al uso de los operadores de conversión implict y explicit que forman parte de las construcciones estándar del lenguaje. Veamos cómo funciona todo esto a través de esta receta.

1. Problema

Tenemos un conjunto de clases integrales de nuestra solución software, muchas de ellas poseen definiciones de datos que permiten ser convertidas a otras clases de objetos o tipos de datos integrados (e.g., numéricos). De momento la conversión se hace de manera implícita exponiendo los valores de las propiedades o usando el esquema de herencia implícito hacia arriba (subtipo a supertipo) del Framework .NET. Se requiere a partir de ahora usar un método alternativo y más intuitivo para permitir conversiones implícitas y explícitas entre tipos definidos por el usuario (programador) y los integrados.

2. Solución

C# cuenta con un par de construcciones sintácticas y semánticas apropiadas para cubrir este requerimiento técnico: implicit [4] y explicit [5]. Éstas dos palabras claves formarán parte de la definición de la firma de los métodos destinados a llevar a las conversiones implícitas y explicitas, respectivamente. Su uso es intuitivo y sencillo como en:

Animal animal = perro; // Conversión implícita
perro = (Perro) animal; // Conversión explícita

3. Discusión de la solución

Veamos la sintaxis general para la declaración de un método de conversión implícito y explícito:

«access specifier» static {implicit|explicit} operator «tipo destino» («tipo origen»)

Particularicemos con el ejemplo mostrado en la Receta No. 1-21 (Sobrecargar un Operador) Palabra:

Conversión explícita:

public static explicit operator Palabra(string texto)
{
return new Palabra() {Texto = texto};
}

Con esta definición en la clase Palabra, podemos realizar la siguiente conversión explícita (tenga en cuenta el uso del operador de casting explícito -(Palabra)- en la expresión de conversión) en código cliente:

Palabra palabra = (Palabra)"Hola";

Conversión implícita:

public static implicit operator Palabra(string texto)
{
return new Palabra() {Texto = texto};
}

Con el operador implicit en esta definición podemos lograr cualquier de estas dos conversiones:

Palabra palabra = (Palabra)"Hola";
Palabra palabra = "Hola";

[Nota: Las declaraciones de conversión implícita y explícita deben tener especificado el modificador static. Además, no está permitida la sobrecarga de operadores de conversión.]

4. Práctica: Código Fuente C#

En los tres ejemplos que viene a continuación se pone de manifiesto la aplicación del concepto de definición de operadores de conversión.

4.1 Palabra

Archivo Palabra.cs:

Compilación:


  1. csc /target:exe /out:Palabra.exe Palabra.cs

4.2 Dígito

Archivo Digito.cs:

Compilación:


  1. csc /target:exe /out:Digito.exe .\Digito.cs

4.3 Celsius y Fahrenheit


Compilación:


  1. csc /target:exe /out:CelsiusFahrenheit.exe .\CelsiusFahrenheit.cs

> Prueba de ejecución.


[Nota: En [6] y [7] hay otro conjunto de ejemplos interesantes y útiles para la comprensión de este importante tema.]

5. Conclusiones

Los operadores de conversión en C# nos ofrece un alto grado de flexibilidad, que como programadores necesitamos a la hora de pasar una representación lógica a otro (conversión de tipos) de las clases que nosotros mismos creamos. Las herramientas sintácticas para llevar a cabo esta tarea, como vimos, son: implicit y explicit.

6. Glosario

  • Celsius
  • Conversión
  • Explícita
  • Fahrenheit
  • Implícita

7. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Using Conversion Operators (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
[3]: Conversion Operators (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/09479473.aspx
[6]: Operator Overloading with Implicit and Explicit Casts in C# - http://www.codeproject.com/Articles/93160/Operator-Overloading-with-Implicit-and-Explicit-Ca


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.