Udostępnij za pośrednictwem


Delegaty ogólne (Przewodnik programowania w języku C#)

Delegat może zdefiniować własne parametry typu. Kod, który odwołuje się do delegata ogólnego, może określić argument typu, aby utworzyć zamknięty skonstruowany typ, podobnie jak podczas tworzenia wystąpienia klasy ogólnej lub wywoływania metody ogólnej, jak pokazano w poniższym przykładzie:

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

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

Język C# w wersji 2.0 ma nową funkcję o nazwie konwersja grupy metod, która ma zastosowanie do konkretnych, a także typów delegatów ogólnych i umożliwia napisanie poprzedniego wiersza przy użyciu tej uproszczonej składni:

Del<int> m2 = Notify;

Delegaty zdefiniowane w klasie ogólnej mogą używać parametrów typu klasy ogólnej w taki sam sposób, jak metody klas.

class Stack<T>
{
    public delegate void StackDelegate(T[] items);
}

Kod odwołujący się do delegata musi określać argument typu zawierającej klasę w następujący sposób:

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

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

Delegaty ogólne są szczególnie przydatne podczas definiowania zdarzeń na podstawie typowego wzorca projektu, ponieważ argument nadawcy może być silnie typizowane i nie trzeba już rzutować do i z 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)
    {
        if (StackEvent is not null)
            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;
}

Zobacz też