Übersicht über Klassen, Strukturen und Datensätze in C#
In C# ist die Definition eines Typs – Klasse, Struktur oder Datensatz – mit einer Blaupause vergleichbar, die angibt, was der Typ tun kann. Ein Objekt ist im Grunde ein Speicherblock, der nach Plan zugewiesen und konfiguriert wurde. Dieser Artikel bietet eine Übersicht über diese Blaupausen und deren Features. Im nächsten Artikel dieser Reihe werden Objekte vorgestellt.
Kapselung
Kapselung wird gelegentlich als erster Pfeiler oder als Prinzip der objektorientierten Programmierung bezeichnet. Eine Klasse oder Struktur kann 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 ausgeblendet werden, um die Wahrscheinlichkeit von Programmierfehlern und böswilligen Angriffen zu verringern. Weitere Informationen finden Sie im Tutorial zur objektorientierten Programmierung.
Member
Die Member eines Typs umfassen alle Methoden, Felder, Konstanten, Eigenschaften und Ereignisse. 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 Struktur deklariert werden (implizit im Fall von Anweisungen der obersten Ebene).
In der folgenden Liste werden sämtliche Arten von Membern aufgeführt, die in einer Klasse, Struktur oder einem Datensatz deklariert werden können.
- Felder
- Konstanten
- Eigenschaften
- Methoden
- Konstruktoren
- Ereignisse
- Finalizer
- Indexer
- Operatoren
- Geschachtelte Typen
Weitere Informationen finden Sie unter Member.
Zugriff
Einige Methoden und Eigenschaften sind für den Aufruf oder Zugriff von als Clientcode bezeichnetem Code außerhalb einer 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 folgenden Zugriffsmodifizierern festlegen:
Die Standardeinstellung für den Zugriff lautet private
.
Vererbung
Klassen (jedoch nicht Strukturen) unterstützen das Konzept der Vererbung. Eine Klasse, die von einer anderen Klasse, der sogenannten Basisklasse, abgeleitet ist, enthält automatisch alle öffentlichen, geschützten und internen Member der Basisklasse mit Ausnahme der Konstruktoren und Finalizer.
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 Vererbung und Polymorphie.
Schnittstellen
Klassen, Strukturen und Datensätze können mehrere Schnittstellen implementieren. Schnittstellen implementieren bedeutet, dass der Typ alle in der Schnittstelle definierten Methoden implementiert. Weitere Informationen finden Sie unter Schnittstellen.
Generische Typen
Klassen, Strukturen und Datensätze können mit einem oder mehreren Typparametern definiert werden. Der Typ wird beim Erstellen einer Instanz des Typs vom Clientcode bereitgestellt. Beispielsweise ist die Klasse List<T> im Namespace System.Collections.Generic 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 Generics.
Statische Typen
Klassen (nicht jedoch Strukturen oder Datensätze) können als static
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. Klassen, Strukturen und Datensätze können statische Member enthalten. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.
Geschachtelte Typen
Eine Klasse, Struktur oder ein Datensatz kann innerhalb einer anderen Klasse, Struktur oder eines Datensatzes 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
Sie können Klassen- oder Strukturobjekte sowie Auflistungen von Objekten instanziieren und initialisieren, indem Sie ihren Eigenschaften Werte zuweisen. Weitere Informationen finden Sie unter Initialisieren von Objekten mit einem Objektinitialisierer.
Anonyme Typen
In Situationen, in denen es unkomfortabel oder nicht erforderlich ist, eine benannte Klasse zu erstellen, verwenden Sie anonyme Typen. Anonyme Typen werden durch ihre benannten Datenmember definiert. Weitere Informationen finden Sie unter Anonyme Klassentypen.
Erweiterungsmethoden
Sie können eine Klasse „erweitern“, ohne eine abgeleitete Klasse zu erstellen, indem Sie einen separaten Typ erstellen. Dieser Typ enthält Methoden, die aufgerufen werden können, als ob sie zum ursprünglichen Typ gehörten. Weitere Informationen finden Sie unter Erweiterungsmethoden.
Implizit typisierte lokale Variablen
Innerhalb einer Klassen- oder Strukturmethode können Sie implizite Typisierung verwenden, um den Compiler anzuweisen, den Typ einer Variablen während der Kompilierung zu bestimmen. Weitere Informationen finden Sie unter var (C#-Referenz).
Datensätze
C# 9 führt den record
-Typ ein. Dies ist ein Verweistyp, den Sie anstelle einer Klasse oder einer Struktur erstellen können. Datensätze sind Klassen mit dem integrierten Verhalten zum Kapseln von Daten in unveränderlichen Typen. Mit C# 10 wird der Werttyp record struct
eingeführt. Ein Datensatz (entweder record class
oder record struct
) bietet die folgenden Features:
- Präzise Syntax zum Erstellen eines Verweistyps mit unveränderlichen Eigenschaften
- Wertgleichheit: Zwei Variablen eines Datensatztyps sind gleich, wenn sie den gleichen Typ aufweisen, und wenn für jedes Feld die Werte in beiden Datensätzen gleich sind. Klassen nutzen Verweisgleichheit, also dass zwei Variablen eines Klassentyps gleich sind, wenn sie auf dasselbe Objekt verweisen.
- Präzise Syntax für die nicht destruktive Mutation:
Sie können mit einem
with
-Ausdruck eine neue Datensatzinstanz erstellen, die eine Kopie einer vorhandenen Instanz ist, bei der jedoch die angegebenen Eigenschaftswerte geändert wurden. - Integrierte Formatierung für die Anzeige:
Die
ToString
-Methode gibt den Namen des Datensatztyps sowie die Namen und Werte öffentlicher Eigenschaften aus. - Unterstützung für Vererbungshierarchien in Datensatzklassen. Datensatzklassen unterstützen Vererbung. Datensatzstrukturen unterstützen keine Vererbung.
Weitere Informationen finden Sie unter Datensätze.
C#-Programmiersprachenspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.