2010-12-17 3 views
2

Ich möchte eine partielle Methode von außerhalb der deklarierenden Klasse aufrufen. Dies ist nicht erlaubt, da partielle Methoden implizit privat sind. Sie können nicht einen Delegierten auf einen Teil-zu-Punkt so schlage ich folgendes:C#: Partielle Methoden und Aktion, nicht implementiert Körper

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(); 
     } 
    } 

Die Klassen eng gekoppelt sind, sind sie in der Eltern-Kind-Beziehung. Ich möchte, dass das übergeordnete Element über eine Methode verfügt, die es überschreiben kann, um über Eigenschaftenänderungen für das untergeordnete Element zu erfahren. Ich könnte Event-Handler an jedes der Kinder anhängen, aber das Kind weiß bereits von seinem Elternteil, so dass das Kind den Eltern direkt informiert, scheint der Weg zu sein. Außer wenn der Elternteil egal ist, warum möchte ich in der Lage sein, eine teilweise zu implementieren, wenn ich mich interessiere. Diese Frage bezieht sich im Wesentlichen auf die Einfachheit der Programmierung im Vergleich zur Leistung. Ich weiß, dass ich Event-Handler nur an die Situation anhängen kann, in der ich mich interessiere, aber mit der Implementierung wie oben kann ich alle Teilmethoden generieren und nur die Partials implementieren, wenn es mich interessiert.

Meine Frage bezieht sich auf die Zeiten, dass die partielle Methode Method() nicht implementiert ist. Wenn die Aktionsmethode aufgerufen wird, wird der Compiler sie optimieren, da der Textkörper leer ist. Wenn ich einen Haufen dieser Aktionsanrufe bekomme, könnte ich eine Leistungseinbuße erleiden? Gibt es eine bessere Möglichkeit, dieselbe Funktionalität zu erhalten?

+0

Sie werden keinen spürbaren Leistungseinbruch bekommen, eine leere Aktion zu nennen ist eine ziemlich billige Operation. Ich bezweifle, dass der Compiler die Aktion void abstellen wird. –

+0

Ich verstehe nicht, warum peope über Leistung reden. Wenn es darauf ankommt ... MEASURE IT;) –

Antwort

3

Per, MSDN (Hervorhebung hinzugefügt):

Ein Teil der Klasse enthält die Signatur der Methode. Eine optionale Implementierung kann in dem gleichen Teil oder einem anderen Teil definiert werden. Wenn die Implementierung nicht geliefert wird, werden die Methode und alle Aufrufe der Methode zur Kompilierzeit entfernt.

Also keine echte Strafe, da die Anrufe weg optimiert werden.

+0

ja, aber der partielle Methodenaufruf befindet sich in einer Aktion, die aufgerufen wird (sie wird nur keinen Körper haben), daher muss etwas an der Verarbeitung beteiligt sein. –

+0

Eine 'Aktion' ist eine ungültige Methode. Die Verarbeitung entspricht dem Aufruf einer Methode ohne Body. Ich weiß, dass JIT Aufrufe zum Leeren von Methoden weglässt, aber selbst wenn dies nicht für die "Aktion" getan wird, wird der Aufruf die Leistung nicht in messbarer Weise beeinflussen. – Jay

0

Der Leistungsunterschied zwischen den verschiedenen Szenarien, die Sie vorschlagen, liegt unter einer Millisekunde. Ich würde mit der wartungsfreundlichsten Lösung gehen, anstatt zu versuchen, die Leistung auf einem so niedrigen Niveau zu optimieren.

Also, ich würde mit der Event-Lösung gehen, weil ich denke, dass andere .NET-Entwickler, die an dem Code nach Ihnen arbeiten, eher mit der Lösung vertraut sind als mit dem exotischen partiellen Methodenansatz, den Sie präsentieren.