ジェネリックの概要 (C# プログラミング ガイド)Introduction to Generics (C# Programming Guide)

ジェネリックのクラスとメソッドは、非ジェネリックでは不可能な方法で、再利用性、タイプ セーフ、効率性を同時に実現しています。Generic classes and methods combine reusability, type safety and efficiency in a way that their non-generic counterparts cannot. ジェネリックは、コレクションとそれを操作するメソッドとともに使用されるのが通常です。Generics are most frequently used with collections and the methods that operate on them. .NET Framework クラス ライブラリのバージョン 2.0 には、いくつかの新しいジェネリック ベースのコレクション クラスを含む新しい名前空間、System.Collections.Generic が用意されています。Version 2.0 of the .NET Framework class library provides a new namespace, System.Collections.Generic, which contains several new generic-based collection classes. .NET Framework 2.0 以降を対象とするすべてのアプリケーションでは、ArrayList などの以前の非ジェネリック コレクション クラスの代わりに、新しいジェネリック コレクション クラスを使用することをお勧めします。It is recommended that all applications that target the .NET Framework 2.0 and later use the new generic collection classes instead of the older non-generic counterparts such as ArrayList. 詳細については、「.NET のジェネリック」を参照してください。For more information, see Generics in .NET.

もちろん、カスタムのジェネリック型やジェネリック メソッドを作成して、タイプ セーフで効率的な独自の汎用ソリューションや設計パターンを実現することもできます。Of course, you can also create custom generic types and methods to provide your own generalized solutions and design patterns that are type-safe and efficient. 次のコード例では、デモンストレーション用の簡単なジェネリックのリンク リスト クラスを示します。The following code example shows a simple generic linked-list class for demonstration purposes. (通常は、独自のクラスを作成するのではなく、.NET Framework クラス ライブラリに用意されている List<T> クラスを使用してください。)この例では、通常、具体的な型を使用して、リストに格納する項目の型を示す場面で、型パラメーター T を使用しています。(In most cases, you should use the List<T> class provided by the .NET Framework class library instead of creating your own.) The type parameter T is used in several locations where a concrete type would ordinarily be used to indicate the type of the item stored in the list. このパラメーターは、次のように使用されています。It is used in the following ways:

  • AddHead メソッドのメソッド パラメーターの型として使用。As the type of a method parameter in the AddHead method.

  • 入れ子になった Node クラスの Data プロパティの戻り値の型として使用。As the return type of the Data property in the nested Node class.

  • 入れ子になったクラスのプライベート メンバー data の型として使用。As the type of the private member data in the nested class.

T は、入れ子になった Node クラスで使用できることに注意してください。Note that T is available to the nested Node class. GenericList<T>GenericList<int> のような具象型でインスタンス化されると、T の部分はそれぞれ int に置き換えられます。When GenericList<T> is instantiated with a concrete type, for example as a GenericList<int>, each occurrence of T will be replaced with int.

// type parameter T in angle brackets
public class GenericList<T> 
{
    // The nested class is also generic on T.
    private class Node
    {
        // T used in non-generic constructor.
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
        
        // T as private member data type.
        private T data;

        // T as return type of property.
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    
    // constructor
    public GenericList() 
    {
        head = null;
    }

    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

次のコード例では、クライアント コードでジェネリックの GenericList<T> クラスを使用して、整数のリストを作成する方法を示しています。The following code example shows how client code uses the generic GenericList<T> class to create a list of integers. このコードの型引数を変更するだけで、文字列やその他の任意のカスタム型のリストを作成するように簡単に修正できます。Simply by changing the type argument, the following code could easily be modified to create lists of strings or any other custom type:

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

関連項目See also