汎用デリゲート (C# プログラミング ガイド)

delegate (C# リファレンス)は、独自に型パラメーターを定義できます。 汎用デリゲートを参照するコードでは、型の引数を指定して、クローズ構築型を作成できます。ジェネリック クラスをインスタンス化するときや、ジェネリック メソッドを呼び出すときと同様です。次に例を示します。

public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);

C# Version 2.0 には、メソッド グループの変換という新機能があります。この機能は、汎用デリゲート型と同様に具象にも適用されるため、前述のコード行を次の簡単な構文で記述できます。

Del<int> m2 = Notify;

ジェネリック クラス内で定義されるデリゲートでは、クラスのメソッドと同様に、ジェネリック クラスの型パラメーターを使用できます。

class Stack<T>
{
    T[] items;
    int index;

    public delegate void StackDelegate(T[] items);
}

デリゲートを参照するコードでは、次のように、含まれるクラスの型の引数を指定する必要があります。

private static void DoWork(float[] items) { }

public static void TestStack()
{
    Stack<float> s = new Stack<float>();
    Stack<float>.StackDelegate d = DoWork;
}

汎用デリゲートが特に有効であるのは、標準的なデザイン パターンに基づいてイベントを定義する場合です。送信元の引数は厳密に型指定され、Object との間でキャストを実行する必要がなくなるためです。

delegate void StackEventHandler<T, U>(T sender, U eventArgs);

class Stack<T>
{
    public class StackEventArgs : System.EventArgs { }
    public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent;

    protected virtual void OnStackChanged(StackEventArgs a)
    {
        stackEvent(this, a);
    }
}

class SampleClass
{
    public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { }
}

public static void Test()
{
    Stack<double> s = new Stack<double>();
    SampleClass o = new SampleClass();
    s.stackEvent += o.HandleStackChange;
}

参照

関連項目

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

ジェネリック メソッド (C# プログラミング ガイド)

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

ジェネリック インターフェイス (C# プログラミング ガイド)

デリゲート (C# プログラミング ガイド)

System.Collections.Generic

概念

C# プログラミング ガイド

その他の技術情報

.NET Framework におけるジェネリック