Partielle Klassen und Methoden (C#-Programmierhandbuch)Partial Classes and Methods (C# Programming Guide)

Es ist möglich, die Definition einer Klasse oder einer Struktur, einer Schnittstelle oder einer Methode auf zwei oder mehr Quelldateien aufzuteilen.It is possible to split the definition of a class or a struct, an interface or a method over two or more source files. Jede Quelldatei enthält einen Abschnitt der Typ- oder Methodendefinition. Die Teile werden bei der Kompilierung der Anwendung miteinander kombiniert.Each source file contains a section of the type or method definition, and all parts are combined when the application is compiled.

TeilklassenPartial Classes

Es gibt mehrere Situationen, bei denen das Aufteilen einer Klassendefinition wünschenswert ist:There are several situations when splitting a class definition is desirable:

  • Wenn Sie an großen Projekten arbeiten, können durch das Verteilen einer Klasse auf mehrere Dateien mehrere Programmierer gleichzeitig daran arbeiten.When working on large projects, spreading a class over separate files enables multiple programmers to work on it at the same time.

  • Wenn Sie mit automatisch erzeugten Quellen arbeiten, kann Code einer Klasse hinzugefügt werden, ohne die Quelldatei neu zu erstellen.When working with automatically generated source, code can be added to the class without having to recreate the source file. Visual Studio verwendet diesen Ansatz, wenn es Windows Forms, Webdienst-Wrappercode usw. erstellt.Visual Studio uses this approach when it creates Windows Forms, Web service wrapper code, and so on. Sie können Code erstellen, der diese Klassen verwendet, ohne die von Visual Studio erstellte Datei ändern zu müssen.You can create code that uses these classes without having to modify the file created by Visual Studio.

  • Um eine Klassendefinition aufzuteilen, verwenden Sie den Schlüsselwortmodifizierer partial, wie hier gezeigt wird:To split a class definition, use the partial keyword modifier, as shown here:

public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

Das Schlüsselwort partial gibt an, dass andere Teile der Klasse, Struktur oder Schnittstelle im Namespace definiert werden können.The partial keyword indicates that other parts of the class, struct, or interface can be defined in the namespace. Alle Teile müssen das Schlüsselwort partial verwenden.All the parts must use the partial keyword. Alle Teile müssen zur Kompilierzeit verfügbar sein, um den endgültigen Typ zu bilden.All the parts must be available at compile time to form the final type. Alle Teile müssen die gleiche Zugriffsebene haben, z.B. public, private usw.All the parts must have the same accessibility, such as public, private, and so on.

Wenn ein beliebiger Teil als abstrakt deklariert wird, wird anschließend der ganze Typ als abstrakt betrachtet.If any part is declared abstract, then the whole type is considered abstract. Wenn ein beliebiges Teil als versiegelt deklariert wird, wird anschließend der ganze Typ als versiegelt betrachtet.If any part is declared sealed, then the whole type is considered sealed. Wenn ein beliebiger Teil einen Basistyp deklariert, erbt der ganze Typ diese Klasse.If any part declares a base type, then the whole type inherits that class.

Alle Teile, die eine Basisklasse angeben, müssen übereinstimmen, aber Teile, die eine Basisklasse auslassen, erben weiterhin den Basistyp.All the parts that specify a base class must agree, but parts that omit a base class still inherit the base type. Teile können unterschiedliche Basisschnittstellen angeben, und der letzte Typ implementiert alle Schnittstellen, die von allen Teildeklarationen aufgeführt sind.Parts can specify different base interfaces, and the final type implements all the interfaces listed by all the partial declarations. Alle Klassen-, Struktur- und Schnittstellenmember, die in einer Teildefinition deklariert wurden, sind für alle anderen Teile verfügbar.Any class, struct, or interface members declared in a partial definition are available to all the other parts. Der endgültige Typ besteht aus allen Teilen zur Kompilierzeit.The final type is the combination of all the parts at compile time.

Hinweis

Der partial-Modifizierer ist nicht für Delegat- oder Enumerationsdeklarationen verfügbar.The partial modifier is not available on delegate or enumeration declarations.

Im folgenden Beispiel wird gezeigt, dass geschachtelte Typen eine Teilausführung sein können, selbst wenn der Typ, in dem sie geschachtelt sind, selbst keine ist.The following example shows that nested types can be partial, even if the type they are nested within is not partial itself.

class Container
{
    partial class Nested
    {
        void Test() { }
    }
    partial class Nested
    {
        void Test2() { }
    }
}

Zur Kompilierzeit werden Attribute von partiellen Typdefinitionen zusammengeführt.At compile time, attributes of partial-type definitions are merged. Betrachten Sie beispielsweise die folgenden Deklarationen:For example, consider the following declarations:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Sie entsprechen den folgenden Deklarationen:They are equivalent to the following declarations:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Die folgenden werden aus allen partiellen Typdefinitionen zusammengeführt:The following are merged from all the partial-type definitions:

  • XML-KommentareXML comments

  • Schnittstelleninterfaces

  • Generische Parameterattributegeneric-type parameter attributes

  • Klassenattributeclass attributes

  • Membermembers

Betrachten Sie beispielsweise die folgenden Deklarationen:For example, consider the following declarations:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

Sie entsprechen den folgenden Deklarationen:They are equivalent to the following declarations:

class Earth : Planet, IRotate, IRevolve { }

BeschränkungenRestrictions

Es sind mehrere Regeln zu beachten, wenn Sie partielle Klassendefinitionen verwenden:There are several rules to follow when you are working with partial class definitions:

  • Alle partiellen Typdefinitionen, die als Teile des gleichen Typs vorgesehen sind, müssen mit partial geändert werden.All partial-type definitions meant to be parts of the same type must be modified with partial. Die folgenden Klassendeklarationen erzeugen z.B. einen Fehler:For example, the following class declarations generate an error:

    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
  • Der partial-Modifizierer kann nur unmittelbar vor den Schlüsselwörtern class, struct oder interface erscheinen.The partial modifier can only appear immediately before the keywords class, struct, or interface.

  • Geschachtelte partielle Typen sind in partiellen Typdefinitionen zulässig, wie im folgenden Beispiel dargestellt wird:Nested partial types are allowed in partial-type definitions as illustrated in the following example:

    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
  • Alle partiellen Typdefinitionen, die als Teile des gleichen Typs vorgesehen sind, müssen in der gleichen Assembly und demselben Modul (EXE- oder DLL-Datei) definiert werden.All partial-type definitions meant to be parts of the same type must be defined in the same assembly and the same module (.exe or .dll file). Partielle Definitionen können nicht mehrere Module umfassen.Partial definitions cannot span multiple modules.

  • Der Klassenname und die generischen Typparameter müssen mit allen partiellen Typdefinitionen übereinstimmen.The class name and generic-type parameters must match on all partial-type definitions. Generische Typen können partiell sein.Generic types can be partial. Jede partielle Definition muss die gleichen Parameternamen in der gleichen Reihenfolge aufweisen.Each partial declaration must use the same parameter names in the same order.

  • Die nachfolgenden Schlüsselwörter für eine partielle Typdefinition sind optional, wenn sie aber für eine partielle Definition vorhanden sind, können sie nicht mit anderen Schlüsselwörtern in Konflikt treten, die in anderen partiellen Definitionen desselben Typs angegeben wurden:The following keywords on a partial-type definition are optional, but if present on one partial-type definition, cannot conflict with the keywords specified on another partial definition for the same type:

Beispiel 1Example 1

BeschreibungDescription

Im folgenden Beispiel werden die Felder und der Konstruktor der Klasse (CoOrds) in einer partiellen Klassendefinition deklariert, und der Member (PrintCoOrds) wird in einer anderen partiellen Klassendefinition deklariert.In the following example, the fields and the constructor of the class, CoOrds, are declared in one partial class definition, and the member, PrintCoOrds, is declared in another partial class definition.

CodeCode

public partial class CoOrds
{
    private int x;
    private int y;

    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class CoOrds
{
    public void PrintCoOrds()
    {
        Console.WriteLine("CoOrds: {0},{1}", x, y);
    }

}

class TestCoOrds
{
    static void Main()
    {
        CoOrds myCoOrds = new CoOrds(10, 15);
        myCoOrds.PrintCoOrds();

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: CoOrds: 10,15

Beispiel 2Example 2

BeschreibungDescription

Im folgenden Beispiel wird gezeigt, dass Sie auch partielle Strukturen und Schnittstellen entwickeln können.The following example shows that you can also develop partial structs and interfaces.

CodeCode

partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

Partielle MethodenPartial Methods

Eine partielle Klasse oder Struktur kann eine partielle Methode enthalten.A partial class or struct may contain a partial method. Ein Teil der Klasse enthält die Signatur der Methode.One part of the class contains the signature of the method. Eine optionale Implementierung kann im gleichen oder in einem anderen Teil definiert werden.An optional implementation may be defined in the same part or another part. Wenn die Implementierung nicht bereitgestellt wird, werden anschließend die Methode sowie alle Aufrufe an die Methode zur Kompilierzeit entfernt.If the implementation is not supplied, then the method and all calls to the method are removed at compile time.

Mit partiellen Methoden kann der Implementierer des einen Teils einer Klasse eine Methode definieren, die einem Ereignis ähnelt.Partial methods enable the implementer of one part of a class to define a method, similar to an event. Der Implementierer des anderen Teils der Klasse kann entscheiden, ob die Methode implementiert wird.The implementer of the other part of the class can decide whether to implement the method or not. Wenn die Methode nicht implementiert wird, kann der Compiler anschließend die Methodensignatur und alle Aufrufe an die Methode entfernen.If the method is not implemented, then the compiler removes the method signature and all calls to the method. Die Aufrufe an die Methode, einschließlich Ergebnissen, die bei der Auswertung eines Arguments im Aufruf auftreten würden, haben zur Laufzeit keine Auswirkung.The calls to the method, including any results that would occur from evaluation of arguments in the calls, have no effect at run time. Deshalb kann jeder Code in der partiellen Klasse eine partielle Methode frei verwenden, selbst wenn die Implementation nicht bereitgestellt wird.Therefore, any code in the partial class can freely use a partial method, even if the implementation is not supplied. Es ergeben sich keine Laufzeit- oder Kompilierzeitfehler, wenn die Methode aufgerufen, aber nicht implementiert wird.No compile-time or run-time errors will result if the method is called but not implemented.

Partielle Methoden sind besonders nützlich, um generierten Code anzupassen.Partial methods are especially useful as a way to customize generated code. Sie ermöglichen, dass Methodenname und -signatur reserviert werden können, sodass generierter Code die Methode aufrufen kann, aber der Entwickler über die Implementierung der Methode entscheiden kann.They allow for a method name and signature to be reserved, so that generated code can call the method but the developer can decide whether to implement the method. Wie partielle Klassen ermöglichen partielle Methoden, dass Code, der von einem Codegenerator erstellt wurde, zusammen mit Code, der von einem menschlichen Entwickler erstellt wurde, ohne Laufzeitkosten ausgeführt wird.Much like partial classes, partial methods enable code created by a code generator and code created by a human developer to work together without run-time costs.

Eine partielle Methodendeklaration besteht aus zwei Teilen: der Definition und der Implementierung.A partial method declaration consists of two parts: the definition, and the implementation. Diese können in separaten Teilen einer partiellen Klasse oder im gleichen Teil sein.These may be in separate parts of a partial class, or in the same part. Wenn es keine Implementierungsdeklaration gibt, optimiert der Compiler anschließend sowohl die definierende Deklaration als auch alle Aufrufe an die Methode.If there is no implementation declaration, then the compiler optimizes away both the defining declaration and all calls to the method.

// Definition in file1.cs  
partial void onNameChanged();  

// Implementation in file2.cs  
partial void onNameChanged()  
{  
  // method body  
}  
  • Partielle Methodendeklarationen müssen mit dem Kontextschlüsselwort partial beginnen, und die Methode muss void zurückgeben.Partial method declarations must begin with the contextual keyword partial and the method must return void.

  • Partielle Methoden können ref-Parameter, aber keine out-Parameter besitzen.Partial methods can have ref but not out parameters.

  • Partielle Methoden sind implizit privat und können daher nicht virtuell sein.Partial methods are implicitly private, and therefore they cannot be virtual.

  • Partielle Methoden können nicht extern sein, da das Vorhandensein des Texts bestimmt, ob sie definierend oder implementierend sind.Partial methods cannot be extern, because the presence of the body determines whether they are defining or implementing.

  • Partielle Methoden können statische und unsichere Modifizierer besitzen.Partial methods can have static and unsafe modifiers.

  • Partielle Methoden können generisch sein.Partial methods can be generic. Einschränkungen gelten für die definierende partielle Methodendeklaration und können optional für die implementierende wiederholt werden.Constraints are put on the defining partial method declaration, and may optionally be repeated on the implementing one. Parameter- und Typparameternamen müssen in der implementierenden und definierenden Deklaration nicht gleich sein.Parameter and type parameter names do not have to be the same in the implementing declaration as in the defining one.

  • Sie können einen Delegaten für eine partielle Methode erstellen, die definiert und implementiert wurde. Dies geht jedoch nicht für partielle Methoden, die nur definiert wurden.You can make a delegate to a partial method that has been defined and implemented, but not to a partial method that has only been defined.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
KlassenClasses
StrukturenStructs
SchnittstellenInterfaces
partial (Typ)partial (Type)