This article has been localized into German by the community.
Strukturen (struct)
Die C#-Struktur ist eine leichtgewichtige Alternative zu einer Klasse. Es kann fast das gleiche wie eine Klasse tun, aber es ist weniger "teuer", eine Struktur statt einer Klasse zu verwenden. Der Grund dafür ist etwas technisch, aber zusammenfassend gesagt, werden neue Instanzen einer Klasse auf den Heap gelegt, während hingegen neu instanziierte Strukturen auf den Stapel gelegt werden. Außerdem haben Sie es nicht mit Referenzen auf Strukturen zu tun, wie bei Klassen, sondern arbeiten direkt mit der struct-Instanz. Das bedeutet auch: Wenn Sie eine Struktur an eine Methode übergeben, wird sie als Kopie und nicht als Referenz übergeben. Mehr dazu erfahren Sie im Kapitel über Funktionsparameter.
Sie sollten also Strukturen verwenden, wenn Sie einfachere Datenstrukturen darstellen wollen, und vor allem, wenn Sie wissen, dass Sie viele davon instanziieren werden. Es gibt viele Beispiele im.NET-Framework, wo Microsoft Strukturen anstelle von Klassen verwendet hat, z.B. die Point-, Rectangle- and Color-Struktur.
Zuerst möchte ich Ihnen ein Beispiel für die Verwendung einer Struktur zeigen, und dann werden wir einige ihrer Einschränkungen bei der Verwendung im Vergleich zu Klassen diskutieren:
class Program
{
static void Main(string[] args)
{
Car car;
car = new Car("Blue");
Console.WriteLine(car.Describe());
car = new Car("Red");
Console.WriteLine(car.Describe());
Console.ReadKey();
}
}
struct Car
{
private string color;
public Car(string color)
{
this.color = color;
}
public string Describe()
{
return "This car is " + Color;
}
public string Color
{
get { return color; }
set { color = value; }
}
}
Der aufmerksame Leser wird feststellen, dass dies genau derselbe Beispielcode ist, der in der Einführung zu Klassen verwendet wird, abgesehen vom Wechsel von einer Klasse zu einer Struktur. Dies zeigt, wie ähnlich die beiden Konzepte sind. Aber wie unterscheiden sie sich, neben den technischen Details, die am Anfang dieses Kapitels erwähnt werden?
Zuerst einmal dürfen Felder keine Initialisierer haben, was bedeutet, dass man ein Mitglied nicht so deklarieren kann:
private string color = "Blue";
Wenn Sie einen Konstruktor deklarieren, müssen alle Felder zugeordnet werden, bevor Sie den Konstruktor verlassen. Eine Struktur hat zwar einen Standardkonstruktor, aber sobald Sie sich dafür entscheiden, einen eigenen zu definieren, müssen sie auch alle Felder initialisieren. Hinzu kommt, dass man keinen eigenen parameterlosen Konstruktor deklarieren kann - alle Struktur-Konstruktoren müssen mindestens einen Parameter haben. In unserem obigen Beispiel haben wir dem Farbfeld tatsächlich einen Wert zugewiesen. Wenn wir das nicht getan hätten, würde sich der Compiler beschweren.
Eine Struktur kann nicht von anderen Klassen oder Strukturen erben, und Klassen können nicht von Strukturen erben. Eine Struktur erbt von der Objektklasse, aber das war's dann auch für Vererbung bei Strukturen. Strukturen unterstützen jedoch Schnittstellen, was bedeutet, dass Ihre Strukturen benutzerdefinierte Schnittstellen implementieren können.