C # Вопрос: делегаты - PullRequest
       18

C # Вопрос: делегаты

0 голосов
/ 27 октября 2009

Я искал в Интернете, включая MSDN.com, простое для понимания объяснение делегатов в c #. Есть много уроков / уроков ... но это сложная концепция для меня, чтобы понять. Так что я решил спросить других программистов. Кто-нибудь может объяснить?

Ответы [ 5 ]

5 голосов
/ 27 октября 2009

Делегаты являются подобными функциональными указателями.

Взгляните на это

using System;

namespace Akadia.BasicDelegate
{
    // Declaration
    public delegate void SimpleDelegate();

    class TestDelegate
    {
        public static void MyFunc()
        {
            Console.WriteLine("I was called by delegate ...");
        }

        public static void Main()
        {
            // Instantiation-- we set this simpleDelegate to MyFunc
            SimpleDelegate simpleDelegate = new SimpleDelegate(MyFunc);

            // Invocation-- MyFunc is called. 
            simpleDelegate();
        }
    }
}

Так что происходит, когда вы звоните simpleDelegate, вместо этого вызывается MyFunc, потому что simpleDelegate указывает на MyFunc.

В случае сомнений вы должны скопировать приведенный выше код, вставить его в VS и запустить через него отладчик. Изучите, как программа перемещается из одного места в другое; убедитесь, что после вызова строки simpleDelegate() программа переходит на MyFunc и выполняет оттуда. Проверьте переменную simpleDelegate, убедитесь, что она содержит ссылку на MyFunc метод. Это был бы лучший способ познакомиться со всем этим делегатом.

1 голос
/ 27 октября 2009

Обычно делегат запускает любое количество методов, на которые вы подписаны. Они должны соответствовать параметрам и типу возвращаемого значения (это называется «подпись»), то есть, если ваш делегат берет два целых и возвращает пустое значение:

public delegate void MyDelegate(int i1, int i2);

Методы, на которые вы подписываетесь, должны принимать две строки и возвращать пустоту:

public void Add(int int1, int int2)
{
    MessageBox.Show((int1 + int2).ToString());
}

public void Multiply(int int1, int int2)
{
    MessageBox.Show((int1 * int2).ToString());
}

А теперь подпишитесь, запустите и посмотрите результаты:

public void SubscribeAndRun()
{
    MyDelegate d = new MyDelegate(Add);

    d += Multiply;

    d.Invoke(2, 3);
}

Делегаты широко используются для вызова других методов, когда происходит событие. В C # события являются делегатами, инкапсулированными для использования add и remove (для добавления или удаления методов, которые событие будет запускать при его запуске).

0 голосов
/ 27 октября 2009

Вот простой пример

using System;

namespace delegates
{
    class Program
    {
        // An event which you set up by attaching handlers (delegates)
        // and then running using the Invoke() method.
        private EventHandler<EventArgs> _event;

        void SetupFoo()
        {
            // Attach the function foo to the _event
            _event += Foo;
        }

        void SetupBar()
        {
            // Attach a delegate (aka anonymous method) to the _event
            _event += delegate { Console.WriteLine("Bar is called"); };
        }

        void SetupBaz()
        {
            // Attach a lambda to the _event
            _event += (sender, e) => Console.WriteLine("Baz is called");
        }

        void Fire()
        {
            // Run all the attached methods/delegates/lambdas
            _event.Invoke(this, EventArgs.Empty); 
        }


        static void Main(string[] args)
        {
            var prog = new Program();
            prog.SetupFoo();
            prog.SetupBar();
            prog.SetupBaz();
            prog.Fire();
            Console.ReadKey();
        }

        private static void Foo(object sender, EventArgs e)
        {
            Console.WriteLine("Foo is called");
        }
    }
}

Это производит вывод:

Foo is called
Bar is called
Baz is called

Почему важны делегаты? Поскольку Fire () отвечал только за время выполнения события, а другие функции отвечали за последствия события. Эти последствия выражены в качестве делегатов.

0 голосов
/ 27 октября 2009

Думайте Функторы. то есть функция, которая может быть обработана как объект (то есть указатель)

0 голосов
/ 27 октября 2009

Хороший учебник, пожалуйста, смотрите Делегаты :

Делегат - это тип, который ссылается на метод. После того, как делегат назначен метод, он ведет себя именно так метод. Метод делегата может быть используется как любой другой метод, с параметры и возвращаемое значение, как в этот пример:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...