Allmänna ombud (C#-programmeringsguide)
Ett ombud kan definiera sina egna typparametrar. Kod som refererar till det allmänna ombudet kan ange typargumentet för att skapa en sluten konstruktionstyp, precis som när du instansierar en allmän klass eller anropar en generisk metod, som du ser i följande exempel:
public delegate void Del<T>(T item);
public static void Notify(int i) { }
Del<int> m1 = new Del<int>(Notify);
C# version 2.0 har en ny funktion som kallas metodgruppkonvertering, som gäller både för konkreta och generiska ombudstyper, och gör att du kan skriva föregående rad med den här förenklade syntaxen:
Del<int> m2 = Notify;
Ombud som definierats i en allmän klass kan använda parametrarna för generisk klasstyp på samma sätt som klassmetoder.
class Stack<T>
{
public delegate void StackDelegate(T[] items);
}
Kod som refererar till ombudet måste ange typargumentet för den innehållande klassen enligt följande:
private static void DoWork(float[] items) { }
public static void TestStack()
{
Stack<float> s = new Stack<float>();
Stack<float>.StackDelegate d = DoWork;
}
Allmänna ombud är särskilt användbara för att definiera händelser baserat på det typiska designmönstret eftersom avsändarargumentet kan skrivas starkt och inte längre behöver gjutas till och från 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;
}