Klassen (C#-Programmierhandbuch)Classes (C# Programming Guide)

Ein Klasse ist ein Konstrukt, das Ihnen ermöglicht, Ihre eigenen benutzerdefinierten Typen erstellen, indem Variablen anderer Typen, Methoden und Ereignisse zusammengefasst werden.A class is a construct that enables you to create your own custom types by grouping together variables of other types, methods and events. Eine Klasse ist mit einem Entwurf vergleichbar.A class is like a blueprint. Sie definiert die Daten und das Verhalten eines Typs.It defines the data and behavior of a type. Wenn die Klasse nicht als statisch deklariert wird, kann der Clientcode Instanzen von ihr erstellen.If the class is not declared as static, client code can create instances of it. Diese Instanzen sind Objekte, die einer Variable zugewiesen werden.These instances are objects which are assigned to a variable. Die Instanz einer Klasse verbleibt im Arbeitsspeicher, bis alle Verweise darauf ihre Gültigkeit verlieren.The instance of a class remains in memory until all references to it go out of scope. Zu diesem Zeitpunkt markiert die CLR sie als geeignet für die Garbage Collection.At that time, the CLR marks it as eligible for garbage collection. Wenn die Klasse als statisch deklariert wird, können Sie keine Instanzen erstellen, und der Clientcode kann nur über die Klasse selbst auf sie zugreifen.If the class is declared as static, you cannot create instances, and client code can only access it through the class itself. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.For more information, see Static Classes and Static Class Members.

VerweistypenReference types

Ein Typ, der als Klasse definiert ist, ist ein Referenztyp.A type that is defined as a class is a reference type. Wenn Sie zur Laufzeit eine Variable eines Referenztyps deklarieren, enthält die Variable zunächst den Wert NULL, bis Sie explizit eine Instanz der Klasse mithilfe des Operators new erstellen oder ihr ein Objekt zuweisen, das wie im folgenden Beispiel an anderer Stelle erstellt wurde:At run time, when you declare a variable of a reference type, the variable contains the value null until you explicitly create an instance of the class by using the new operator, or assign it an object that has been created elsewhere, as shown in the following example:

MyClass mc = new MyClass();
MyClass mc2 = mc;

Beim Erstellen des Objekts wird der Speicher im verwalteten Heap belegt. Die Variable enthält lediglich einen Verweis auf den Speicherort des Objekts.When the object is created, the memory is allocated on the managed heap, and the variable holds only a reference to the location of the object. Für Typen im verwalteten Heap ist Mehraufwand erforderlich, wenn sie zugewiesen werden und wenn sie von der automatischen Speicherverwaltungsfunktion der CLR freigegeben werden, was als Garbage Collection bezeichnet wird.Types on the managed heap require overhead both when they are allocated and when they are reclaimed by the automatic memory management functionality of the CLR, which is known as garbage collection. Die Garbage Collection ist jedoch auch stark optimiert. In den meisten Szenarios führt sie nicht zu einem Leistungsproblem.However, garbage collection is also highly optimized, and in most scenarios, it does not create a performance issue. Weitere Informationen zur Garbage Collection finden Sie unter Automatische Speicherverwaltung und Garbage Collection.For more information about garbage collection, see Automatic memory management and garbage collection.

Deklarieren von KlassenDeclaring Classes

Klassen werden mithilfe des Schlüsselworts class deklariert, so wie im folgenden Beispiel dargestellt:Classes are declared by using the class keyword, as shown in the following example:

public class Customer
{
   // Fields, properties, methods and events go here...
}

Das class-Schlüsselwort wird der Zugriffsebene vorangestellt.The class keyword is preceded by the access level. Jeder kann Instanzen dieser Klasse erstellen, da in diesem Fall public verwendet wird.Because public is used in this case, anyone can create instances of this class. Der Name der Klasse folgt dem class-Schlüsselwort.The name of the class follows the class keyword. Der Rest der Definition ist der Text einer Klasse, in dem das Verhalten und die Daten definiert sind.The remainder of the definition is the class body, where the behavior and data are defined. Felder, Eigenschaften, Methoden und Ereignisse für eine Klasse werden zusammen als Klassenmember bezeichnet.Fields, properties, methods, and events on a class are collectively referred to as class members.

Erstellen von ObjektenCreating Objects

Obwohl sie manchmal synonym werden, sind eine Klasse und ein Objekt unterschiedliche Dinge.Although they are sometimes used interchangeably, a class and an object are different things. Eine Klasse definiert einen Typ eines Objekts, aber es ist kein Objekt selbst.A class defines a type of object, but it is not an object itself. Ein Objekt ist eine konkrete Entität, basierend auf einer Klasse, und wird manchmal als Instanz einer Klasse bezeichnet.An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

Objekte können mithilfe des Schlüsselworts new erstellt werden, gefolgt vom Namen der Klasse, auf die das Objekt basiert, z.B.:Objects can be created by using the new keyword followed by the name of the class that the object will be based on, like this:

Customer object1 = new Customer();

Wenn eine Instanz einer Klasse erstellt wird, wird ein Verweis auf das Objekt an den Programmierer übergeben.When an instance of a class is created, a reference to the object is passed back to the programmer. Im vorherigen Beispiel ist object1 ein Verweis auf ein Objekt, das auf Customer basiert.In the previous example, object1 is a reference to an object that is based on Customer. Dieser Verweis bezieht sich auf das neue Objekt, enthält jedoch nicht die Objektdaten selbst.This reference refers to the new object but does not contain the object data itself. In der Tat können Sie einen Objektverweis erstellen, ohne ein Objekt zu erstellen:In fact, you can create an object reference without creating an object at all:

Customer object2;

Es wird nicht empfohlen, einen Objektverweis wie diesen zu erstellen, der auf kein Objekt verweist. Der Versuch, auf ein Objekt über solch einen Verweis zuzugreifen, schlägt während der Laufzeit fehl.We don't recommend creating object references such as this one that don't refer to an object because trying to access an object through such a reference will fail at run time. Allerdings kann ein solcher Verweis dazu veranlasst werden, auf ein Objekt zu verweisen, indem entweder ein neues Objekt erstellt wird oder indem es einem vorhandenen Objekt zugewiesen wird, z.B.:However, such a reference can be made to refer to an object, either by creating a new object, or by assigning it to an existing object, such as this:

Customer object3 = new Customer();
Customer object4 = object3;

Dieser Code erstellt zwei Objektverweise, die beide auf dasselbe Objekt verweisen.This code creates two object references that both refer to the same object. Aus diesem Grund werden alle Änderungen am Objekt, die über object3 getätigt worden sind, bei nachfolgenden Verwendungen von object4 berücksichtigt.Therefore, any changes to the object made through object3 are reflected in subsequent uses of object4. Da auf Objekte, die auf Klassen basieren, durch Verweise zurückgegriffen werden, sind Klassen als Verweistypen bekannt.Because objects that are based on classes are referred to by reference, classes are known as reference types.

KlassenvererbungClass Inheritance

Klassen unterstützen die Vererbung vollständig. Dies ist ein wesentliches Merkmal der objektorientierten Programmierung.Classes fully support inheritance, a fundamental characteristic of object-oriented programming. Wenn Sie eine Klasse erstellen, können Sie von einer anderen Schnittstelle oder Klasse erben, die nicht als versiegelt definiert ist. Andere Klassen können von Ihrer Klasse erben und die virtuellen Methoden überschreiben.When you create a class, you can inherit from any other interface or class that is not defined as sealed, and other classes can inherit from your class and override class virtual methods.

Die Vererbung erfolgt durch Verwendung einer Ableitung, d.h., dass eine Klasse mithilfe einer Basisklasse deklariert wird, aus der Sie Daten und das Verhalten erbt.Inheritance is accomplished by using a derivation, which means a class is declared by using a base class from which it inherits data and behavior. Eine Basisklasse wird durch Anhängen eines Doppelpunkts sowie den Namen der Basisklasse angegeben, die dem abgeleiteten Klassennamen folgt, z.B.:A base class is specified by appending a colon and the name of the base class following the derived class name, like this:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

Wenn eine Klasse eine Basisklasse deklariert, erbt sie alle Member der Basisklasse mit Ausnahme der Konstruktoren.When a class declares a base class, it inherits all the members of the base class except the constructors. Weitere Informationen finden Sie unter Vererbung.For more information, see Inheritance.

Anders als in C++ kann eine Klasse in C# nur direkt von einer Basisklasse erben.Unlike C++, a class in C# can only directly inherit from one base class. Da jedoch eine Basisklasse von einer anderen Klasse erben kann, kann eine Klasse indirekt von mehreren Basisklassen erben.However, because a base class may itself inherit from another class, a class may indirectly inherit multiple base classes. Darüber hinaus kann eine Klasse mehr als eine Schnittstelle direkt implementieren.Furthermore, a class can directly implement more than one interface. Weitere Informationen finden Sie unter Schnittstellen.For more information, see Interfaces.

Eine Klasse kann als abstrakt deklariert werden.A class can be declared abstract. Eine abstrakte Klasse enthält abstrakte Methoden, die über eine Signaturdefinition, aber keine Implementierung verfügen.An abstract class contains abstract methods that have a signature definition but no implementation. Abstrakte Klassen dürfen nicht instanziiert werden.Abstract classes cannot be instantiated. Sie können nur mithilfe von abgeleiteten Klassen verwendet werden, die die abstrakten Methoden implementieren.They can only be used through derived classes that implement the abstract methods. Im Gegensatz dazu lässt eine versiegelte Klasse nicht zu, dass andere Klassen von ihr ableiten.By contrast, a sealed class does not allow other classes to derive from it. Weitere Informationen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.For more information, see Abstract and Sealed Classes and Class Members.

Klassendefinitionen können zwischen verschiedenen Quelldateien aufgeteilt werden.Class definitions can be split between different source files. Weitere Informationen finden Sie unter Partielle Klassen und Methoden.For more information, see Partial Classes and Methods.

BeispielExample

Im folgenden Beispiel wird eine öffentliche Klasse definiert, die eine automatisch implementierte Eigenschaft, eine Methode und eine spezielle Methode, einen sogenannten Konstruktor, enthält.The following example defines a public class that contains an auto-implemented property, a method, and a special method called a constructor. Weitere Informationen finden Sie in den Artikeln zu Eigenschaften, Methoden und Konstruktoren.For more information, see Properties, Methods, and Constructors topics. Die Instanzen der Klasse werden mit dem Schlüsselwort new instanziiert.The instances of the class are then instantiated with the new keyword.

using System;

public class Person
{
    // Constructor that takes no arguments:
    public Person()
    {
        Name = "unknown";
    }

    // Constructor that takes one argument:
    public Person(string name)
    {
        Name = name;
    }

    // Auto-implemented readonly property:
    public string Name { get; }

    // Method that overrides the base class (System.Object) implementation.
    public override string ToString()
    {
        return Name;
    }
}
class TestPerson
{
    static void Main()
    {
        // Call the constructor that has no parameters.
        var person1 = new Person();
        Console.WriteLine(person1.Name);

        // Call the constructor that has one parameter.
        var person2 = new Person("Sarah Jones");
        Console.WriteLine(person2.Name);
        // Get the string representation of the person2 instance.
        Console.WriteLine(person2);

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.The language specification is the definitive source for C# syntax and usage.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Objektorientierte ProgrammierungObject-Oriented Programming
PolymorphismusPolymorphism
MitgliederMembers
MethodenMethods
KonstruktorenConstructors
FinalizerFinalizers
ObjekteObjects