it-swarm.com.de

Wann ist es angebracht, C # -Teilklassen zu verwenden?

Ich habe mich gefragt, ob mir jemand einen Überblick darüber geben könnte, warum ich sie verwenden würde und welchen Vorteil ich dabei gewinnen würde.

474
Asterix

Die größte Verwendung von Teilklassen besteht darin, Code-Generatoren/Designern das Leben zu erleichtern. Mit Teilklassen kann der Generator einfach den Code ausgeben, den er ausgeben muss, und er muss sich nicht um Benutzeränderungen an der Datei kümmern. Es steht dem Benutzer ebenfalls frei, die Klasse mit neuen Mitgliedern zu versehen, indem er eine zweite Teilklasse hat. Dies bietet einen sehr sauberen Rahmen für die Trennung von Bedenken.

Eine bessere Sichtweise ist, zu sehen, wie Designer vor Teilklassen funktionierten. Der WinForms-Designer spuckte den gesamten Code innerhalb einer Region aus, wobei er stark formulierte Kommentare über das Nichtmodifizieren des Codes machte. Es mussten alle möglichen Heuristiken eingefügt werden, um den generierten Code für die spätere Verarbeitung zu finden. Jetzt kann die Datei designer.cs einfach geöffnet werden, und es besteht ein hohes Maß an Sicherheit, dass sie nur den für den Designer relevanten Code enthält.

390
JaredPar

Eine andere Verwendung besteht darin, die Implementierung verschiedener Schnittstellen aufzuteilen, z.

partial class MyClass : IF1, IF2, IF3
{
    // main implementation of MyClass
}


partial class MyClass
{
    // implementation of IF1
}

partial class MyClass
{
    // implementation of IF2
}
240
relascope

Neben den anderen Antworten ...

Ich fand sie hilfreich als Sprungbrett bei der Umgestaltung von Gottesklassen. Wenn eine Klasse mehrere Verantwortlichkeiten hat (insbesondere wenn es sich um eine sehr große Codedatei handelt), ist es für mich von Vorteil, 1x Teilklasse pro Verantwortlichkeit hinzuzufügen, um den Code zu organisieren und dann umzugestalten.

Dies ist sehr hilfreich, da es dazu beitragen kann, den Code besser lesbar zu machen, ohne das Ausführungsverhalten zu beeinflussen. Es kann auch dazu beitragen, festzustellen, wann eine Verantwortung leicht umzugestalten ist oder eng mit anderen Aspekten verflochten ist.

