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.
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 klasyDelegate
lub z klasyMulticastDelegate
. Informatyka nie jest również dopuszczalne uzyskanie nowy typ Z Typu delegata. NaDelegate
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ć zMulticastDelegate
klasa; dlatego, użytkownicy powinni używać słowa kluczowegodelegate
dostarczone przez język.
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
- CreateDelegate (do uzyskania delegata owijającego metodę statyczną/instancyjną)
- DynamicInvoke (wywoływanie delegata z listą argumentów-late bound)
- 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.
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
}
}
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.
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();
}
}
}
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.
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