Esa es la sintaxis genérica para C#.
El concepto básico es que le permite usar un marcador de posición Tipo y sustituir el tipo real real en tiempo de compilación.
Por ejemplo, la manera antigua:
ArrayList foos = new Arraylist();
foos.Add("Test");
trabajado haciendo tienda ArrayList una lista de System.Objects (El tipo de base para todas las cosas .NET).
Así, al añadir o recuperar un objeto de la lista, el CLR tendría que echarlo a objeto, básicamente, lo que realmente sucede es lo siguiente:
foos.Add("Test" as System.Object);
string s = foos[1] as String.
Esto provoca una reducción del rendimiento de la fundición, y también es inseguro porque puedo hacer esto:
ArrayList listOfStrings = new ArrayList();
listOfStrings.Add(1);
listOfStrings.Add("Test");
esto compilará bien, a pesar de que puse un número entero en listOfStrings.
Genéricos cambiaron todo esto, ahora el uso de los genéricos que puedo declarar qué tipo mi colección de espera:
List<int> listOfIntegers = new List<int>();
List<String> listOfStrings = new List<String>();
listOfIntegers.add(1);
// Compile time error.
listOfIntegers.add("test");
Esto proporciona seguridad en tiempo de compilación tipo, así como evita costosas operaciones de colada.
La forma de aprovechar esto es bastante simple, aunque hay algunos casos avanzados. El concepto básico es hacer que tu clase sea independiente utilizando un marcador de posición de tipo, por ejemplo, si quisiera crear una clase genérica de "Añadir dos cosas".
public class Adder<T>
{
public T AddTwoThings(T t1, T t2)
{
return t1 + t2;
}
}
Adder<String> stringAdder = new Adder<String>();
Console.Writeline(stringAdder.AddTwoThings("Test,"123"));
Adder<int> intAdder = new Adder<int>();
Console.Writeline(intAdder.AddTwoThings(2,2));
Para una explicación mucho más detallada de los genéricos, no puedo recomendar lo suficiente el libro CLR a través de C#.
fyi la penalización de rendimiento cuando se usa ArrayLists es cuando se producen tipos de valores de boxeo y de desembalaje (estructuras, entradas, flotantes, etc.). No hay una penalización apreciable en el rendimiento al convertir la referencia del objeto en una referencia de cadena. –
Además, es un punto menor, pero los genéricos (o tipos construidos) en .net no se realizan (construyen) hasta el tiempo de ejecución. El compilador solo verifica su código en tiempo de compilación y garantiza que para IList Agregue (T) que la var en 'Add (var)' se puede convertir implícitamente en T. –
El ejemplo AddTwoThings se ha cubierto varias veces en SO, y no es válido. – erikkallen