Это общий синтаксис для C#.
Основная концепция заключается в том, что она позволяет использовать заполнитель Type и подставлять действительный тип во время компиляции.
Например, старый способ:
ArrayList foos = new Arraylist();
foos.Add("Test");
работал путем ArrayList хранения списка System.Objects (Базовый тип для всех вещей, .NET).
Таким образом, при добавлении или извлечения объекта из списка, CLR бы бросить его на объект, в основном то, что на самом деле это происходит:
foos.Add("Test" as System.Object);
string s = foos[1] as String.
Это приводит к потере производительности от отливки, и ее также небезопасно, потому что я могу это сделать:
ArrayList listOfStrings = new ArrayList();
listOfStrings.Add(1);
listOfStrings.Add("Test");
Это будет компилировать просто отлично, даже если я кладу целое число в listOfStrings.
Обобщения изменил все это, теперь с помощью Generics я могу объявить, что тип моей коллекции ожидает:
List<int> listOfIntegers = new List<int>();
List<String> listOfStrings = new List<String>();
listOfIntegers.add(1);
// Compile time error.
listOfIntegers.add("test");
Это обеспечивает время компиляции типобезопасность, а также позволяет избежать дорогостоящих операций литья.
Способ, которым вы пользуетесь, довольно прост, хотя есть некоторые усовершенствованные граничные случаи. Основная концепция заключается в том, чтобы сделать ваш тип типа агностиком с помощью заполнителя типа, например, если бы я хотел создать общий класс «Добавить два вещи».
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));
Для более подробного объяснения дженериков я не могу рекомендовать книгу CLR с помощью C#.
Спасибо за это, и я отредактировал вопрос – 2008-09-30 22:01:33
NP. Я также удалил свое предложение. В отверстие памяти они уходят. – 2008-09-30 22:02:43