Dentro del universo de Generics,
existe un concepto que no suele ser demasiado conocido y que aunque puede ser
sustituido por otro tipo de técnicas, ahorra mucho código y lo hace mucho más
seguro y entendible para terceros.
Hablamos de la palabra reservada default(T), de la que hablaremos en este post para intentar
darte un enfoque no solo teórico sino también práctico, en pos de intentar que
sea mucho más familiar para ti, de ahora en adelante en tus desarrollos de Generics.
o
La palabra Reservada default(T)
Default(T)
Es una palabra reservada que nos devuelve el valor por
defecto del tipo facilitado por parámetros.
Los valores por defecto dentro de los tipos más importantes
de CLR son los siguientes:
- Clases .- null.
- Nullable<T> .- null.
- Estructuras numéricas (int, double, decimal, etc) .- 0.
- Estructuras (DateTime) .- 01/01/0001.
- Estructuras (Char) .- Carácter vacío.
- Estructuras (Bool) .- false.
Puede parecer algo muy poco útil, pero en Genéricos sin
ningún tipo de restricción nos presta una buena ayuda.
Si vemos nuestro primer ejemplo de Generics:
Podríamos querer comprobar que los valores que se habían
introducido por parámetros, corresponden a variables inicializadas o con
datos. Al no existir ninguna restricción en la firma del método, el tipo
de estos valores puede corresponder a cualquiera del CLR, por lo que o nos hacemos un método que haga esta
comprobación, por ejemplo con un swich
que pregunte por cada uno de los tipos posibles, o utilizamos la palabra
reservada default(T).
Vamos a ver un ejemplo un poco más representativo y que nos
van a aclarar un poco más las ideas.
Ejemplo
En nuestro ejemplo, vamos a ver un método que podremos
utilizar para realizar una pequeña comprobación dentro de una colección de
datos, y que usaremos en cualquier cliente gráfico (Windows Forms, WPF,
ASP, Silverlight, etc) para pre visualizar dentro de un Listbox, que valores de la colección
tienen datos instanciados y cuales tienen el valor por defecto. Para que se vea
bien pintaremos la celda con datos con valores instanciados en verde y en rojo las
que tengan datos por defecto.
El ejemplo lo he realizado con un ListBox de WPF
y un objeto Converter para
realizar los pintados.
Para hacer el ejemplo me he apoyado en una clase genérica info, muy sencilla con 2
propiedades, una de tipo T,
para guardar el valor que lleva el elemento a comprobar y otra bool, donde guardaré si el valor de T de este elemento concuerda con el valor por defecto del tipo T.
El método que realiza la comprobación es el siguiente:
Simplemente recibe una colección genérica y recorre sus
elementos para comprobar si corresponden con el valor por defecto para su tipo.
Nota:
Como podemos comprobar he tenido que realizar sendas sentencias ternarias para convertir en string el valor del item de la colección y el valor por defecto. Esto
lo he realizado así porque el framework
no deja comparar directamente sus valores cuando son de tipo genérico.
Instanciación
Me gustaría también puntualizar que la palabra clave default(T) también es muy útil
cuando queremos instanciar una variable de tipo T dentro de nuestros métodos genéricos, sin tener que hacer uso
de Reflection.
Pues hasta aquí la palabra reservada default(T). Aquí dejo el código por si alguien quiere echarle un ojo.
Muy bueno Paco
ResponderEliminarMe alegro mucho que te haya gustado Santi, estas cosas dan muchos ánimos para seguir intentándolo hacer lo mejor posible.
ResponderEliminarUn abrazo