Einführung in Klassen

Verweistypen

Ein Typ, der als definiert ist, class ist ein class. Wenn Sie zur Laufzeit eine Variable eines Verweistyps deklarieren, enthält die Variable den Wert, nullnew bis Sie explizit eine Instanz der -Klasse mithilfe des -Operators erstellen oder ihr ein Objekt eines kompatiblen Typs zuweisen, der möglicherweise an anderer Stelle erstellt wurde, wie im folgenden Beispiel gezeigt:

//Declaring an object of type MyClass.
MyClass mc = new MyClass();

//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;

Beim Erstellen des Objekts wird im verwalteten Heap für dieses bestimmte Objekt ausreichend Speicherplatz zugewiesen. Die Variable enthält lediglich einen Verweis auf den Speicherort dieses Objekts. 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. Die Garbage Collection ist jedoch auch stark optimiert. In den meisten Szenarios führt sie nicht zu einem Leistungsproblem. Weitere Informationen zur Garbage Collection finden Sie unter Automatische Speicherverwaltung und Garbage Collection.

Deklarieren von Klassen

Klassen werden mithilfe des Schlüsselworts class gefolgt von einem eindeutigen Bezeichner deklariert, wie im folgenden Beispiel gezeigt:

//[access modifier] - [class] - [identifier]
public class Customer
{
   // Fields, properties, methods and events go here...
}

Das class-Schlüsselwort wird der Zugriffsebene vorangestellt. Da public in diesem Fall verwendet wird, kann jeder Instanzen dieser Klasse erstellen. Der Name der Klasse folgt dem class-Schlüsselwort. Der Name der Klasse muss ein gültiger C#-Bezeichnername sein. Der Rest der Definition ist der Text einer Klasse, in dem das Verhalten und die Daten definiert sind. Felder, Eigenschaften, Methoden und Ereignisse für eine Klasse werden zusammen als Klassenmember bezeichnet.

Erstellen von Objekten

Obwohl sie manchmal synonym werden, sind eine Klasse und ein Objekt unterschiedliche Dinge. Eine Klasse definiert einen Typ eines Objekts, aber es ist kein Objekt selbst. Ein Objekt ist eine konkrete Entität, basierend auf einer Klasse, und wird manchmal als Instanz einer Klasse bezeichnet.

Objekte können wie folgt mithilfe des Schlüsselworts new gefolgt vom Namen der Klasse erstellt werden, auf der das Objekt basiert:

Customer object1 = new Customer();

Wenn eine Instanz einer Klasse erstellt wird, wird ein Verweis auf das Objekt an den Programmierer übergeben. Im vorherigen Beispiel ist object1 ein Verweis auf ein Objekt, das auf Customer basiert. Dieser Verweis bezieht sich auf das neue Objekt, enthält jedoch nicht die Objektdaten selbst. In der Tat können Sie einen Objektverweis erstellen, ohne ein Objekt zu erstellen:

 Customer object2;

Es wird nicht empfohlen, Objektverweise wie den vorherigen zu erstellen, die nicht auf ein Objekt verweisen, da der Versuch, über einen solchen Verweis auf ein Objekt zu zugreifen, zur Laufzeit fehlschlägt. 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.:

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

Dieser Code erstellt zwei Objektverweise, die beide auf dasselbe Objekt verweisen. Aus diesem Grund werden alle Änderungen am Objekt, die über object3 getätigt worden sind, bei nachfolgenden Verwendungen von object4 berücksichtigt. Da auf Objekte, die auf Klassen basieren, durch Verweise zurückgegriffen werden, sind Klassen als Verweistypen bekannt.

Klassenvererbung

Klassen unterstützen die Vererbung vollständig. Dies ist ein wesentliches Merkmal der objektorientierten Programmierung. Wenn Sie eine Klasse erstellen, können Sie von jeder anderen Klasse erben, sealeddie nicht als definiert ist, und andere Klassen können von Ihrer Klasse erben und virtuelle Klassenmethoden überschreiben. Außerdem kann eine Struktur eine oder mehrere Schnittstellen implementieren.

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. Eine Basisklasse wird durch Anhängen eines Doppelpunkts sowie den Namen der Basisklasse angegeben, die dem abgeleiteten Klassennamen folgt, z.B.:

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. Weitere Informationen finden Sie unter Vererbung.

Eine Klasse in C# kann nur direkt von einer Basisklasse erben. Da jedoch eine Basisklasse von einer anderen Klasse erben kann, kann eine Klasse indirekt von mehreren Basisklassen erben. Darüber hinaus kann eine Klasse mehr als eine Schnittstelle direkt implementieren. Weitere Informationen finden Sie unter Schnittstellen.

Eine Klasse kann als deklariert werden abstract. Eine abstrakte Klasse enthält abstrakte Methoden, die über eine Signaturdefinition, aber keine Implementierung verfügen. Abstrakte Klassen dürfen nicht instanziiert werden. Sie können nur mithilfe von abgeleiteten Klassen verwendet werden, die die abstrakten Methoden implementieren. Im Gegensatz dazu lässt eine versiegelte Klasse nicht zu, dass andere Klassen von ihr ableiten. Weitere Informationen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.

Klassendefinitionen können zwischen verschiedenen Quelldateien aufgeteilt werden. Weitere Informationen finden Sie unter Partielle Klassen und Methoden.

Beispiel

Im folgenden Beispiel wird eine öffentliche Klasse definiert, die eine automatisch implementierte Eigenschaft, eine Methode und eine spezielle Methode, einen sogenannten Konstruktor, enthält. Weitere Informationen finden Sie in den Artikeln Eigenschaften, Methoden und Konstruktoren . Die Instanzen der Klasse werden mit dem Schlüsselwort new instanziiert.

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);
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

C#-Programmiersprachenspezifikation

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