StrukturenStructs

Wie Klassen sind Strukturen Datenstrukturen, die Datenmember und Funktionsmember enthalten können, aber im Gegensatz zu Klassen sind Strukturen Werttypen und erfordern keine Heapzuordnung.Like classes, structs are data structures that can contain data members and function members, but unlike classes, structs are value types and do not require heap allocation. Eine Variable eines Strukturtyps speichert die Daten der Struktur direkt, während eine Variable eines Klassentyps einen Verweis auf ein dynamisch zugeordnetes Objekt speichert.A variable of a struct type directly stores the data of the struct, whereas a variable of a class type stores a reference to a dynamically allocated object. Strukturtypen unterstützen keine benutzerdefinierte Vererbung, und alle Strukturtypen erben implizit vom Typ ValueType, der wiederum implizit von object erbt.Struct types do not support user-specified inheritance, and all struct types implicitly inherit from type ValueType, which in turn implicitly inherits from object.

Strukturen sind besonders nützlich für kleine Datenstrukturen, die über Wertsemantik verfügen.Structs are particularly useful for small data structures that have value semantics. Komplexe Zahlen, Punkte in einem Koordinatensystem oder Schlüssel-Wert-Paare im Wörterbuch sind gute Beispiele für Strukturen.Complex numbers, points in a coordinate system, or key-value pairs in a dictionary are all good examples of structs. Die Verwendung von Strukturen statt Klassen für kleine Datenstrukturen kann bei der Anzahl der Speicherbelegungen, die eine Anwendung durchführt, einen großen Unterschied ausmachen.The use of structs rather than classes for small data structures can make a large difference in the number of memory allocations an application performs. Das folgende Programm erstellt und initialisiert z.B. ein Array aus 100 Punkten.For example, the following program creates and initializes an array of 100 points. Mit Point als implementierter Klasse werden 101 separate Objekte instanziiert – eines für das Array und jeweils eines für jedes der 100 Elemente.With Point implemented as a class, 101 separate objects are instantiated—one for the array and one each for the 100 elements.

public class PointExample
{
    public static void Main() 
    {
        Point[] points = new Point[100];
        for (int i = 0; i < 100; i++)
            points[i] = new Point(i, i);
    }
}

Eine Alternative ist, „Point“ zu einer Struktur zu machen.An alternative is to make Point a struct.

struct Point
{
    public int x, y;
    public Point(int x, int y) 
    {
        this.x = x;
        this.y = y;
    }
}

Jetzt wird nur ein Objekt instanziiert – für das Array – und die Point-Instanzen werden inline im Array gespeichert.Now, only one object is instantiated—the one for the array—and the Point instances are stored in-line in the array.

Strukturkonstruktoren werden mit dem neuen Operator aufgerufen, doch das bedeutet nicht, dass der Arbeitsspeicher belegt wird.Struct constructors are invoked with the new operator, but that does not imply that memory is being allocated. Statt ein Objekt dynamisch zuzuordnen und einen Verweis darauf zurückzugeben, gibt ein Strukturkonstruktor einfach den Strukturwert selbst zurück (in der Regel in einen temporären Speicherort auf dem Stapel), und dieser Wert wird dann nach Bedarf kopiert.Instead of dynamically allocating an object and returning a reference to it, a struct constructor simply returns the struct value itself (typically in a temporary location on the stack), and this value is then copied as necessary.

Mit Klassen können zwei Variablen auf das gleiche Objekt verweisen, und so können an einer Variablen durchgeführte Vorgänge das Objekt beeinflussen, auf das die andere Variable verweist.With classes, it is possible for two variables to reference the same object and thus possible for operations on one variable to affect the object referenced by the other variable. Mit Strukturen besitzt jede Variable eine eigene Kopie der Daten, und es ist nicht möglich, dass an einer Variablen durchgeführte Vorgänge die andere beeinflussen.With structs, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other. Welche Ausgabe das folgende Codefragment erzeugt, hängt beispielsweise davon ab, ob „Point“ eine Klasse oder eine Struktur ist.For example, the output produced by the following code fragment depends on whether Point is a class or a struct.

Point a = new Point(10, 10);
Point b = a;
a.x = 20;
Console.WriteLine(b.x);

Wenn Point eine Klasse ist, ist die Ausgabe 20, da „a“ und „b“ auf das gleiche Objekt verweisen.If Point is a class, the output is 20 because a and b reference the same object. Wenn „Point“ eine Struktur ist, ist die Ausgabe 10, da die Zuweisung von a zu b eine Kopie des Werts erstellt, und diese Kopie ist nicht von der nachfolgenden Zuweisung zu a.x betroffen.If Point is a struct, the output is 10 because the assignment of a to b creates a copy of the value, and this copy is unaffected by the subsequent assignment to a.x.

Im vorherigen Beispiel werden zwei der Einschränkungen von Strukturen hervorgehoben.The previous example highlights two of the limitations of structs. Erstens ist das Kopieren einer gesamten Struktur in der Regel weniger effizient als das Kopieren eines Objektverweises, sodass Zuweisung und Wertparameterübergabe mit Strukturen aufwändiger sein kann als mit Verweistypen.First, copying an entire struct is typically less efficient than copying an object reference, so assignment and value parameter passing can be more expensive with structs than with reference types. Zweitens ist es mit Ausnahme der ref- und out-Parameter nicht möglich, Verweise auf Strukturen zu erstellen, was ihre Verwendung in einer Reihe von Situationen ausschließt.Second, except for ref and out parameters, it is not possible to create references to structs, which rules out their usage in a number of situations.