Делегаты C#
Делегат представляет собой объект, который может ссылаться на метод или несколько методов. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Иными словами, делегат позволяет вызывать метод, на который он ссылается.
По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает три важных фрагмента информации:
- адрес метода, на котором он вызывается;
- аргументы (если есть) этого метода;
- возвращаемое значение (если есть) этого метода.
Пример использования делегата:
class TrainStation
{
delegate int Train();
int Wagon1()
{
Console.WriteLine("wagon1 is running");
return 1;
}
int Wagon2()
{
Console.WriteLine("wagon2 is running");
return 2;
}
public void CreateTrain()
{
Train train = Wagon1;
train += Wagon2;
train += () => // пример с использованием лямбда выражения
{
Console.WriteLine("wagon3 is running");
return 3;
};
Console.WriteLine("WagonNumber:" + train());
}
}
internal class Program
{
private static void Main()
{
var trainStation = new TrainStation();
trainStation.CreateTrain();
Console.ReadKey();
}
}
На экран выведется следующее:
wagon1 is running
wagon2 is running
wagon3 is running
WagonNumber:3
Объяснение:
Делегат это по сути очередь в которую можно добавить сколько угодно методов. При выполнении train += Wagon2; мы добавляем 2й вагон в очередь.
Причина почему на экран вывелась цифра "3" после выполнения всех методов в том что если функция имеет возвращаемое значение, то возвращается значение с последней добавленной "в очередь" функции.