Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Делегат может определять собственные параметры типа. Код, ссылающийся на универсальный делегат, может указать аргумент типа для создания закрытого созданного типа, как при создании экземпляра универсального класса или вызове универсального метода, как показано в следующем примере:
public delegate void Del<T>(T item);
public static void Notify(int i) { }
Del<int> m1 = new Del<int>(Notify);
C# версии 2.0 имеет новую функцию, называемую преобразованием групп методов, которая применяется к конкретным, а также универсальным типам делегатов и позволяет писать предыдущую строку с помощью этого упрощенного синтаксиса:
Del<int> m2 = Notify;
Делегаты, определенные в универсальном классе, могут использовать параметры типа универсального класса таким же образом, как и методы класса.
class Stack<T>
{
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)
{
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;
}