Dies ist jedoch - um genau zu sein - immer noch schlechter Code. Am Ende der Entwicklung möchten Sie immer noch eine Verantwortung pro Klasse ( [~ # ~] nicht [~ # ~] pro Teilklasse). Es ist nur ein Sprungbrett :)

152
STW
  1. Mehrere Entwickler Mit Teilklassen können mehrere Entwickler problemlos an derselben Klasse arbeiten.
  2. Codegenerator Teilklassen werden hauptsächlich vom Codegenerator verwendet, um verschiedene Belange voneinander zu trennen
  3. Partial Methods Mit Partial Classes können Sie auch Partial Methods definieren, wobei ein Entwickler die Methode einfach definieren und der andere Entwickler diese implementieren kann.
  4. Nur teilweise Methodendeklaration Auch wenn der Code nur mit Methodendeklaration kompiliert wird und die Implementierung der Methode nicht vorhanden ist, kann der Compiler diesen Code sicher entfernen, und es tritt kein Fehler beim Kompilieren auf.

    So überprüfen Sie Punkt 4. Erstellen Sie einfach ein winform-Projekt und fügen Sie diese Zeile nach dem Form1-Konstruktor ein, und versuchen Sie, den Code zu kompilieren

    partial void Ontest(string s);
    

Hier einige Punkte, die bei der Implementierung von Teilklassen zu beachten sind: -

  1. Verwenden Sie partielles Schlüsselwort in jedem Teil der partiellen Klasse.
  2. Der Name jedes Teils der Teilklasse sollte derselbe sein, der Name der Quelldatei für jeden Teil der Teilklasse kann jedoch unterschiedlich sein.
  3. Alle Teile einer Teilklasse sollten sich im selben Namespace befinden.
  4. Jeder Teil einer Teilklasse sollte sich in derselben Assembly oder DLL befinden. Mit anderen Worten, Sie können keine Teilklasse in Quelldateien aus einem anderen Klassenbibliotheksprojekt erstellen.
  5. Jeder Teil einer Teilklasse muss die gleiche Barrierefreiheit haben. (d. h .: privat, öffentlich oder geschützt)
  6. Wenn Sie eine Klasse oder Schnittstelle für eine Teilklasse erben, wird sie von allen Teilen dieser Teilklasse geerbt.
  7. Wenn ein Teil einer Teilklasse versiegelt ist, wird die gesamte Klasse versiegelt.
  8. Wenn ein Teil einer Teilklasse abstrakt ist, wird die gesamte Klasse als abstrakte Klasse betrachtet.
78
hellowahab

Ein großer Vorteil besteht darin, generierten Code von handgeschriebenem Code zu trennen, der zur selben Klasse gehört.

Da LINQ to SQL z. B. Teilklassen verwendet, können Sie Ihre eigene Implementierung bestimmter Funktionen (z. B. Viele-zu-Viele-Beziehungen) schreiben, und diese Teile des benutzerdefinierten Codes werden beim erneuten Generieren des Codes nicht überschrieben.

Gleiches gilt für WinForms-Code. Der gesamte von Designer generierte Code befindet sich in einer Datei, die Sie normalerweise nicht berühren. Ihr handgeschriebener Code wird in eine andere Datei geschrieben. Wenn Sie etwas in Designer ändern, werden Ihre Änderungen nicht weggeblasen.

55
Justin Niessner

Es ist richtig, dass Partial Class bei der automatischen Codegenerierung verwendet wird. Eine Verwendung kann darin bestehen, eine große Klassendatei zu verwalten, die möglicherweise tausend Codezeilen enthält. Sie wissen nie, dass Ihre Klasse möglicherweise zehntausend Zeilen enthält, und Sie möchten keine neue Klasse mit einem anderen Namen erstellen.

public partial class Product
{
    // 50 business logic embedded in methods and properties..
}

public partial class Product
{
    // another 50 business logic embedded in methods and properties..
}
//finally compile with product.class file.

Eine andere mögliche Verwendung könnte sein, dass mehr als ein Entwickler an derselben Klasse arbeiten kann, da sie an verschiedenen Orten gespeichert sind. Die Leute mögen lachen, aber man weiß nie, dass es manchmal eine Handvoll sein kann.

Product1.cs

public partial class Product
{
    //you are writing the business logic for fast moving product
}

Product2.cs

public partial class Product
{
    // Another developer writing some business logic...
}

Hoffe es macht Sinn!

19
kausar ahmed

halten Sie alles so sauber wie möglich, wenn Sie mit großen Klassen arbeiten oder wenn Sie in einem Team arbeiten.

12
user406871

Teilklassen erstrecken sich über mehrere Dateien.

How can you use the partial modifier on a C# class declaration?

Mit partial können Sie eine Klasse physisch in mehrere Dateien aufteilen.

Dies wird häufig von Codegeneratoren durchgeführt.

Beispiel

Bei normalen C # -Klassen können Sie eine Klasse nicht in zwei separaten Dateien im selben Projekt deklarieren.

Aber mit dem partiellen Modifikator können Sie.

Dies ist nützlich, wenn eine Datei häufig bearbeitet wird und die andere maschinell generiert oder selten bearbeitet wird.

An Example will clear your concept.

class Program
{
    static void Main()
    {
    A.A1();
    A.A2();
    }
}

//Contents of file A1.cs: C#

using System;

partial class A
{
    public static void A1()
    {
    Console.WriteLine("A1");
    }
}

//Contents of file A2.cs: C#

using System;

partial class A
{
    public static void A2()
    {
    Console.WriteLine("A2");
    }
}

Output

A1
A2

Hier ist ein Teil erforderlich.

If you remove the partial modifier, you will get an error containing this text: [The namespace '<global namespace>' already contains a definition for 'A'].

Tipp: Um dies zu beheben, können Sie entweder das Teilschlüsselwort verwenden oder einen der Klassennamen ändern.

How does the C# compiler deal with partial classes?

Wenn Sie das obige Programm zerlegen, werden Sie feststellen, dass die Dateien A1.cs und A2.cs entfernt wurden.

Sie werden feststellen, dass die Klasse A vorhanden ist.

IL Disassembler Also: Klasse A enthält die Methoden A1 und A2 im selben Codeblock. Die beiden Klassen wurden zu einer zusammengefasst.

Kompiliertes Ergebnis von A1.cs und A2.cs: C #

internal class A
{
    // Methods
    public static void A1()
    {
    Console.WriteLine("A1");
    }

    public static void A2()
    {
    Console.WriteLine("A2");
    }
}

Zusammenfassung

Teilklassen können bestimmte C # -Programmiersituationen vereinfachen.

Sie werden in Visual Studio häufig beim Erstellen von Windows Forms/WPF-Programmen verwendet.

Der maschinengenerierte C # -Code ist separat.

Oder Sie finden die gesamte Beschreibung hier .

11
Vivek Saurav

Die Hauptverwendung für Teilklassen ist generierter Code. Wenn Sie sich das WPF-Netzwerk (Windows Presentation Foundation) ansehen, definieren Sie Ihre Benutzeroberfläche mit Markup (XML). Dieses Markup wird in Teilklassen kompiliert. Sie füllen Code mit eigenen Teilklassen aus.

11
cletus

Wenn Sie eine ausreichend große Klasse haben, die sich nicht für ein effektives Refactoring eignet, können Sie sie in mehrere Dateien aufteilen, um die Organisation zu gewährleisten.

Wenn Sie beispielsweise eine Datenbank für eine Website mit einem Diskussionsforum und einem Produktsystem haben und nicht zwei verschiedene Anbieterklassen erstellen möchten (NICHT das Gleiche wie eine Proxy-Klasse, nur um es klar auszudrücken), können Sie dies Erstellen Sie eine einzelne Teilklasse in verschiedenen Dateien, wie z

MyProvider.cs - Kernlogik

MyProvider.Forum.cs - Methoden, die sich speziell auf das Forum beziehen

MyProvider.Product.cs - Methoden für Produkte

Es ist nur eine andere Möglichkeit, die Dinge zu organisieren.

Wie bereits erwähnt, ist dies die einzige Möglichkeit, einer generierten Klasse Methoden hinzuzufügen, ohne das Risiko einzugehen, dass Ihre Ergänzungen bei der nächsten Neuerstellung der Klasse zerstört werden. Dies ist praktisch bei T4-Code, ORMs usw.

8
3Dave

Als Alternative zu Pre-Compiler-Direktiven.

Wenn Sie Pre-Compiler-Direktiven verwenden (nämlich #IF DEBUG) dann landen Sie mit etwas knorrig aussehendem Code, vermischt mit Ihrem tatsächlichen Release-Code.

Sie können eine separate Teilklasse erstellen, die diesen Code enthält, und entweder die gesamte Teilklasse in eine Direktive einschließen oder diese Codedatei vom Senden an den Compiler ausschließen (und dies auch).

7
STW

Dienstreferenzen sind ein weiteres Beispiel, bei dem Teilklassen hilfreich sind, um generierten Code von benutzerdefiniertem Code zu trennen.

Sie können die Serviceklassen "erweitern", ohne sie beim Aktualisieren der Servicereferenz überschreiben zu lassen.

Eine andere Verwendung, die ich sah, ist,

Erweiterung einer großen abstrakten Klasse in Bezug auf Datenzugriffslogik,

ich habe verschiedene Dateien mit Namen Post.cs, Comment.cs, Pages.cs ...

in Post.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of post..
}


in Comment.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of comment..
}

in Pages.cs 

public partial class XMLDAO :BigAbstractClass
{
// CRUD methods of Pages..
}

Teilklassen ermöglichen es, einem entsprechend gestalteten Programm Funktionalität hinzuzufügen, indem lediglich Quelldateien hinzugefügt werden. Beispielsweise könnte ein Dateiimportprogramm so entworfen werden, dass verschiedene Arten bekannter Dateien hinzugefügt werden können, indem Module hinzugefügt werden, die diese verarbeiten. Beispielsweise könnte der Hauptdateitypkonverter eine kleine Klasse enthalten:

Teilweise öffentliche Klasse zzFileConverterRegistrar 
 Event Register (ByVal mainConverter als zzFileConverter) 
 Sub registerAll (ByVal mainConverter als zzFileConverter) 
 RaiseEvent Register (mainConverter) 
 End Sub [. .] Klasse beenden

Jedes Modul, das eine oder mehrere Arten von Dateikonvertern registrieren möchte, kann Folgendes enthalten:

 Teilweise öffentliche Klasse zzFileConverterRegistrar 
 Private Sub RegisterGif (ByVal mainConverter als zzFileConverter) Behandelt Me.Register 
 MainConverter.RegisterConverter ("GIF", GifConverter.NewFactory) [. End Sub 
 End Class 

Beachten Sie, dass die Hauptklasse des Dateikonverters nicht "verfügbar" ist, sondern nur eine kleine Stub-Klasse bereitstellt, an die sich Add-In-Module anschließen können. Das Risiko von Namenskonflikten ist gering, aber wenn die "Register" -Routine jedes Add-In-Moduls dem Dateityp entsprechend benannt wird, sollte dies wahrscheinlich kein Problem darstellen. Man könnte ein GUID im Namen des Registrierungs-Unterprogramms einfügen, wenn man sich über solche Dinge Sorgen macht.

Bearbeiten/Nachtrag Der Zweck hiervon ist es, ein Mittel bereitzustellen, mit dem eine Vielzahl von getrennten Klassen ein Hauptprogramm oder eine Klasse über sie informieren kann. Mit zzFileConverterRegistrar kann der Hauptdateikonverter nur eine Instanz davon erstellen und die Methode registerAll aufrufen, die das Register-Ereignis auslöst. Jedes Modul, das dieses Ereignis einbinden möchte, kann als Antwort darauf beliebigen Code ausführen (das ist die ganze Idee), aber ein Modul kann nichts tun, indem es die zzFileConverterRegistrar-Klasse falsch erweitert, außer eine Methode zu definieren, deren Name mit dem Namen einer anderen übereinstimmt . Es wäre sicherlich möglich, dass eine falsch geschriebene Erweiterung eine andere falsch geschriebene Erweiterung unterbricht, aber die Lösung dafür ist für jeden, der nicht möchte, dass seine Erweiterung einfach richtig geschrieben wird.

Ohne die Verwendung von Teilklassen könnte man irgendwo in der Hauptklasse des Dateikonverters etwas Code haben, der so aussieht:

 RegisterConverter ("GIF", GifConvertor.NewFactory) 
 RegisterConverter ("BMP", BmpConvertor.NewFactory) 
 RegisterConverter ("JPEG", JpegConvertor.NewFactory) 

das Hinzufügen eines weiteren Konvertermoduls würde jedoch erfordern, dass dieser Teil des Konvertercodes aufgerufen und der Liste der neuen Konverter hinzugefügt wird. Mit Teilmethoden ist das nicht mehr nötig - alle Konverter werden automatisch mit einbezogen.

4
supercat

Die meisten Leute bemerken, dass partial nur für eine Klasse mit einer generierten Codedatei oder für Interfaces verwendet werden sollte. Ich bin anderer Meinung und hier ist der Grund.

Schauen wir uns zum Beispiel die C # System.Math-Klasse an ... das ist class. Ich würde nicht versuchen, mehr als 70 Methoden in eine einzige Codedatei zu packen. Es wäre ein Albtraum, diesen Zustand beizubehalten.

Das Platzieren jeder Mathematikmethode in einzelnen Teilklassendateien und aller Codedateien in einem Mathematikordner im Projekt wäre eine wesentlich sauberere Organisation.

Das gleiche könnte/würde für viele andere Klassen gelten, die eine große Menge unterschiedlicher Funktionen haben. Eine Klasse zum Verwalten der PrivateProfile-API kann beispielsweise davon profitieren, dass sie in einen sauberen Satz von Teilklassendateien in einem einzelnen Projektordner aufgeteilt wird.

Persönlich teile ich auch das, was die meisten Leute "Helfer" - oder "Utility" -Klassen nennen, in einzelne Teildateien für jede Methode oder Methodenfunktionsgruppe auf. In einem Projekt verfügt die String-Helfer-Klasse beispielsweise über fast 50 Methoden. Das wäre eine lange, unhandliche Codedatei, selbst wenn Regionen verwendet würden. Es ist wesentlich einfacher, einzelne Teilklassendateien für jede Methode zu verwalten.

Ich würde nur vorsichtig sein, wenn ich Teilklassen verwende, und dabei das gesamte Layout der Codedatei im gesamten Projekt konsistent halten. B. öffentliche Aufzählungen von Klassen und private Mitglieder in eine Common.cs-Datei oder eine Datei mit ähnlichem Namen im Ordner einfügen, anstatt sie auf die Dateien zu verteilen, es sei denn, sie beziehen sich nur auf die Teildatei, in der sie enthalten sind.

Beachten Sie, dass Sie beim Aufteilen einer Klasse in separate Dateien auch die Texteditor-Teilungsleiste nicht mehr verwenden können, mit der Sie zwei verschiedene Abschnitte einer aktuellen Datei gleichzeitig anzeigen können.

3
deegee

Von MSDN :

1.Zur Kompilierungszeit werden Attribute von Partial-Type-Definitionen zusammengeführt. Betrachten Sie beispielsweise die folgenden Deklarationen:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Sie entsprechen den folgenden Erklärungen:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Folgendes wird aus allen Definitionen von Teiltypen zusammengeführt:

  • XML-Kommentare

  • schnittstellen

  • parameterattribute vom generischen Typ

  • klassenattribute

  • mitglieder

2.Eine andere Sache, verschachtelte Teilklassen können auch teilweise sein:

partial class ClassWithNestedClass
{
    partial class NestedClass { }
}

partial class ClassWithNestedClass
{
    partial class NestedClass { }
}
3
Eli

Teilklassen halfen kürzlich bei der Quellcodeverwaltung, bei der mehrere Entwickler einer Datei neue Methoden hinzufügten (von Resharper automatisiert).

Diese Pushs to Git verursachten Zusammenführungskonflikte. Ich habe keine Möglichkeit gefunden, das Merge-Tool anzuweisen, die neuen Methoden als vollständigen Codeblock zu verwenden.

Teilklassen in dieser Hinsicht ermöglichen es Entwicklern, sich an eine Version ihrer Datei zu halten, und wir können sie später von Hand wieder zusammenführen.

beispiel -

  • MainClass.cs - enthält Felder, Konstruktor usw
  • MainClass1.cs - ein neuer Code für Entwickler während der Implementierung
  • MainClass2.cs - ist eine weitere Entwicklerklasse für ihren neuen Code.
3
Jay

Hier finden Sie eine Auflistung einiger Vorteile von Teilklassen.

Sie können UI-Designcode und Geschäftslogikcode so trennen, dass sie leicht zu lesen und zu verstehen sind. Beispielsweise entwickeln Sie eine Webanwendung mit Visual Studio und fügen ein neues Webformular hinzu. Dann gibt es zwei Quelldateien: "aspx.cs" und "aspx.designer.cs". Diese beiden Dateien haben dieselbe Klasse mit dem Teilschlüsselwort. Die Klasse ".aspx.cs" enthält den Geschäftslogikcode, während "aspx.designer.cs" die Definition eines Benutzeroberflächensteuerelements enthält.

Bei der Arbeit mit automatisch generierten Quellen kann der Code der Klasse hinzugefügt werden, ohne dass die Quelldatei neu erstellt werden muss. Beispielsweise arbeiten Sie mit LINQ to SQL und erstellen eine DBML-Datei. Wenn Sie jetzt eine Tabelle ziehen und ablegen, wird in designer.cs eine Teilklasse erstellt, und alle Tabellenspalten haben Eigenschaften in der Klasse. Sie benötigen mehr Spalten in dieser Tabelle, um das UI-Raster zu binden, möchten aber der Datenbanktabelle keine neue Spalte hinzufügen, damit Sie eine separate Quelldatei für diese Klasse erstellen können, die eine neue Eigenschaft für diese Spalte hat sei eine Teilklasse. Dies hat zwar Auswirkungen auf die Zuordnung zwischen Datenbanktabelle und DBML-Entität, Sie können jedoch problemlos ein zusätzliches Feld abrufen. Dies bedeutet, dass Sie den Code selbst schreiben können, ohne den vom System generierten Code zu verändern.

Mehr als ein Entwickler kann gleichzeitig den Code für die Klasse schreiben.

Sie können Ihre Anwendung besser verwalten, indem Sie große Klassen komprimieren. Angenommen, Sie haben eine Klasse mit mehreren Schnittstellen, sodass Sie abhängig von den Schnittstellenimplementierungen mehrere Quelldateien erstellen können. Es ist leicht zu verstehen und zu pflegen, dass eine Schnittstelle implementiert ist, auf der die Quelldatei eine Teilklasse hat.

1
shashi

Ich weiß, dass diese Frage wirklich alt ist, aber ich möchte nur meine Meinung zu Teilklassen hinzufügen.

Ein Grund, warum ich persönlich Teilklassen benutze, ist das Erstellen von Bindungen für ein Programm, insbesondere für Zustandsautomaten.

Zum Beispiel ist OpenGL eine Zustandsmaschine, es gibt Heaps von Methoden, die alle global geändert werden können. Meiner Erfahrung nach kann die Klasse jedoch etwas Ähnliches wie OpenGL binden, wenn es so viele Methoden gibt 10 k LOC.

Teilklassen werden dies für mich aufschlüsseln nd helfen mir, Methoden schnell zu finden.

1
user6630825

Immer wenn ich eine Klasse habe, die eine verschachtelte Klasse mit einer signifikanten Größe/Komplexität enthält, markiere ich die Klasse als partial und füge die verschachtelte Klasse in eine separate Datei ein. Ich benenne die Datei mit der verschachtelten Klasse nach der Regel: [Klassenname]. [Name der verschachtelten Klasse] .cs.

Im folgenden MSDN-Blog wird die Verwendung von Teilklassen mit verschachtelten Klassen aus Gründen der Wartbarkeit erläutert: http://blogs.msdn.com/b/marcelolr/archive/2009/04/13/using-partial-classes-with-nested- classes-for-maintenanceability.aspx

1

Teilklassen werden in erster Linie zur Unterstützung von Codegeneratoren eingeführt, damit wir (Benutzer) nicht all unsere Arbeit/Änderungen an den generierten Klassen wie der .designer.cs-Klasse von ASP.NET verlieren, wenn wir fast alle neu generierten Tools neu generieren Code LINQ, EntityFrameworks, ASP.Net Verwenden Sie Teilklassen für generierten Code, damit wir die Logik dieser generierten Codes unter Ausnutzung von Teilklassen und Methoden sicher hinzufügen oder ändern können. Seien Sie jedoch sehr vorsichtig, bevor Sie dem generierten Code mithilfe von Teilklassen Inhalte hinzufügen Es ist einfacher, wenn wir den Build abbrechen, aber am schlimmsten, wenn wir Laufzeitfehler einführen. Weitere Informationen finden Sie hier http://www.4guysfromrolla.com/articles/071509-1.aspx

0
Kiran Bheemarti