Verwenden von Strukturen (C#-Programmierhandbuch)

Der struct-Typ eignet sich für die Darstellung von kompakten Objekten, z. B. Point, Rectangle und Color.Obwohl es ebenso einfach ist, einen Punkt als -Klasse mit automatisch implementierten Eigenschaften darzustellen, kann eine Struktur in verschiedenen Szenarien effizienter sein.Bei der Deklaration eines Arrays mit 1.000 Point-Objekten belegen Sie z. B. zusätzlichen Arbeitsspeicher, damit auf jedes Objekt verwiesen werden kann. In diesem Fall wäre eine Struktur weniger speicherintensiv.Da .NET Framework ein Objekt mit dem Namen Point enthält, wird die Struktur in diesem Beispiel stattdessen "CoOrds" genannt.

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Die Definition eines (parameterlosen) Standardkonstruktors für eine Struktur verursacht einen Fehler,Auch durch die Initialisierung eines Instanzenfelds in einem struct-body wird ein Fehler generiert.Die Strukturmember können nur mithilfe eines parametrisierten Konstruktors oder durch jeweils einzelnen Zugriff auf die Member im Anschluss an die Deklaration der Struktur initialisiert werden.Alle privaten oder auf andere Weise gesperrten Member können nur in einem Konstruktor initialisiert werden.

Wenn Sie ein Strukturobjekt mit dem Operator new erzeugen, wird das Objekt erstellt und der geeignete Konstruktor aufgerufen.Strukturen können im Gegensatz zu Klassen ohne den Operator new instanziiert werden.In einem solchen Fall gibt es keinen Konstruktoraufruf, sodass die Zuordnung effizienter ausgeführt werden kann.Die Felder werden jedoch nicht zugewiesen, und das Objekt kann erst verwendet werden, nachdem alle Felder initialisiert wurden.

Wenn eine Struktur über einen Referenztyp als Member verfügt, muss der Standardkonstruktor des Member explizit aufgerufen werden. Andernfalls wird der Member nicht zugeordnet, und die Struktur kann nicht verwendet werden.(Dies führt zu Compilerfehler CS0171.)

Bei Strukturen findet keine Vererbung wie bei Klassen statt.Eine Struktur ist nicht in der Lage, von einer anderen Struktur oder Klasse zu erben, und sie kann auch nicht die Basis einer Klasse sein.Strukturen erben jedoch von der Object-Basisklasse.Eine Struktur kann Schnittstellen implementieren. Dies geschieht auf dieselbe Weise wie bei Klassen.

Sie können keine Klasse mit dem struct-Schlüsselwort deklarieren.Klassen und Strukturen weisen in C# semantische Unterschiede auf.Eine Struktur ist ein Werttyp, während eine Klasse ein Referenztyp ist.Weitere Informationen finden Sie unter Werttypen.

Sofern keine Semantik für Verweistypen benötigt wird, kann das System kleine Klassen effizienter verarbeiten, wenn diese als Struktur definiert werden.

Beispiel 1

0taef578.collapse_all(de-de,VS.110).gifDescription

In diesem Beispiel wird die struct-Initialisierung sowohl unter Verwendung von Standardkonstruktoren als auch unter Verwendung von parametrisierten Konstruktoren veranschaulicht.

0taef578.collapse_all(de-de,VS.110).gifCode

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare and initialize struct objects.
class TestCoOrds
{
    static void Main()
    {
        // Initialize:   
        CoOrds coords1 = new CoOrds();
        CoOrds coords2 = new CoOrds(10, 10);

        // Display results:
        Console.Write("CoOrds 1: ");
        Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

        Console.Write("CoOrds 2: ");
        Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    CoOrds 1: x = 0, y = 0
    CoOrds 2: x = 10, y = 10
*/

Beispiel 2

0taef578.collapse_all(de-de,VS.110).gifDescription

In diesem Beispiel wird ein Feature verwendet, das ausschließlich auf Strukturen anwendbar ist.Es wird ein CoOrds-Objekt ohne Verwendung des Operators new erstellt.Wenn Sie den Begriff struct durch class ersetzen, wird das Programm nicht kompiliert.

0taef578.collapse_all(de-de,VS.110).gifCode

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
    static void Main()
    {
        // Declare an object:
        CoOrds coords1;

        // Initialize:
        coords1.x = 10;
        coords1.y = 20;

        // Display results:
        Console.Write("CoOrds 1: ");
        Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: CoOrds 1: x = 10, y = 20

Siehe auch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Strukturen (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch