Suche…


Bemerkungen

Im Gegensatz zu Klassen ist eine struct ein struct , der standardmäßig auf dem lokalen Stapel und nicht auf dem verwalteten Heap erstellt wird . Dies bedeutet, dass die struct wird, sobald der bestimmte Stapel den Gültigkeitsbereich struct . Enthaltene Referenztypen von nicht zugeordneten struct werden ebenfalls überstrichen, sobald der GC feststellt, dass sie nicht mehr von der struct referenziert werden.

struct s können nicht erben und können keine Grundlage für die Vererbung sein, sie sind implizit versiegelt und können auch keine protected Mitglieder enthalten. Eine struct kann jedoch eine Schnittstelle wie Klassen implementieren.

Struktur deklarieren

public struct Vector 
{
    public int X;
    public int Y;
    public int Z;
}

public struct Point
{
    public decimal x, y;
    
    public Point(decimal pointX, decimal pointY)
    {
        x = pointX;
        y = pointY;
    }
}
  • struct Instanzfelder können über einen parametrisierten Konstruktor oder einzeln nach der struct werden.

  • Private Member können nur vom Konstruktor initialisiert werden.

  • struct definiert einen versiegelten Typ, der implizit von System.ValueType erbt.

  • Strukturen können nicht von einem anderen Typ erben, sie können jedoch Schnittstellen implementieren.

  • Strukturen werden bei der Zuweisung kopiert. Das bedeutet, dass alle Daten in die neue Instanz kopiert werden und Änderungen an einer Instanz nicht von der anderen Instanz übernommen werden.

  • Eine Struktur kann nicht null , obwohl es als ein Nullable Type verwendet werden:

    Vector v1 = null; //illegal
    Vector? v2 = null; //OK
    Nullable<Vector> v3 = null // OK
    
  • Strukturen können mit oder ohne Verwendung des new Operators instanziiert werden.

    //Both of these are acceptable
    Vector v1 = new Vector();
    v1.X = 1;
    v1.Y = 2;
    v1.Z = 3;
    
    Vector v2;
    v2.X = 1;
    v2.Y = 2;
    v2.Z = 3;
    

    Der new Operator muss jedoch verwendet werden, um einen Initialisierer verwenden zu können:

    Vector v1 = new MyStruct { X=1, Y=2, Z=3 }; // OK
    Vector v2 { X=1, Y=2, Z=3 }; // illegal
    

Eine Struktur kann alles deklarieren, was eine Klasse mit wenigen Ausnahmen deklarieren kann:

  • Eine Struktur kann keinen parameterlosen Konstruktor deklarieren. struct Instanzfelder können über einen parametrisierten Konstruktor oder einzeln nach der struct werden. Private Member können nur vom Konstruktor initialisiert werden.
  • Eine Struktur kann Mitglieder nicht als geschützt deklarieren, da sie implizit versiegelt ist.
  • Strukturfelder können nur initialisiert werden, wenn sie const oder static sind.

Strukturverwendung

Mit Konstruktor:

Vector v1 = new Vector();
v1.X = 1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3

Vector v1 = new Vector();
//v1.X is not assigned
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=0,Y=2,Z=3

Point point1 = new Point();
point1.x = 0.5;
point1.y = 0.6;

Point point2 = new Point(0.5, 0.6);

Ohne Konstruktor:

Vector v1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
//Output ERROR "Use of possibly unassigned field 'X'

Vector v1;
v1.X = 1;
v1.Y = 2;
v1.Z = 3;

Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3

Point point3;
point3.x = 0.5;
point3.y = 0.6;

Wenn wir eine Struktur mit ihrem Konstruktor verwenden, haben wir keine Probleme mit einem nicht zugewiesenen Feld (jedes nicht zugewiesene Feld hat einen Nullwert).

Im Gegensatz zu Klassen muss eine Struktur nicht erstellt werden. Das neue Schlüsselwort muss also nicht verwendet werden, es sei denn, Sie müssen einen der Konstruktoren aufrufen. Eine Struktur erfordert kein neues Schlüsselwort, da es sich um einen Werttyp handelt und daher nicht null sein kann.

Struktur implementierende Schnittstelle

public interface IShape
{
    decimal Area();
}

public struct Rectangle : IShape
{
    public decimal Length { get; set; }
    public decimal Width { get; set; }

    public decimal Area()
    {
        return Length * Width;
    }
}

Strukturen werden bei der Zuweisung kopiert

Sinse-Strukturen sind Werttypen, bei denen alle Daten bei der Zuweisung kopiert werden. Durch Änderungen an der neuen Kopie werden die Daten für die ursprüngliche Kopie nicht geändert. Der nachstehende p1 zeigt, dass p1 in p2 kopiert wird und Änderungen an p1 die p2 Instanz nicht beeinflussen.

var p1 = new Point {
    x = 1,
    y = 2
};

Console.WriteLine($"{p1.x} {p1.y}"); // 1 2

var p2 = p1;
Console.WriteLine($"{p2.x} {p2.y}"); // Same output: 1 2

p1.x = 3;
Console.WriteLine($"{p1.x} {p1.y}"); // 3 2
Console.WriteLine($"{p2.x} {p2.y}"); // p2 remain the same: 1 2


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow