Delen via


Algemene gemachtigden (C#-programmeerhandleiding)

Een gemachtigde kan zijn eigen typeparameters definiëren. Code die verwijst naar de algemene gemachtigde kan het typeargument opgeven om een gesloten samengesteld type te maken, net zoals bij het instantiëren van een algemene klasse of het aanroepen van een algemene methode, zoals wordt weergegeven in het volgende voorbeeld:

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

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

C# versie 2.0 heeft een nieuwe functie met de naam methodegroepconversie, die van toepassing is op concrete en algemene gedelegeerde typen, en stelt u in staat om de vorige regel te schrijven met deze vereenvoudigde syntaxis:

Del<int> m2 = Notify;

Gemachtigden die zijn gedefinieerd in een algemene klasse, kunnen de parameters van het algemene klassetype op dezelfde manier gebruiken als de klassemethoden.

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

Code die naar de gemachtigde verwijst, moet als volgt het typeargument van de klasse opgeven:

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

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

Algemene gemachtigden zijn vooral handig bij het definiëren van gebeurtenissen op basis van het typische ontwerppatroon, omdat het argument afzender sterk kan worden getypt en niet meer hoeft te worden gecast naar en van 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;
}

Zie ook