2008-09-03 12 views

Antwort

23

Teil Verfahren wurden aus ähnlichen Gründen, warum Teilklassen waren in .Net 2.

Eine partielle Klasse ist ein eingeführt, die sich über mehrere Dateien aufgeteilt werden kann - der Compiler sie alle in eine Datei erstellt, wie es läuft .

Der Vorteil ist, dass Visual Studio einen grafischen Designer für einen Teil der Klasse zur Verfügung stellt, während Programmierer auf der anderen Seite arbeiten.

Das häufigste Beispiel ist der Formular-Designer. Entwickler möchten die Knöpfe, Eingabefelder usw. nicht immer manuell positionieren.

  • In .Net 1 war es automatisch generierten Code in einem #region Block
  • In .Net 2 diese separaten Designer Klassen wurde - die Form ist noch eine Klasse, es ist nur aufgespalten in eine Datei von den Entwicklern bearbeitet und eine von der Formular-Designer

Dies macht die Wartung viel einfacher. Zusammenführungen sind einfacher und es besteht ein geringeres Risiko, dass der VS-Formulardesigner versehentlich manuelle Änderungen an den Codern rückgängig macht.

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

Das zusätzliche Bit ist hier, dass Code benötigt, Methoden zur Verfügung zu stellen, die Entwickler könnten in.

füllen wollen als Entwickler diese Klassen erweitern werden (mit zusätzlichen Teildateien) sie abstrakte Methoden hier nicht benutzen konnten.

Das andere Problem ist, dass die meisten dieser Methoden nicht aufgerufen werden, und das Aufrufen leerer Methoden ist Zeitverschwendung.

Leere Methoden are not optimised out.

So generiert Linq leere Teilmethoden. Wenn Sie nicht Ihre eigenen partiellen erstellen, um sie zu vervollständigen, wird der C# -Compiler sie nur optimieren.

Damit es diese partiellen Methoden tun können immer void zurückgeben.

Wenn Sie ein neuer Linq DBML es schaffen Datei wird eine partielle Klasse automatisch generieren, so etwas wie

[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 in Ihrer eigenen Teildatei können Sie diese erweitern:

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

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

Partielle Methoden können nicht öffentlich sein - da müssten sie dann für andere Klassen da sein, um anzurufen. Wenn Sie Ihre eigenen Code-Generatoren schreiben, kann ich sehen, dass sie nützlich sind, aber ansonsten sind sie nur für den VS-Designer wirklich nützlich.

Das Beispiel, das ich bereits erwähnt 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 andere mögliche Anwendung ist, wenn Sie eine große und komplexe Klasse haben mehrere Dateien verschüttete über Sie Teil Referenzen in der anrufenden Datei wünschen könnten. Allerdings denke ich, dass Sie in diesem Fall zuerst die Klasse vereinfachen sollten.

+3

Große Antwort; Um ein kleines bisschen an Wert hinzuzufügen, können partielle Klassen auch dazu verwendet werden, Methoden und Funktionen zu automatisch generierten Web-Service-Klassen hinzuzufügen. – TheXenocide

+0

@Keith "Partielle Methoden können nicht öffentlich sein - als dann müssten sie für andere Klassen da sein, um zu rufen" Ich denke, dass diese Einschränkung nicht gültig ist als z. In meinem Projekt habe ich ungefähr 15 Methoden in einer Klasse und für bessere Lesbarkeit möchte ich sie in Teilklassen halten. Aber da ich sie nicht öffentlich definieren kann, bin ich gezwungen, sie in derselben Klasse zu halten. –

2

Code generation ist einer der Hauptgründe, sie existieren und einer der Hauptgründe, sie zu verwenden.

EDIT: Obwohl dieser Link zu Visual Basic-Informationen ist, sind die gleichen grundlegenden Prinzipien für C# relevant.

2

Ich sehe sie als leichte Ereignisse. Sie können eine wiederverwendbare Code-Datei haben (normalerweise automatisch generiert, aber nicht unbedingt) und für jede Implementierung einfach die Ereignisse behandeln, die Ihnen in Ihrer partiellen Klasse wichtig sind. Genau so wird es in LINQ to SQL verwendet (und warum die Sprachfunktion erfunden wurde).

10

Partielle Methoden sind im Konzept dem GoF Template Method Verhaltensmuster sehr ähnlich (Design Patterns, p325).

Sie ermöglichen es, das Verhalten eines Algorithmus oder einer Operation an einer Stelle zu definieren und an anderer Stelle zu implementieren oder zu ändern, um die Erweiterbarkeit und Anpassung zu ermöglichen. Ich habe begonnen, partielle Methoden in C# 3.0 anstelle von Template-Methoden zu verwenden, weil ich denke, dass der Code sauberer ist.

Ein nettes Feature ist, dass nicht implementierte partielle Methoden keinen Laufzeitaufwand verursachen, da sie kompiliert werden.

+0

Sie haben Recht. Danke für die Perspektive. –

+0

ja, wirklich! was für eine erstaunliche Sache - ein Mensch (du) siehst etwas, das andere nicht (mich) – zzfima

0

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

Ich versuche, mit partiellen Klassen zu vermeiden (mit Ausnahme von partials von Visual Studio für Designer-Dateien erstellt, die sind gut). 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 darstellt (single responsibility principle), dann sollte der gesamte Code für diese eine Sache an einem Ort sein.