Frage

Ich habe in letzter Zeit etwas über Teilmethoden gelesen C#-Sprachspezifikation, Daher verstehe ich die Prinzipien, frage mich aber, wie die Leute sie tatsächlich anwenden.Gibt es ein bestimmtes Entwurfsmuster, das von Teilmethoden profitiert?

War es hilfreich?

Lösung

Teilmethoden wurden aus ähnlichen Gründen eingeführt wie Teilklassen in .Net 2.

Eine Teilklasse ist eine Klasse, die auf mehrere Dateien aufgeteilt werden kann – der Compiler baut sie während der Ausführung alle in einer Datei zusammen.

Dies hat den Vorteil, dass Visual Studio einen grafischen Designer für einen Teil der Klasse bereitstellen kann, während Programmierer an dem anderen arbeiten.

Das häufigste Beispiel ist der Formulardesigner.Entwickler möchten Schaltflächen, Eingabefelder usw. nicht die meiste Zeit von Hand positionieren.

  • In .Net 1 handelte es sich um automatisch generierten Code in a #region Block
  • In .Net 2 wurden diese zu separaten Designerklassen – das Formular ist immer noch eine Klasse, es ist lediglich in eine von den Entwicklern bearbeitete Datei und eine vom Formulardesigner aufgeteilte Datei aufgeteilt

Dies erleichtert die Pflege beider erheblich.Zusammenführungen sind einfacher und es besteht ein geringeres Risiko, dass der VS-Formulardesigner versehentlich manuelle Änderungen des Programmierers rückgängig macht.

In .Net 3.5 wurde Linq eingeführt.Linq verfügt über einen DBML-Designer zum Erstellen Ihrer Datenstrukturen, der automatischen Code generiert.

Das Extra hier ist der Code, der benötigt wird, um Methoden bereitzustellen, die Entwickler möglicherweise ausfüllen möchten.

Da Entwickler diese Klassen erweitern werden (mit zusätzlichen Teildateien), konnten sie hier keine abstrakten Methoden verwenden.

Das andere Problem besteht darin, dass diese Methoden in den meisten Fällen nicht aufgerufen werden und das Aufrufen leerer Methoden Zeitverschwendung ist.

Leere Methoden sind nicht optimiert.

Daher generiert Linq leere Teilmethoden.Wenn Sie keinen eigenen Teil erstellen, um sie zu vervollständigen, optimiert der C#-Compiler sie einfach.

Damit dies möglich ist, geben Teilmethoden immer void zurück.

Wenn Sie eine neue Linq DBML-Datei erstellen, wird automatisch eine Teilklasse generiert, etwa so

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Dann können Sie dies in Ihrer eigenen Teildatei erweitern:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Wenn Sie diese Methoden nicht erweitern, werden sie sofort optimiert.

Teilmethoden können nicht öffentlich sein, da sie dann für den Aufruf anderer Klassen verfügbar sein müssten.Wenn Sie Ihre eigenen Codegeneratoren schreiben, kann ich mir vorstellen, dass sie nützlich sind, aber ansonsten sind sie nur für den VS-Designer wirklich nützlich.

Das zuvor erwähnte Beispiel ist eine Möglichkeit:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Eine weitere mögliche Verwendung besteht darin, dass Sie bei einer großen und komplexen Klasse, die über mehrere Dateien verteilt ist, möglicherweise Teilreferenzen in der aufrufenden Datei benötigen.Ich denke jedoch, dass Sie in diesem Fall zunächst über eine Vereinfachung der Klasse nachdenken sollten.

Andere Tipps

Partielle Methoden sind vom Konzept her der GoF sehr ähnlich Vorlagenmethode Verhaltensmuster (Designmuster, S. 325).

Sie ermöglichen es, das Verhalten eines Algorithmus oder einer Operation an einem Ort zu definieren und an anderer Stelle zu implementieren oder zu ändern, was Erweiterbarkeit und Anpassung ermöglicht.Ich habe begonnen, Teilmethoden in C# 3.0 anstelle von Vorlagenmethoden zu verwenden, weil ich denke, dass der Code sauberer ist.

Ein nettes Feature ist, dass nicht implementierte Teilmethoden beim Wegkompilieren keinen Laufzeitaufwand verursachen.

Codegenerierung ist einer der Hauptgründe für ihre Existenz und einer der Hauptgründe für ihre Nutzung.


BEARBEITEN:Auch wenn es sich bei diesem Link um spezifische Informationen zu Visual Basic handelt, gelten für C# dieselben Grundprinzipien.

Ich sehe sie als leichte Ereignisse.Sie können eine wiederverwendbare Codedatei haben (normalerweise automatisch generiert, aber nicht unbedingt) und für jede Implementierung einfach die Ereignisse verarbeiten, die Sie in Ihrer Teilklasse interessieren.Tatsächlich wird es in LINQ to SQL so verwendet (und warum die Sprachfunktion erfunden wurde).

Hier ist die beste Ressource für Teilklassen in C#.NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

Ich versuche, die Verwendung partieller Klassen zu vermeiden (mit Ausnahme von partiellen Klassen, die von Visual Studio für Designerdateien erstellt wurden).die sind großartig).Für mich ist es wichtiger, den gesamten Code für eine Klasse an einem Ort zu haben.Wenn Ihre Klasse gut gestaltet ist und eine Sache repräsentiert (Prinzip der Einzelverantwortung), dann sollte sich der gesamte Code für diese eine Sache an einem Ort befinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top