3

C# のジェネリックとリストについて学んでいますが、構文と 2 つのトピックの使用について非常に混乱しています。私は MSDN を読みましたが、読んだ後はさらに混乱しています。

public T variable name;<-- タイプの変数がどのように使用できるか混乱していますT???

次に、どういうわけかList<T>or List<double> List<int><- を突然持つことができます。なぜ<>突然必要なのか、List と呼ばれるこの新しいクラスは何ですか? 新しい型が int またはorTと異なる場合、この新しい型が保持する値は何ですか? なぜ置くことができるのですか?これらは2つの異なる概念ですか?(theと) 現在、彼らは型の配列を使用しています....この型は、私を本当に混乱させる2つのことです。の目的/用途は何ですか?との違いは何ですか?doublestring<double>List<T>List<double>TTListList<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>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どんなタイプでも構いませんT。たとえばList、特定のタイプの強力な型付けが必要な場合は、次のようになります。

と呼ばれる独自のタイプを作成した後、のみで埋めCarたい場合は、次を使用します。ListCars

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

、単純なリストを使用する場合は、そこに何でも入れることができます。

ただし、メソッド定義やインターフェイスなどでも使用できます。

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

したがって、一般に、内部の<T>型は、メソッドまたは変数で使用される型を通知します。

ここでさらに役立つ情報を見つけることもできます。

別のトピック

このトピックにアクセスすると、明確に説明されているため、質問に対する回答が見つかるはずです。

于 2013-10-15T14:01:22.020 に答える