对泛型类型和列表的混淆
本文关键字:列表 泛型类型 | 更新日期: 2023-09-27 18:35:31
我正在学习C#中的泛型和列表,但我对这两个主题的语法和使用感到非常困惑。我读过MSDN,但读完后我更加困惑。
我很困惑有时你会有 public T variable name;
<-- 类型 T
??? 的变量
然后你可以以某种方式拥有List<T>
或List<double>
List<int>
<- 为什么我们突然需要<>
,这个新类叫做 List 是什么?如果T
是不同于 int 或 double
或 string
的新类型,那么这个新类型包含哪些值?为什么我们可以放<double>
?这是两个不同的概念吗?(List<T>
和List<double>
)现在他们甚至使用类型为 T
的数组......这种类型的T
和List
是真正让我感到困惑的两件事。List
的目的/用途是什么,它与<T>
有何不同?
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>
例如 List<int>
、List<string>
等)。在引擎盖下,List<>
确实使用数组,但不要太担心细节。
编辑:
作为参考,以下是我使用 dotPeek
获得的一些简化的、部分的List<>
代码
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<>
之类的东西,这样您就可以更好地了解它们的工作原理。
嗯,T
几乎可以是任何类型,这就是为什么它被称为T
ype。例如,如果您需要具有给定类型的强类型的List
,例如:
您已经创建了自己的类型,称为 Car
,然后您希望有一个仅填充Cars
的List
,然后使用:
List<Car> carsList = new List<Car>();
如果你使用简单的列表,你可以把任何东西放进去。
但您也可以在方法定义甚至接口等中使用。
privat void GenericMethod<T>(T var)
{
//your code
}
所以一般来说,<T>
里面的类型会告诉你......方法或变量使用的类型。
您还可以在此处找到更多有用的信息:
另一个话题
通过访问此主题,您应该找到问题的答案,因为那里清楚地解释了。