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

ジェネリックにより、.NET に型パラメーターという概念が導入されます。これを使用すると、クラスやメソッドがクライアント コードによって宣言され、インスタンス化されるまで、1 つ以上の型の指定を遅延させるクラスやメソッドを設計することができます。Generics introduce the concept of type parameters to .NET, which make it possible to design classes and methods that defer the specification of one or more types until the class or method is declared and instantiated by client code. たとえば、ジェネリック型パラメーター T を使用すると、次に示すように、ランタイム キャストやボックス化操作を使うコストやリスクを発生させることなく他のクライアント コードで使用できる、単一のクラスを記述できます。For example, by using a generic type parameter T, you can write a single class that other client code can use without incurring the cost or risk of runtime casts or boxing operations, as shown here:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        list3.Add(new ExampleClass());
    }
}

ジェネリックのクラスとメソッドにより、非ジェネリックの場合には不可能な方法で、再利用性、タイプ セーフ、効率性が同時に実現されます。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. System.Collections.Generic 名前空間には、ジェネリック ベースのコレクション クラスがいくつか含まれています。The System.Collections.Generic namespace contains several generic-based collection classes. ArrayList などの非ジェネリック コレクションは推奨されません。これらは互換性のために保持されています。The non-generic collections, such as ArrayList are not recommended and are maintained for compatibility purposes. 詳細については、「.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 で用意されている List<T> クラスを使用してください。)この例では、通常、具体的な型を使用して、リストに格納する項目の型を示す場面で、型パラメーター T を使用しています。(In most cases, you should use the List<T> class provided by .NET 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.

入れ子になった Node クラスで T を使用できることに注意してください。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");
    }
}

ジェネリックの概要Generics overview

  • ジェネリック型は、コードの再利用、タイプ セーフ、およびパフォーマンスを最大化するために使用します。Use generic types to maximize code reuse, type safety, and performance.
  • ジェネリックの最も一般的な用途は、コレクション クラスの作成です。The most common use of generics is to create collection classes.
  • .NET クラス ライブラリには、複数のジェネリック コレクション クラスが System.Collections.Generic 名前空間に含まれています。The .NET class library contains several generic collection classes in the System.Collections.Generic namespace. System.Collections 名前空間の ArrayList などのクラスの代わりとして、できる限りこれらを使用してください。These should be used whenever possible instead of classes such as ArrayList in the System.Collections namespace.
  • 独自のジェネリック インターフェイス、クラス、メソッド、イベント、およびデリゲートを作成できます。You can create your own generic interfaces, classes, methods, events, and delegates.
  • ジェネリック クラスは、特定のデータ型のメソッドへのアクセスを有効にするように制限できます。Generic classes may be constrained to enable access to methods on particular data types.
  • ジェネリック データ型で使用される型に関する情報は、実行時にリフレクションを使用して取得できます。Information on the types that are used in a generic data type may be obtained at run-time by using reflection.

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification.

関連項目See also