Делегаты C#

Делегаты 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" после выполнения всех методов в том что если функция имеет возвращаемое значение, то возвращается значение с последней добавленной "в очередь" функции.

Теги: C#
0 4.3K 02.07.2017 09:27

Комментарии:

Пожалуйста авторизируйтесь, чтобы получить возможность оставлять комментарии