C# Genéricos (Generic)
Genéricos (Generic)Le permite diferir la especificación del tipo de datos de los elementos de programación en una clase o método hasta que realmente se use en el programa. En otras palabras, los genéricos le permiten escribir una clase o método que puede funcionar con cualquier tipo de datos.
Puede escribir la especificación de una clase o método utilizando parámetros sustitutos para los tipos de datos. Cuando el compilador encuentra el constructor de una clase o la llamada a un método, genera código para manejar el tipo de datos especificado. El siguiente ejemplo sencillo le ayudará a comprender este concepto:
Ejemplo
using System.Collections.Generic;
namespace GenericApplication
{
public class MyGenericArray<T>
{
private T[] array;
public MyGenericArray(int size)
{
array = new T[size + 1];
}
public T getItem(int index)
{
return array[index];
}
public void setItem(int index, T value)
{
array[index] = value;
}
}
class Tester
{
static void Main(string[] args)
{
// Declarar una matriz de enteros
MyGenericArray<int> intArray = new MyGenericArray<int>(5);
// Establecer valores
for (int c = 0; c < 5; c++)
{
intArray.setItem(c, c*5);
}
// Obtener valores
for (int c = 0; c < 5; c++)
{
Console.Write(intArray.getItem(c) + " ");
}
Console.WriteLine();
// Declarar una matriz de caracteres
MyGenericArray<char> charArray = new MyGenericArray<char>(5);
// Establecer valores
for (int c = 0; c < 5; c++)
{
charArray.setItem(c, (char)(c+97));
}
// Obtener valores
for (int c = 0; c < 5; c++)
{
Console.Write(charArray.getItem(c) + " ");
}
Console.WriteLine();
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
0 5 10 15 20 a b c d e
Características de los genéricos (Generic)
El uso de genéricos es una técnica para mejorar la funcionalidad de los programas, que se manifiesta en los siguientes aspectos:
- Le ayuda a reutilizar el código al máximo, proteger la seguridad de los tipos y mejorar el rendimiento.
- Puede crear clases de colección genéricas. La biblioteca de clases de .NET Framework incluye enSystem.Collections.Genericel espacio de nombres algunas nuevas clases de colección genéricas. Puede utilizar estas clases de colección genéricas para reemplazarSystem.Collectionslas clases de colección del espacio de nombres.
- Puede crear sus propias interfaces genéricas, clases genéricas, métodos genéricos, eventos genéricos y delegados genéricos.
- Puede aplicar restricciones a las clases genéricas para acceder a métodos de tipos de datos específicos.
- La información sobre los tipos utilizados en los tipos de datos genéricos se puede obtener en tiempo de ejecución mediante el uso de la reflexión.
Métodos genéricos (Generic)
En el ejemplo anterior, ya hemos utilizado clases genéricas. Podemos declarar métodos genéricos mediante parámetros de tipo. El siguiente programa ilustra este concepto:
Ejemplo
using System.Collections.Generic;
namespace GenericMethodAppl
{
class Program
{
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args)
{
int a, b;
char c, d;
a = 10;
b = 20;
c = 'I';
d = 'V';
// Mostrar los valores antes del intercambio
Console.WriteLine("Int values before calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values before calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
// Llamar a swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
// Mostrar los valores después del intercambio
Console.WriteLine("Int values after calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values after calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Int values before calling swap: a = 10, b = 20 Char values before calling swap: c = I, d = V Int values after calling swap: a = 20, b = 10 Char values after calling swap: c = V, d = I
Delegados genéricos (Generic)
Puede definir delegados genéricos mediante parámetros de tipo. Por ejemplo:
delegate T NumberChanger<T>(T n);
El siguiente ejemplo demuestra el uso de delegados:
Ejemplo
using System.Collections.Generic;
delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// Crear una instancia del delegado
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
// Usar el objeto delegado para llamar al método
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Value of Num: 35 Value of Num: 175Otras extensiones