Verwenden von Strukturen (C#-Programmierhandbuch)Using Structs (C# Programming Guide)

Der struct -Typ eignet sich für die Darstellung von kompakten Objekten, z. B. Point, Rectangleund Color.The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Obwohl es ebenso einfach ist, einen Punkt als Klasse mit automatisch implementierten Eigenschaftendarzustellen, kann eine Struktur in verschiedenen Szenarien effizienter sein.Although it is just as convenient to represent a point as a class with Auto-Implemented Properties, a struct might be more efficient in some scenarios. 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.For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object; in this case, a struct would be less expensive. Da .NET Framework.NET Framework ein Objekt mit dem Namen Pointenthält, wird die Struktur in diesem Beispiel stattdessen „CoOrds“ genannt.Because the .NET Framework.NET Framework contains an object called Point, the struct in this example is named "CoOrds" instead.

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.It is an error to define a default (parameterless) constructor for a struct. Auch durch die Initialisierung eines Instanzenfelds in einem Strukturtext wird ein Fehler generiert.It is also an error to initialize an instance field in a struct body. Sie können extern zugänglichen Strukturmember initialisieren, nur mithilfe eines parametrisierten Konstruktors, der impliziten Standardkonstruktor, ein -Objekt Initialisierer, oder durch Zugriff auf die Elemente einzeln, nachdem die Struktur deklariert ist.You can initialize externally accessible struct members only by using a parameterized constructor, the implicit, default constructor, an object initializer, or by accessing the members individually after the struct is declared. Alle privaten oder auf andere Weise gesperrten Member erfordern die Verwendung von Konstruktoren ausschließlich aus.Any private or otherwise inaccessible members require the use of constructors exclusively.

Beim Erstellen einer Struktur mit den neue Operator erstellt und der entsprechende Konstruktor aufgerufen wird, gemäß der Signatur des Konstruktors.When you create a struct object using the new operator, it gets created and the appropriate constructor is called according to the constructor's signature. Strukturen können im Gegensatz zu Klassen ohne den Operator new instanziiert werden.Unlike classes, structs can be instantiated without using the new operator. In einem solchen Fall gibt es keinen Konstruktoraufruf, sodass die Zuordnung effizienter ausgeführt werden kann.In such a case, there is no constructor call, which makes the allocation more efficient. Die Felder werden jedoch nicht zugewiesen, und das Objekt kann erst verwendet werden, nachdem alle Felder initialisiert wurden.However, the fields will remain unassigned and the object cannot be used until all of the fields are initialized. Dies schließt die Unfähigkeit in Bezug zum Abrufen oder Festlegen von Werten über automatisch implementierte Eigenschaften.This includes the inability to get or set values through auto-implemented properties.

Wenn Sie ein Strukturobjekt mit dem parameterlosen Standardkonstruktor instanziiert haben, werden allen Membern ihre Standardwerte zugewiesen.If you instantiate a struct object using the default, parameterless constructor, all members are assigned according to their default values.

Wenn Sie für eine Struktur einen Konstruktor mit Parametern schreiben, müssen Sie alle Elemente explizit initialisieren; andernfalls sind ein oder mehrere Member nicht zugewiesen, und die Struktur kann nicht verwendet werden, was einen Compilerfehler CS0171 erzeugt.When writing a constructor with parameters for a struct, you must explicitly initialize all members; otherwise one or more members remain unassigned and the struct cannot be used, producing compiler error CS0171.

Bei Strukturen findet keine Vererbung wie bei Klassen statt.There is no inheritance for structs as there is for classes. Eine Struktur kann nicht von einer anderen Struktur oder Klasse erben, und sie kann auch nicht die Basis einer Klasse sein.A struct cannot inherit from another struct or class, and it cannot be the base of a class. Stattdessen erben Strukturen von der Object-Basisklasse.Structs, however, inherit from the base class Object. Eine Struktur kann Schnittstellen implementieren. Dies geschieht auf dieselbe Weise wie bei Klassen.A struct can implement interfaces, and it does that exactly as classes do.

Sie können keine Klasse mit dem struct -Schlüsselwort deklarieren.You cannot declare a class using the keyword struct. Klassen und Strukturen weisen in C# semantische Unterschiede auf.In C#, classes and structs are semantically different. Eine Struktur ist ein Werttyp, während eine Klasse ein Verweistyp ist.A struct is a value type, while a class is a reference type. Weitere Informationen finden Sie unter Werttypen.For more information, see Value Types.

Sofern keine Semantik für Verweistypen benötigt wird, kann das System kleine Klassen effizienter verarbeiten, wenn diese als Struktur definiert werden.Unless you need reference-type semantics, a small class may be more efficiently handled by the system if you declare it as a struct instead.

Beispiel 1Example 1

BeschreibungDescription

In diesem Beispiel wird die struct -Initialisierung sowohl unter Verwendung von Standardkonstruktoren als auch unter Verwendung von parametrisierten Konstruktoren veranschaulicht.This example demonstrates struct initialization using both default and parameterized constructors.

CodeCode

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 2Example 2

BeschreibungDescription

Dieses Beispiel veranschaulicht ein Feature, das ausschließlich auf Strukturen anwendbar ist.This example demonstrates a feature that is unique to structs. Es wird ein CoOrds-Objekt ohne Verwendung des Operators new erstellt.It creates a CoOrds object without using the new operator. Wenn Sie den Begriff struct durch classersetzen, wird das Programm nicht kompiliert.If you replace the word struct with the word class, the program will not compile.

CodeCode

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 auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Klassen und StrukturenClasses and Structs
StrukturenStructs