Pourquoi un .NET délégué ne pas être déclaré statique?
Lorsque j'essaie de compiler les suivantes:
public static delegate void MoveDelegate (Actor sender, MoveDirection args);
Je reçois, comme une erreur: "Le modificateur" statique " n'est pas valide pour cet élément."
Je me suis mise en œuvre de ce à l'intérieur d'un singleton, avec une catégorie distincte qui appelle le délégué. Le problème est que lorsque j'utilise l'instance du singleton dans l'autre classe pour appeler le délégué (à partir de l'identifiant, pas le type), je ne peux pas le faire pour quelque raison que ce soit, même lorsque je déclare le délégué des non-statique. Évidemment, je ne peut que se référer à celui-ci via le type directement si et seulement si le délégué est statique.
Quel est le raisonnement derrière cela? Je suis à l'aide de MonoDevelop 2.4.2.
mise à jour
Après avoir essayé l'une des suggestions avec le code suivant:
public void Move(MoveDirection moveDir)
{
ProcessMove(moveDir);
}
public void ProcessMove(MoveDirection moveDir)
{
Teleporter.MoveMethod mm = new Teleporter.MoveMethod(Move);
moveDelegate(this, moveDir);
}
J'ai reçu une erreur de traitement, qui stipule que le MoveMethod doivent être d'un type, et pas un identificateur.
- Je pense qu'un petit exemple de code va vous aider à expliquer le problème. J'ai lu, deuxième alinéa, cinq fois et ont encore aucune idée de ce que et comment vous voulez accomplir.
- Quel est le but de la
mm
variable dans leProcessMove
méthode? Si certains délégué (statique ou instance) est affecté àmoveDelegate
, puis de l'appel d'moveDelegate
va appeler le délégué désigné, comme il se doit. - Je pense que les interfaces sont mieux pour cela. Merci de voir ma réponse
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
De sorte que la méthode de la variable peut être définie statique. Le mot-clé
static
n'a pas de sens pour ledelegate
définition , tout commeenum
ouconst
définitions.Un exemple de la façon d'attribuer la méthode statique-champ:
B.MoveIt
être statique? Et pourquoi?De déclarer une
delegate
type. Il ne ferait aucun sens de le déclarer commestatic
. Vous pouvez déclarer une instance de votredelegate
typestatic
, si.delegate
qui ne peut jamais représenter une méthode d'instance, c'est à dire qui ne serait pas géré__thiscall
, mais plutôt un nécessairement statique méthode gérée (sur un statique ou d'une instance de la classe). Tel un "délégué" type aurait pasDelegate.Target
de la propriété, et c'est les instances aurait aucune disposition pour le stockage d'unthis
objet... peut-être une classe de base pour lesDelegate
type? L'avantage serait émettantcall
au lieu decallvirt
dans l'IL, ce qui pourrait également éviter d'empiler une valeur nullthis
valeur.Un délégué de la déclaration déclare essentiellement un signature de la méthode, qui ne comprend que des informations sur ses paramètres et le type de retour. Et depuis le même délégué peut point à la fois statiques et méthodes d'instance, il n'est pas judicieux de faire de la signature de la méthode elle-même en statique ou en instance.
Une fois que vous avez déclaré votre délégué:
cela signifie que tous les délégués de ce type doit point une méthode qui accepte un
Actor
paramètre, onMoveDirection
paramètre, et retournevoid
, indépendamment du fait que la méthode est statique ou de l'instance. Vous pouvez déclarer le délégué à la portée espace de noms, ou à l'intérieur d'une classe (comme vous le feriez déclarer une classe imbriquée).Donc, après avoir déclaré le
MoveDelegate
quelque part, vous pouvez créer des champs et des variables de ce type:et n'oubliez pas que la méthode doit avoir un correspondant signature:
ensuite, vous pouvez affecter cette méthode à un délégué à un autre endroit:
Il est utile de savoir que .NET (à partir de la version v3.5) fournit quelques prédéfinis générique délégués (
Action
etFunc
) qui peut être utilisé au lieu de déclarer vos propres délégués:À l'aide de ces délégués est à mon humble avis plus lisible, puisque vous pouvez identifier immédiatement des paramètres de la signature de regarde le délégué lui-même (alors que, dans votre cas, il suffit de regarder pour la déclaration).
this
paramètre, c'est à dire le exemple de référence pour la méthode d'instance. Dans le cas le plus simple (fermé type délégué), les délégués pointant vers des méthodes d'instance aura l'instance dans son_target
terrain, tandis que les délégués pointant vers des méthodes statiques qui aura le premier paramètre qui y sont stockées. .NET utilise habituellement (au moins c'était d') fermé instance de délégués et de ouvrir statique délégués, ce qui signifie qu'en général, la méthode d'instance appels (par l'intermédiaire d'un délégué) sont plus rapides parce qu'ils n'ont pas besoin d'un thunk shuffle.Délégué déclaration est en fait une déclaration de type. Il ne peut pas être statique, tout comme vous ne pouvez pas définir une statique enum ou de la structure.
Cependant, je préfère utiliser une interface au lieu de raw délégué.
Considérez ceci:
Dans votre code d'appel:
Ce même esprit de Stratégie de modèle de conception et vous permet de découpler
Actor
mouvement à partir de la mise en œuvre effective de la stratégie (console, graphique, peu importe). Autre stratégie méthodes peuvent être exigés par la suite ce qui en fait un meilleur choix qu'un délégué.Enfin, vous pouvez utiliser un Inversion du cadre de Contrôle de la pour injecter automatiquement stratégie correcte instance dans votre
Actor
classes, donc il n'est pas nécessaire pour l'initialisation manuelle.définir votre délégué, dans votre classe statique déclarer une variable d'instance pour elle.
Laissez-moi vous dire ce qui s'est passé lorsque vous avez déclaré un délégué
Le compilateur crée une classe, dans ce cas appelé
MoveDelegate
, et l'étend avecSystem.MulticastDelegate
.Puisque vous ne pouvez pas étendre non statique type par type statique.
C'est la raison pourquoi le compilateur ne permet pas de délégué statique déclaration.
Mais encore, vous pouvez avoir délégué statique de référence.