Klassen (Visual C# Express)

Aktualisiert: November 2007

C# ist eine objektorientierte Programmiersprache. Mit anderen modernen Sprachen teilt sie den Ansatz, verwandte Felder, Methoden, Eigenschaften und Ereignisse in als Klassen bezeichneten Datenstrukturen zu gruppieren.

Schnittstellen und Objekte im Vergleich

Eine Klasse ist im Grunde ein Entwurf für einen benutzerdefinierten Datentyp. Sobald Sie eine Klasse definiert haben, können Sie sie verwenden, indem Sie sie in den Arbeitsspeicher laden. Eine in den Arbeitsspeicher geladene Klasse wird als Objekt oder Instanz bezeichnet. Eine Instanz einer Klasse wird mit dem C#-Schlüsselwort new erstellt.

Es folgt ein Beispiel für eine Klassendefinition mit dem Namen SampleClass und für die Erstellung eines Objekts mit dem Namen sampleClass1, das eine Instanz dieser Klasse ist. Da die Main-Funktion in C# innerhalb einer Klasse definiert werden muss, wird im folgenden Code auch eine Program-Klasse definiert, die jedoch nicht zum Erstellen eines Objekts verwendet wird.

using System;

class SampleClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello, World!");
    }
}

class Program
{
    //Main is the entrypoint, where every C# program starts
    static void Main(string[] args)
    {
        SampleClass sampleClass1 = new SampleClass();  // Create an object
        sampleClass1.SayHello();                       // Call a method
    }
}

Genauso wie Sie eine beliebige Anzahl von Häusern auf der Grundlage desselben Entwurfs errichten können, können Sie auch eine beliebige Anzahl von Objekten derselben Klasse instanziieren. Arrays bzw. Listen enthalten sehr häufig eine Vielzahl von Objekten derselben Klasse. Jede Instanz der Klasse belegt einen separaten Speicherbereich, und die Werte der Felder (mit Ausnahme der nachfolgend erörterten statischen Felder) sind separat und voneinander unabhängig. Im nachfolgenden Codebeispiel können Sie zwei Objekte des Animal-Typs erstellen und deren Größe auf 2 bzw. auf 3 festlegen. Es gibt allerdings eine wichtige Ausnahme von dieser Regel: die statischen Member.

Statische Member und Instanzmember im Vergleich

Ein statischer Member ist eine Methode oder ein Feld, auf die bzw. das ohne Verweis auf eine bestimmte Instanz einer Klasse zugegriffen werden kann. Die häufigste statische Methode ist Main, der Einstiegspunkt für alle C#-Programme. Um die Main-Methode aufzurufen, brauchen Sie keine Instanz der Klasse zu erstellen, in der die Methode enthalten ist. Eine andere häufig verwendete statische Methode ist WriteLine in der Console-Klasse. Beachten Sie den Unterschied in der Syntax für den Zugriff auf statische Methoden: Links vom Punktoperator verwenden Sie anstelle des Instanznamens den Klassennamen: Console.WriteLine.

Wenn Sie ein Klassenfeld als statisch deklarieren, nutzen alle Instanzen dieser Klasse dieses Feld gemeinsam. Angenommen, size ist im folgenden Codebeispiel als statisch deklariert, und es wird der Wert eines Animal-Objekts geändert. Dann wird dieser Wert für alle Objekte des Animal-Typs geändert.

Eine statische Klasse ist eine Klasse, die nur statische Member enthält. Statische Klassen, Methoden und Felder sind in bestimmten Szenarios aus Gründen der Leistung und Effizienz nützlich. Wenn Sie allerdings annehmen, dass ein Feld ein Instanzfeld ist, während es eigentlich statisch ist, können schwer erkennbare Fehler auftreten. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember (C#-Programmierhandbuch).

Klassen und Dateien im Vergleich

Jedes C#-Programm verfügt über mindestens eine Klasse. Es wird empfohlen, beim Entwerfen eines Programms in jeder Quellcodedatei (CS-Datei) nur eine Klasse zu verwenden. Dies ist allerdings nicht unbedingt erforderlich. Wenn Sie in C# mithilfe der integrierten Entwicklungsumgebung (IDE, Integrated Development Environment) Klassen erstellen, wird gleichzeitig von der IDE automatisch eine neue Quellcodedatei erstellt.

Kapselung

Eine Klasse stellt in der Regel die Merkmale eines Gegenstands und die für diesen ausführbaren Aktionen dar. Um beispielsweise ein Tier als C#-Klasse darzustellen, können Sie ihm eine Größe, Geschwindigkeit und Stärke zuordnen, die als Zahlenwerte angegeben werden, sowie einige Funktionen wie MoveLeft(), MoveRight(), SpeedUp(), Stop() usw. definieren, in denen Sie den Code schreiben, mit dem Ihr "Tier" die betreffenden Aktionen ausführen kann. In C# sieht die Tierklasse wie folgt aus:

    public class Animal
    {
        private int size;
        private float speed;
        private int strength;

        public void MoveLeft()  // method
        {
            // code goes here...
        }

        // other methods go here...
    }

Wenn Sie .NET Framework Class Library durchsuchen, werden Sie feststellen, dass jede Klasse einen Gegenstand darstellt, z .B. ein XmlDocument, einen String, eine Form, und dass jeder Gegenstand über verschiedene Aktionen (Methoden) verfügt, die ausgeführt werden können, sowie über Merkmale (Eigenschaften), die gelesen oder gegebenenfalls geändert werden können, und über Benachrichtigungen (Ereignisse), die gesendet werden, wenn eine bestimmte Aktion ausgeführt wird. Die Methoden, Eigenschaften und Ereignisse werden zusammen mit allen anderen internen Variablen und Konstanten (Feldern) als Member der Klasse bezeichnet.

Das Gruppieren von Membern in Klassen ist nicht nur logisch, sondern ermöglicht es Ihnen auch, Daten und Funktionen auszublenden, auf die anderer Code keinen Zugriff erhalten soll. Dieses Prinzip wird als Kapselung bezeichnet. Wenn Sie die .NET Framework-Klassenbibliotheken durchsuchen, sind nur die öffentlichen Member der Klassen sichtbar. Darüber hinaus enthält jede Klasse vermutlich private Member, die von dieser Klasse oder mit ihr verknüpften Klassen intern verwendet werden, aber nicht zur Verwendung durch Anwendungen vorgesehen sind. Wenn Sie eigene Klassen erstellen, müssen Sie festlegen, welche Member öffentlich und welche Member privat sein sollen.

Vererbung

Eine Klasse kann eine andere Klasse erben, was bedeutet, dass sie neben den von ihr definierten Membern alle (öffentlichen und privaten) Member der ursprünglichen Klasse enthält. Die ursprüngliche Klasse wird die Basisklasse genannt, und die neue Klasse wird als abgeleitete Klasse bezeichnet. Eine abgeleitete Klasse wird erstellt, um eine spezialisiertere Variante der Basisklasse darzustellen. Beispielsweise können Sie eine Cat-Klasse definieren, die von Animal erbt. Cat kann alle Aktionen ausführen, die von Animal ausgeführt werden können, und darüber hinaus kann die Klasse eine weitere, nur auf sie zutreffende Aktion ausführen. Der C#-Code sieht wie folgt aus:

    public class Cat : Animal
    {
        public void Purr()
        {
        }
    }

Die Cat : Animal-Notation gibt an, dass Cat von Animal erbt und dass daher Cat auch über die MoveLeft-Methode sowie die drei privaten Variablen size, speed und strength verfügt. Wenn Sie eine SiameseCat-Klasse definieren, die von Cat erbt, verfügt diese über alle Member von Cat und alle Member von Animal.

Polymorphismus

Im Rahmen der Computerprogrammierung bezieht sich Polymorphismus auf die Möglichkeit einer abgeleiteten Klasse, von einer Basisklasse geerbte Methoden neu zu definieren oder zu überschreiben. Sie nutzen diese Möglichkeit, wenn Sie innerhalb einer Methode eine ganz bestimmte Aktion ausführen möchten, die entweder von der Basisklasse abweicht oder in dieser nicht definiert ist. Da die Animal.MoveLeft-Methode auf alle Tiere zutreffen muss, ist sie vermutlich sehr allgemein und einfach und lautet etwa so: "Drehung des Kopfs ändern, sodass dieser nun in Richtung X weist". Möglicherweise reicht diese Beschreibung in der Cat-Klasse nicht aus. Sie möchten vielleicht angeben, wie die Katze (Cat) die Pfoten und den Schwanz bewegt, während sie sich dreht. Und wenn Sie eine Fish-Klasse oder eine Bird-Klasse definiert haben, möchten Sie die MoveLeft-Methode möglicherweise auch für diese Klassen auf jeweils andere Weise überschreiben. Da Sie das Verhalten der MoveLeft-Methode für jede einzelne Klasse anpassen können, besitzt der Code, der die Klasse erstellt und deren Methoden aufruft, keine separate Methode für jedes Tier. Solange das Objekt von Amimal erbt, wird beim Aufruf der MoveLeft-Methode die spezifische Version der Methode für das Objekt aufgerufen.

Konstruktoren

Jede Klasse besitzt einen Konstruktor, d. h. eine Methode mit dem gleichen Namen wie die Klasse. Der Konstruktor wird aufgerufen, wenn ein Objekt auf der Grundlage der Klassendefinition erstellt wird. Konstruktoren legen in der Regel die Anfangswerte von in der Klasse definierten Variablen fest. Dies ist nicht erforderlich, wenn die Anfangswerte für numerische Datentypen 0 (null), für boolesche Typen false bzw. für Referenztypen null sein sollen, da diese Datentypen automatisch initialisiert werden.

Sie können Konstruktoren mit einer beliebigen Anzahl von Parametern definieren. Konstruktoren ohne Parameter werden als Standardkonstruktoren bezeichnet. Im folgenden Beispiel wird eine Klasse mit einem Standardkonstruktor sowie einem Konstruktor definiert, der eine Zeichenfolge annimmt, und dann werden beide verwendet:

class SampleClass
{
    string greeting;

    public SampleClass()
    {
        greeting = "Hello, World";
    }

    public SampleClass(string message)
    {
        greeting = message;
    }

    public void SayHello()
    {
        System.Console.WriteLine(greeting);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Use default constructor.
        SampleClass sampleClass1 = new SampleClass();
        sampleClass1.SayHello();

        // Use constructor that takes a string parameter.
        SampleClass sampleClass2 = new SampleClass("Hello, Mars");
        sampleClass2.SayHello();
    }
}

Überladen von Operatoren

Das Erstellen von verschiedenen Methoden mit demselben Namen (wie SampleClass() im vorigen Beispiel) wird als Überladen bezeichnet. Der Compiler weiß, welche Methode verwendet werden soll, da bei jeder Erstellung eines Objekts die Liste der Argumente (falls vorhanden) bereitgestellt wird. Mit Überladungen können Sie Code flexibler und besser lesbar gestalten.

Destruktoren

Wenn Sie mit C++ gearbeitet haben, kennen Sie Destruktoren vielleicht schon. Aufgrund des automatischen Garbage Collection-Systems in C# ist es recht unwahrscheinlich, dass Sie jemals einen Destruktor implementieren müssen, es sei denn, Sie verwenden in einer Klasse nicht verwaltete Ressourcen. Weitere Informationen finden Sie unter Destruktoren (C#-Programmierhandbuch).

Strukturen

Eine Struktur ist ein Typ, der in vielerlei Hinsicht einer Klasse ähnelt, allerdings keine Vererbung unterstützt. Weitere Informationen finden Sie unter Strukturen (Visual C# Express).

Siehe auch

Aufgaben

Gewusst wie: Aufrufen einer Methode für ein Objekt (Visual C#)

Gewusst wie: Erben von einer Klasse (Visual C#)

Konzepte

Einführung in C#

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

class (C#-Referenz)

struct (C#-Referenz)