2010-10-05 12 views
2

Quand je regardais les Action délégués à réflecteur, je l'ai vu a un constructeur commeOù sont définis les constructeurs des délégués et les fonctions des membres?

public Action(object @object, IntPtr method); 

Mais je ne pouvais pas trouver un corps pour la même ainsi que d'autres fonctions membres comme Invoke, BeginInvoke etc. Je peux seulement voir les définitions pour cela. Où ces fonctions sont-elles définies? Sont-ils définis en dehors des BCL .net?

Répondre

4

Les délégués sont traités spécialement par le CLR, essentiellement. Le compilateur fournit les signatures, mais le CLR sait quoi faire avec eux.

Section 8.9.3 de ECMA-335 partition I parle de ceci:

Les délégués sont l'équivalent orienté objet de pointeurs de fonction. Contrairement aux pointeurs de fonction, les délégués sont orientés objet, sécurisés pour le type et sécurisés. Les délégués sont créés en définissant une classe dérivée du type de base System.Delegate (voir Partition IV). Chaque type de délégué doit fournir une méthode nommée Invoke avec les paramètres appropriés, et chaque instance d'un délégué transfère les appels à sa méthode Invoke vers une ou plusieurs méthodes statiques ou instances compatibles sur des objets particuliers. Les objets et les méthodes auxquels il délègue sont choisis lorsque l'instance de délégué est créée.

Outre un constructeur d'instance et une méthode Invoke, les délégués peuvent éventuellement avoir deux méthodes supplémentaires: BeginInvoke et EndInvoke. Ils sont utilisés pour les appels asynchrones.

Alors que, pour la plupart, les délégués semblent être simplement un autre type de classe définie par l'utilisateur, ils sont étroitement contrôlés. Les implémentations des méthodes sont fournies par le VES, pas par le code utilisateur. Les seuls membres supplémentaires qui peuvent être définis sur les types de délégué sont des méthodes statiques ou des instances.

(VES est le système d'exécution virtuel;. Le CLR est la mise en œuvre du VES de Microsoft)

+0

Jon Skeet à la rescousse! Merci l'homme pour cette information précieuse. –