T
只是一个类型的占位符。例如:
public void PrintType<T>(T source)
{
Console.WriteLine(source.GetType());
}
int number = 23;
string text = "Hello";
PrintType(number);
PrintType(text);
这里我们有一个接受T source
参数的通用函数。该参数的类型可以是任何类型,因此我们使用它T
来标记它。您可以使用任何字母,但T
似乎最常用。
例如,当您有一个通用列表List<int>
时,您正在声明列表将包含的类型,在这种情况下为integers
. 这就是您需要 的原因<>
,它是您指定类型的地方。
List<>
不创建泛型类型,它是一个可以存储类型对象的集合对象T
(假设您将列表声明为List<T>
eg List<int>
、List<string>
等)。在引擎盖下,List<>
确实使用了一个数组,但不要太担心细节。
编辑:
作为参考,这里有一些简化的部分代码List<>
,我使用dotPeek
public class List<T>
{
private static readonly T[] _emptyArray = new T[0];
private const int _defaultCapacity = 4;
private T[] _items;
private int _size;
private int _version;
public void Add(T item)
{
if (this._size == this._items.Length)
this.EnsureCapacity(this._size + 1);
this._items[this._size++] = item;
}
private void EnsureCapacity(int min)
{
if (this._items.Length >= min)
return;
int num = this._items.Length == 0 ? 4 : this._items.Length * 2;
if (num < min)
num = min;
this.Capacity = num;
}
public int Capacity
{
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] get
{
return this._items.Length;
}
set
{
if (value < this._size)
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
if (value == this._items.Length)
return;
if (value > 0)
{
T[] objArray = new T[value];
if (this._size > 0)
Array.Copy((Array) this._items, 0, (Array) objArray, 0, this._size);
this._items = objArray;
}
else
this._items = List<T>._emptyArray;
}
}
}
如您所见,List<>
它是一个使用数组的包装类,在本例中为泛型数组。我强烈建议您使用 dotPeek 或其他类似工具,并查看类似的内容List<>
,以便您更好地了解它们的工作原理。