C# Language
Structs
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 derstruct
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 derstruct
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