Klassen und Strukturen (C#-Programmierhandbuch)
Klassen und Strukturen sind zwei der grundlegenden Konstrukte des allgemeinen Typsystems in .NET Framework. Bei beiden handelt es sich um eine Datenstruktur, die einen als logische Einheit zusammengehörenden Satz von Daten und Verhalten kapselt. Die Daten und die Verhalten sind die Member der Klasse oder Struktur. Diese enthalten deren Methoden, Eigenschaften, Ereignisse usw., die weiter unten in diesem Thema aufgeführt werden.
Die Deklaration einer Klasse oder Struktur ist mit einem Entwurf vergleichbar, mit dem zur Laufzeit Instanzen oder Objekte erstellt werden. Wenn Sie eine Klasse oder eine Struktur mit dem Namen Person definieren, hat der Typ den Namen Person. Wenn Sie eine Variable p vom Typ Person deklarieren und initialisieren, wird p als Objekt oder Instanz von Person bezeichnet. Vom selben Typ Person können mehrere Instanzen erstellt werden, und jede Instanz kann über unterschiedliche Werte in ihren Eigenschaften und Feldern verfügen.
Eine Klasse ist ein Verweistyp. Wenn ein Objekt der Klasse erstellt wird, enthält die Variable, der das Objekt zugewiesen wurde, lediglich einen Verweis auf den entsprechenden Speicherort. Wenn der Objektverweis einer neuen Variablen zugewiesen wird, verweist die neue Variable auf das ursprüngliche Objekt. Über eine Variable vorgenommene Änderungen gelten auch für die andere Variable, da beide auf dieselben Daten verweisen.
Eine Struktur ist ein Werttyp. Wenn eine Struktur erstellt wird, enthält die Variable, der die Struktur zugewiesen wird, die eigentlichen Daten der Struktur. Wenn die Struktur einer neuen Variable zugewiesen wird, werden diese kopiert. Die neue Variable und die ursprüngliche Variable enthalten daher zwei separate Kopien der gleichen Daten. Änderungen an einer Kopie wirken sich nicht auf die andere Kopie aus.
Im Allgemeinen werden Klassen zum Modellieren von komplexerem Verhalten oder von Daten verwendet, die dafür vorgesehen sind, nach der Erstellung eines Klassenobjekts geändert zu werden. Strukturen sind am besten für kleine Datenstrukturen geeignet, die überwiegend Daten enthalten, deren Änderung nach der Erstellung der Struktur nicht vorgesehen ist.
Weitere Informationen finden Sie unter Klassen (C#-Programmierhandbuch), Objekte (C#-Programmierhandbuch) und Strukturen (C#-Programmierhandbuch).
Beispiel
Im folgenden Beispiel wird MyCustomClass mit drei Membern auf der obersten Ebene des ProgrammingGuide-Namespace definiert. Eine Instanz (ein Objekt) von MyCustomClass wird in der Main-Methode in der Program-Klasse erstellt. Auf die Methoden und Eigenschaften des Objekts wird mit der Punktnotation zugegriffen.
namespace ProgrammingGuide
{
// Class definition.
public class MyCustomClass
{
// Class members:
// Property.
public int Number { get; set; }
// Method.
public int Multiply(int num)
{
return num * Number;
}
// Instance Constructor.
public MyCustomClass()
{
Number = 0;
}
}
// Another class definition. This one contains
// the Main method, the entry point for the program.
class Program
{
static void Main(string[] args)
{
// Create an object of type MyCustomClass.
MyCustomClass myClass = new MyCustomClass();
// Set the value of a public property.
myClass.Number = 27;
// Call a public method.
int result = myClass.Multiply(4);
}
}
}
Kapselung
Kapselung wird gelegentlich als erster Pfeiler oder als Prinzip der objektorientierten Programmierung bezeichnet. Dem Prinzip der Kapselung zufolge kann eine Klasse oder Struktur festlegen, inwieweit Code außerhalb der Klasse oder Struktur auf deren Member zugreifen kann. Nicht für die Verwendung von außerhalb der Klasse oder Assembly vorgesehene Methoden und Variablen können versteckt werden, um die Wahrscheinlichkeit von Programmierfehlern und böswilligen Angriffen zu verringern.
Weitere Informationen über Klassen finden Sie unter Klassen (C#-Programmierhandbuch) und Objekte (C#-Programmierhandbuch).
Member
Alle Methoden, Felder, Konstanten, Eigenschaften und Ereignisse müssen innerhalb eines Typs deklariert werden. Diese Elemente werden als Member des Typs bezeichnet. In C# gibt es im Gegensatz zu einigen anderen Sprachen keine globalen Variablen oder Methoden. Selbst der Einstiegspunkt eines Programms, die Main-Methode, muss innerhalb einer Klasse oder einer Struktur deklariert werden. In der folgenden Liste werden sämtliche Arten von Membern aufgeführt, die in einer Klasse bzw. einer Struktur deklariert werden können.
Zugriff
Einige Methoden und Eigenschaften sind für den Aufruf oder Zugriff von als Clientcode bezeichneten Code außerhalb der Klasse oder Struktur vorgesehen. Andere Methoden und Eigenschaften dienen nur der Verwendung in der Klasse oder Struktur selbst. Es ist wichtig, den Zugriff auf den Code einzuschränken, damit nur der Clientcode darauf zugreifen kann, der dafür vorgesehen ist. Inwieweit Clientcode auf die Typen und deren Member zugreifen kann, können Sie mit den Zugriffsmodifizierern public, protected, internal, protected internal und private festlegen. Die Standardeinstellung für den Zugriff lautet private. Weitere Informationen finden Sie unter Zugriffsmodifizierer (C#-Programmierhandbuch).
Vererbung
Klassen (jedoch nicht Strukturen) unterstützen das Konzept der Vererbung. Eine Klasse, die von einer anderen Klasse (der Basisklasse) abgeleitet ist, enthält automatisch alle öffentlichen, geschützten und internen Member der Basisklasse mit Ausnahme der Konstruktoren und Destruktoren. Weitere Informationen finden Sie unter Vererbung (C#-Programmierhandbuch) und Polymorphismus (C#-Programmierhandbuch).
Klassen können als abstrakt deklariert werden. Das bedeutet, dass mindestens eine ihrer Methoden nicht implementiert ist. Obwohl abstrakte Klassen nicht direkt instanziiert werden können, können Sie als Basisklassen für andere Klassen dienen, von denen die fehlende Implementierung bereitgestellt wird. Klassen können auch als versiegelt deklariert werden, um zu verhindern, dass andere Klassen von ihnen erben. Weitere Informationen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch).
Schnittstellen
Klassen und Strukturen können von mehreren Schnittstellen erben. Von einer Schnittstelle erben bedeutet, dass der Typ alle in der Schnittstelle definierten Methoden implementiert. Weitere Informationen finden Sie unter Schnittstellen (C#-Programmierhandbuch).
Generische Typen
Klassen und Strukturen können mit einem oder mehreren Typparametern definiert werden. Der Typ wird beim Erstellen einer Instanz des Typs vom Clientcode bereitgestellt. Beispielsweise ist die List-Klasse im System.Collections.Generic-Namespace mit einem Typparameter definiert. Vom Clientcode wird eine Instanz von List<string> oder List<int> erstellt, um den Typ anzugeben, den die Liste enthalten soll. Weitere Informationen finden Sie unter Generika (C#-Programmierhandbuch).
Statische Typen
Klassen (nicht jedoch Strukturen) können als statisch deklariert werden. Eine statische Klasse kann nur statische Member enthalten und nicht mit dem Schlüsselwort "new" instanziiert werden. Beim Laden des Programms wird eine Kopie der Klasse in den Speicher geladen. Auf deren Member wird über den Klassennamen zugegriffen. Sowohl Klassen als auch Strukturen können statische Member enthalten. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember (C#-Programmierhandbuch).
Geschachtelte Typen
Eine Klasse oder Struktur kann innerhalb einer anderen Klasse oder Struktur geschachtelt werden. Weitere Informationen finden Sie unter Geschachtelte Typen.
Partielle Typen
Sie können einen Teil einer Klasse, Struktur oder Methode in einer Codedatei und einen anderen Teil in einer separaten Codedatei definieren. Weitere Informationen finden Sie unter Partielle Klassen und Methoden.
Objektinitialisierer
Klassen- oder Strukturobjekte sowie Auflistungen von Objekten können instanziiert und initialisiert werden, ohne deren Konstruktor explizit aufzurufen. Weitere Informationen finden Sie unter Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch).
Anonyme Typen
Anonyme Typen werden in Fällen verwendet, in denen benannte Klassen nicht ohne Weiteres erstellt werden können bzw. nicht benötigt werden, beispielsweise beim Füllen einer Liste mit Datenstrukturen, die nicht erhalten bleiben oder an andere Methoden übergeben werden müssen. Weitere Informationen finden Sie unter Anonyme Typen (C#-Programmierhandbuch).
Erweiterungsmethoden
Sie können Klassen "erweitern", ohne eine abgeleitete Klasse zu erstellen, indem Sie einen separaten Typ erstellen, dessen Methoden aufgerufen werden können, als würden sie zum ursprünglichen Typ gehören. Weitere Informationen finden Sie unter Erweiterungsmethoden (C#-Programmierhandbuch).
Implizit typisierte lokale Variablen
Innerhalb einer Klassen- oder Strukturmethode können Sie implizite Typisierung verwenden, um den Compiler anzuweisen, bei der Kompilierung den richtigen Typ zu bestimmen. Weitere Informationen finden Sie unter Implizit typisierte lokale Variablen (C#-Programmierhandbuch).
C#-Programmiersprachenspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.