2010-12-17 2 views
2

Je souhaite appeler une méthode partielle depuis l'extérieur de la classe déclarante. Ceci n'est pas autorisé car les méthodes partielles sont implicitement privées. Vous ne pouvez pas définir un délégué à indiquer que je suis un si partiel proposais ce qui suit:C#: Méthodes partielles et Action, corps non implémenté

public partial class MyClass { 

     AnotherClass _anotherClass; 

     public MyClass () { 
     _anotherClass = new AnotherClass(); 
     _anotherClass.Method = new Action(() => {    
      this.Method(); 
     }); 
     } 

     partial void Method(); 

     //sometimes this method will be implemented 
     //partial void Method() { 
     //do something 
     //} 
    } 

    public class AnotherClass { 

     public Action Method { get; set;} 

     public void SomeOtherMethod(){ 
     this.Method(); 
     } 
    } 

Les classes sont étroitement couplées, ils sont dans une relation parent-enfant. Je veux que le parent dispose d'une méthode qu'il peut ignorer pour connaître les changements de propriétés sur l'enfant. Je pourrais attacher des gestionnaires d'événements à chacun des enfants, mais l'enfant sait déjà à propos de son parent, donc avoir l'enfant informe directement le parent semble être la voie à suivre. Sauf quand le parent ne s'en soucie pas c'est pourquoi je veux pouvoir mettre en place un partiel si je m'en soucie. Cette question concerne essentiellement la facilité de programmation par rapport à la performance. Je sais que je pourrais attacher des gestionnaires d'événements seulement à la situation où je m'inquiète, mais avec l'implémentation comme ci-dessus je peux générer toutes les méthodes partielles et seulement implémenter les partiels si j'en ai besoin.

Ma question concerne les moments où la méthode partielle Method() n'est pas implémentée. Lorsque la méthode Action est appelée, le compilateur l'élimine-t-il lorsque son corps est vide? Si je reçois un tas de ces appels d'action, est-ce que je pourrais subir une pénalité de performance? Y a-t-il un meilleur moyen d'obtenir la même fonctionnalité?

+0

Vous n'obtiendrez pas de succès perceptible, appeler une action vide est une opération assez bon marché. Je doute que le compilateur écrase l'action vide. –

+0

Je ne comprends pas pourquoi peope parler performance abotu. Si c'est important ... MESUREZ-LE; –

Répondre

3

Per, MSDN (italique ajouté):

Une partie de la classe contient la signature de la méthode. Une implémentation optionnelle peut être définie dans la même partie ou une autre partie. Si l'implémentation n'est pas fournie, la méthode et tous les appels à la méthode sont supprimés au moment de la compilation.

Ainsi, aucune pénalité réelle que les appels sont optimisés.

+0

oui mais l'appel de méthode partielle est à l'intérieur d'une Action qui sera appelée (elle n'aura tout simplement pas de corps) donc il doit y avoir un traitement impliqué. –

+0

Une 'Action' est une méthode void. Le traitement équivaut à appeler une méthode sans corps. Je sais que JIT omet les appels aux méthodes vides, mais même s'il ne l'a pas fait pour l'action, l'appel n'aura aucune incidence sur les performances de façon mesurable. – Jay

0

La différence de performance entre les différents scénarios que vous proposez sera inférieure à la milliseconde. J'irais avec la solution la plus maintenable plutôt que d'essayer d'optimiser pour la performance à un niveau aussi bas. Donc, je voudrais aller avec la solution d'événement parce que je pense que d'autres développeurs .NET qui travaillent sur le code après que vous seriez plus familier avec la solution plutôt que l'approche de méthode partielle exotique que vous présentez.

Questions connexes