2010-01-21 5 views
5

Les docs disent:Quelle est la différence entre IDelegateEvent et IEvent dans F #?

F # donne un statut particulier aux propriétés membres de l'instance non-virtuelle compatible avec le type IDelegateEvent, générant approriate métadonnées .NET pour faire comparaître le député à d'autres langages .NET comme un événement .NET.

Mais le comportement de IDelegateEvent et IEvent semble être le même avec ou sans l'attribut CLIEvent.

J'utilise 1.9.7.8.

Répondre

4

IEvent hérite de IDelegateEvent, mais impose une contrainte supplémentaire sur le type de délégué autorisé (en le forçant à renvoyer l'unité). IEvent hérite également de IObservable. Sauf si vous voulez avoir un événement avec un type bizarre, il n'y a aucune raison de s'appuyer sur l'interface de base IDelegateEvent au lieu de l'IEvent plus commun. Que voulez-vous dire lorsque vous dites que [<CLIEvent>] ne fait pas de différence? Dans FSI, il y a un bug qui empêche les événements d'être générés correctement sur le type (par exemple, vu par Type.GetEvents()), mais les événements sont générés correctement lorsque le code est compilé. Même si FSI vous devriez voir les méthodes add_ et remove_ générées lorsque vous appliquez l'attribut [<CLIEvent>], cependant.

+0

Je pense que les documents sont trompeurs. Le paragraphe cité ci-dessus semble indiquer que vous devriez utiliser IDelegateEvent si vous voulez un événement .NET ordinaire, sinon utilisez IEvent. Il semble que IDelegateEvent absout le besoin d'utiliser l'attribut CLIEvent. – Daniel

+0

Pour répondre à votre question ... et développer sur mon précédent commentaire ... IDelegateEvent et IEvent semblent les mêmes pour les autres langages .NET avec ou sans l'attribut CLIEvent. Ils fonctionnent tous les deux très bien, mais les docs semblent indiquer qu'il y a une différence (peut-être que cette différence est que IDelegateEvent n'a pas besoin de l'attribut CLIEvent, ce qui est apparemment faux). – Daniel

4

Je pense que dans certaines versions historiques de F #, vous utiliseriez IDelegateEvent pour les événements .NET standard et IEvent pour les événements F #. L'attribut CLIEvent a été ajouté plus récemment (car la solution d'origine comportait quelques problèmes). Donc, je pense que le IDelegateEvent est très rarement utile maintenant (kvb mentionné quelques différences plus spécifiques).

Une différence plus intéressante est entre IEvent<'T> qui est un événement avec gestionnaire Handler<'T> (qui est défini quelque part dans F # bibliothèques, je crois) et IEvent<'Del, 'T> qui peut être utilisé avec tous les gestionnaires, par exemple IEvent<EventHandler, EventArgs> qui apparaît assez fréquemment dans .NET bibliothèques ...

Questions connexes