Snippets

Обучение JavaScript Делегаты в C# (по просьбе учащихся)

Created by Михаил Беляков last modified
/*
 * Делегаты можно рассматривать как "заместители",
 * "заглушки", установленные там, где нужно вызывать
 * функции с различным поведением. Они определяют
 * набор параметров и возвращаемое значение функции,
 * но не ее поведение. Поведение обеспечивает функция,
 * подставляемая вместо делегата.
 */

namespace csharp_examples
{
    internal enum Animal {Dog, Cat}

    internal static class Samples {

        internal delegate string MakeSound(Animal animal);

        internal static void CheckSound(Animal animal, MakeSound make) {
            string sound = make(animal);
            System.Console.WriteLine(sound);
        }
    }
}

/*
 * Рассмотрим небольшой пример.
 */

namespace csharp_examples {

    class Program {

        static string DogSays(Animal animal) {
            if(animal != Animal.Dog) return "Вообще-то я собачка...";
            return "*** Гав ***";
        }

        static string CatSays(Animal animal) {
            if(animal != Animal.Cat) return "Вообще-то я кошка...";
            return "*** Мяу ***";
        }
        /*
        */

        static void Main() {
            System.Console.WriteLine("Слушаем голоса животных:");
            Samples.CheckSound(Animal.Dog, DogSays);
            Samples.CheckSound(Animal.Cat, DogSays);
            Samples.CheckSound(Animal.Cat, CatSays);
            Samples.CheckSound(Animal.Dog, CatSays);
        }
    }
}

Делегаты в языке C# являются специальными абстрактными типами, вместо которых можно подставлять реальные функции. Делегаты характеризуются возвращаемым значением и набором параметров. Любая функция с соответствующими характеристиками может быть подставлена на место параметра-делегата и вызвана.

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.