Delegat a słowo kluczowe delegat

Jeśli chcesz tworzyć własne delegaty, użyj słowa kluczowego delegate pisanego małymi literami.

Co można zrobić z rzeczywistą klasą delegata? Do czego to służy? Nie rozumiem różnicy.

Author: svick, 2009-04-23

6 answers

Z http://msdn.microsoft.com/en-us/library/system.delegate.aspx :

Klasa Delegate jest klasą bazową dla typów delegatów. Jednak tylko system i kompilatory mogą czerpać jawnie z klasy Delegate lub z klasy MulticastDelegate. Informatyka nie jest również dopuszczalne uzyskanie nowy typ Z Typu delegata. Na Delegate klasa nie jest uważana za a typ delegata; jest to klasa używana do wyprowadzić typy delegatów.

Większość języków implementuje delegate słowa kluczowe, oraz Kompilatory dla tych języki są w stanie czerpać z MulticastDelegate klasa; dlatego, użytkownicy powinni używać słowa kluczowego delegate dostarczone przez język.

 34
Author: LukeH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 20:58:25

Słowo kluczowe delegate jest po to, aby kompilator zrobił dla Ciebie magię. Kiedy deklarujesz nowego delegata z niestandardowym podpisem,

  • kompilator tworzy dla Ciebie nowy typ wywodzący się z MulticastDelegate (który z kolei wywodzi się z delegata).
  • kompilator dodaje metodę wywołania z Twoim niestandardowym podpisem
  • podobnie kompilator dodaje metody BeginInvoke i EndInvoke dla tego nowego typu

Więc teraz, gdy wywołujesz delObject(args) - kompilator tłumaczy to na delObject.Invoke(args)

Klasa bazowa delegata zapewnia pewne funkcje, takie jak

  1. CreateDelegate (do uzyskania delegata owijającego metodę statyczną/instancyjną)
  2. DynamicInvoke (wywoływanie delegata z listą argumentów-late bound)
  3. Połącz i usuń (dla łańcucha delegatów.. łańcuch wielu delegatów razem, np. wielu delegatów obsługi zdarzeń dla zdarzenia)

Kompilator C# zabrania ci czerpania z twojego kodu.. musisz użyć słowa kluczowego deleguj.

 35
Author: Gishu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 20:30:39

Kolejną ciekawą rzeczą, którą możesz zrobić za pomocą słowa kluczowego delegate, jest tworzenie delegatów w wierszu, bez konieczności ich deklarowania, na przykład:

// constructor
public Form1()
{
    this.Load += delegate(object sender, EventArgs e)
    {
         // Form1_Load code goes right here
    }
}
 3
Author: galets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 20:56:37

Zaletą klasy delegata jest to, że jest ona klasą bazową dla wszystkich typów delegatów w .Net. posiadanie metody, która zajmuje instancję tej klasy pozwala na ogólne działanie nad wszystkimi rodzajami delegatów. To jest powód operacji takich jak ISynchronizedInvoke.Wywołaj użyj tego jako parametru.

 2
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 20:23:58

Jedną z rzeczy, do których klasa Delegate może być używana jest większa kontrola podczas wywoływania procedur obsługi zdarzeń. Na przykład, przy normalnym przetwarzaniu zdarzeń, wyjątek w dowolnej procedurze obsługi zdarzeń uniemożliwi wywołanie późniejszych procedur obsługi zdarzeń. Możesz zmienić to zachowanie, używając klasy Delegate do ręcznego wywoływania każdej procedury obsługi zdarzenia.

using System;

namespace DelegateClass
{
    class EventSource
    {
        public event EventHandler TheEvent;

        internal void RaiseEvent1()
        {
            EventHandler handler = TheEvent;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        internal void RaiseEvent2()
        {
            EventHandler handler = TheEvent;
            if (handler == null)
                return;

            Delegate[] handlers = handler.GetInvocationList();
            foreach (Delegate d in handlers)
            {
                object[] args = new object[] { this, EventArgs.Empty };
                try
                {
                    d.DynamicInvoke(args);
                }
                catch (Exception ex)
                {
                    while (ex.InnerException != null)
                        ex = ex.InnerException;

                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

    class Program
    {
        static void Handler1(object sender, EventArgs e)
        {
            Console.WriteLine("Handler1");
        }

        static void Handler2(object sender, EventArgs e)
        {
            Console.WriteLine("Handler2");
            throw new InvalidOperationException();
        }

        static void Handler3(object sender, EventArgs e)
        {
            Console.WriteLine("Handler3");
        }

        static void Main(string[] args)
        {
            EventSource source = new EventSource();
            source.TheEvent += Handler1;
            source.TheEvent += Handler2;
            source.TheEvent += Handler3;

            try
            {
                source.RaiseEvent1();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("-------------------");

            source.RaiseEvent2();
        }
    }
}
 2
Author: Ðаn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 21:51:33

Z perspektywy implementacji, Klasa delegata definiuje pola używane do reprezentowania wskaźnika funkcji delegata, A Klasa MultiCastDelegate zapewnia podstawową funkcjonalność linii używaną przez zdarzenia. Również, jak inni ludzie wspomniali, Delegate zapewnia metodę "DynamicInvoke", która pozwala na wywołanie dowolnego delegata.

 1
Author: Scott Wisniewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-22 20:38:00