3

我正在学习 C# 中的泛型和列表,但我对这两个主题的语法和使用感到非常困惑。我已经阅读了 MSDN,但阅读后我更加困惑。

我很困惑有时你怎么能有public T variable name;<-- 类型的变量T???

然后你可以以某种方式拥有List<T>List<double> List<int><-为什么我们<>突然需要这个新类,这个名为 List 的新类是什么?如果T是一个不同于 int 的新类型,或者doublestring那么这个新类型持有什么值?为什么可以放<double>?这是两个不同的概念吗?(the List<T>and List<double>) 现在他们甚至使用类型为T....的数组。这种类型TList2 件事真的让我很困惑。的目的/用途List是什么,它与 有何不同<T>

4

2 回答 2

2

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<>,以便您更好地了解它们的工作原理。

于 2013-10-15T14:02:04.287 回答
1

几乎T可以是任何类型,这就是为什么它被称为Type。例如,如果您需要List给定类型的强类型,例如:

您已经创建了自己的类型,称为Car,然后您只想List填充一个Cars然后使用:

List<Car> carsList = new List<Car>();

,如果你使用简单的列表,你可以在里面放任何东西。

但是您也可以在方法定义甚至接口等中使用。

privat void GenericMethod<T>(T var)
{
   //your code
}

所以一般来说,里面的类型<T>会告诉你......方法或变量使用的类型。

您还可以在此处找到一些更有用的信息:

另一个话题

通过访问该主题,您应该可以找到问题的答案,因为那里已经清楚地解释了这一点。

于 2013-10-15T14:01:22.020 回答