Quels sont les avantages/avantages de l'utilisation de délégués? Quelqu'un peut-il fournir des exemples simples?
Ils sont un excellent moyen d'encapsuler un morceau de code. Par exemple, lorsque vous attachez un gestionnaire d'événements sur le bouton, ce gestionnaire est un délégué. Le bouton n'a pas besoin de savoir ce que cela fait, juste comment l'appeler au bon moment.
Un autre exemple est le filtrage LINQ - la projection, etc., nécessite tout le même type de code de modèle; Tout ce qui change est la logique de représenter le filtre, la projection, etc. avec des expressions Lambda au C # 3 (qui sont converties en délégués ou arbres d'expression) cela le rend vraiment simple:
var namesOfAdults = people.Where(person => person.Age >= 18)
.Select(person => person.Name);
(Cela peut également être représenté comme une expression de requête, mais ne sortons pas trop loin des délégués.)
Une autre façon de penser à un délégué est en tant que type d'interface à la méthode. Par exemple, le type de délégué EventHandler
est un peu comme:
public interface IEventHandler
{
void Invoke(object sender, EventArgs e)
}
Mais le soutien des délégués dans le cadre permet aux délégués d'être enchaînés ensemble, invoqués de manière asynchrone, utilisés comme gestionnaires d'événements, etc.
Pour plus d'informations sur les délégués et les événements, voir mon article sur le sujet . Son objectif est des événements, mais cela couvre également les délégués.
C'est un sujet assez vague, mais voici quelques points à considérer -
Les délégués sont fondamentalement un pointeur de fonction plus simple et plus facile. Tout endroit où les pointeurs de fonction ont été utilisés dans C++, vous pouvez penser délégué.
Avantages à les utiliser dans la conception :
[Func<T,bool>]
Pour filtrer, sans avoir à écrire de nouveau code dans la méthode de l'endroit oùInconvénients potentiels :
~can~
, en particulier s'il est utilisé naïvement, conduire à un code plus difficile à lireLes délégués servent trois objectifs:
Observateur
public class Something
{
public event EventHandler SomethingHappened;
}
public class SomethingConsumer
{
private mySomething = new Something();
public void WireUpEvents()
{
mySomething.SomethingHappened += whenSomethingHappened;
}
private void whenSoemthingHappened(object sender, EventArgs e)
{
// do something
}
}
CallBack
public void DoSomethingAsynchronously(EventHandler callBack)
{
// long running logic.
callBack(this, EventArgs.Empty);
}
Code anonyme non réutilisable
public void DoSomethingReusably(Action nonReusableCode)
{
// reusable code
nonReusableCode();
// more reusable code
}
public void DoALotOfSomething()
{
DoSomethingReusably(() => { /* non-reusable code here */ });
DoSomethingReusably(() => { /* non-reusable code here */ });
DoSomethingReusably(() => { /* non-reusable code here */ });
}
Dans tous les cas, il suffit de fournir une conciliation.
Le délégué en C # est EQV. Pour fonctionner le pointeur en C, mais il transmet également une référence à l'instance de classe qu'il a été créée.
Tous les gestionnaires d'événements sous Windows sont des délégués.
Avantages par rapport à quoi? Les délégués peuvent être des choses utiles et ont sûrement leur place dans beaucoup de code C # modérément complexe. (Chaque fois que vous utilisez des événements dans des classes, vous utilisez implicitement des délégués de multidiffusion). Si vous souhaitez une introduction à sa syntaxe et à leur utilisation, je recommande les articles suivants:
Disclaimer: Je ne dis pas comment j'ai utilisé un délégué est à la manière prévue, mais c'est un exemple.
Je ne l'ai utilisé qu'une fois avant, mais dans notre application, l'utilisateur clique sur un bouton "Terminer" pour une étape qui les prend ensuite sur une page de routage pour décider où l'envoyer ensuite. Donc, techniquement, le pas, ils ont simplement cliqué sur "Terminer" sur ce n'est vraiment fini jusqu'à ce qu'ils l'acheminent. Mais depuis que je suis sur une autre page, je n'ai pas facilement accès à l'endroit où ils étaient juste.
Donc, ce que j'ai fait a été créé un délégué pour les quelques étapes nécessitant un traitement spécial (dans ce cas un courrier électronique) lorsque le clic "complet", et quand ils l'ont acheminée à la page suivante, je vérifierais l'existence du délégué et si C'était là appeler cela pour déclencher mon événement "stocké".
Créatif: probablement, faux: peut-être, travaillant: définitivement.
Comme je l'ai dit probablement pas comment il était destiné à être utilisé, mais le codage est autant d'art que la science non?
Je me souviens d'un Java Cadre GUI qui n'avait aucun concept de délégués ou de routage de commandement. Afin de faire un bouton qui fait quelque chose, vous avez dû bouton de sous-classe et remplacer la méthode de clic. Vous avez terminé avec beaucoup de sous-classes d'éléments UI avec de petits bits de votre code d'application.
Le code qui gère ce qui clique doit aller quelque part et dans un langage OO comme Java ou C # Il doit aller sur une classe, mais les délégués lui permettent de se produire sur un endroit pratique. Cela conduit souvent à avoir trop de code faire trop de choses différentes dans une classe de formulaire, mais c'est un problème différent.