Si vous souhaitez créer des délégués personnalisés, vous devez utiliser le mot clé delegate en minuscules.
Que pouvez-vous faire avec la classe de délégués actuelle ? À quoi cela sert-il ? Je ne comprends pas la différence exacte.
Si vous souhaitez créer des délégués personnalisés, vous devez utiliser le mot clé delegate en minuscules.
Que pouvez-vous faire avec la classe de délégués actuelle ? À quoi cela sert-il ? Je ne comprends pas la différence exacte.
Le mot-clé "délégué" permet au compilateur de faire un peu de magie pour vous. Lorsque vous déclarez un nouveau délégué avec une signature personnalisée,
Donc maintenant, quand vous appelez delObject(args)
- le compilateur traduit cela en delObject.Invoke(args)
La classe de base Delegate fournit certaines fonctionnalités telles que
Le compilateur C# vous interdit de dériver de Delegate de manière explicite dans votre code vous devez utiliser le mot clé delegate.
Desde http://msdn.microsoft.com/en-us/library/system.delegate.aspx :
El
Delegate
est la classe de base pour les types de délégués. Cependant, seuls le système et les compilateurs peuvent dériver explicitement de la classeDelegate
ou de laMulticastDelegate
la classe. Il est n'est pas non plus autorisé à dériver un nouveau type à partir d'un type délégué. Le siteDelegate
n'est pas considérée comme un type de délégué ; c'est une classe utilisée pour dériver des types de délégués.La plupart des langages implémentent un
delegate
mot-clé, et les compilateurs de ces sont capables de dériver du mot-cléMulticastDelegate
par conséquent, les utilisateurs doivent utiliser ladelegate
mot-clé fourni par la langue.
L'avantage de la classe Delegate est qu'elle est la classe de base pour tous les types de délégués dans .Net. Le fait d'avoir une méthode qui prend une instance de cette classe vous permet d'opérer de manière générique sur toutes sortes de délégués. C'est la raison pour laquelle des opérations comme ISynchronizedInvoke.Invoke l'utilisent comme paramètre.
Une des choses que le Delegate
peut être utilisée pour obtenir un meilleur contrôle lors de l'appel de gestionnaires d'événements. Par exemple, avec le traitement normal des événements, une exception dans un gestionnaire d'événements empêchera l'appel de tout autre gestionnaire d'événements ultérieur. Vous pouvez modifier ce comportement en utilisant la classe Delegate
pour invoquer manuellement chaque gestionnaire d'événement.
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();
}
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.