C# Language
structs
Zoeken…
Opmerkingen
In tegenstelling tot de klassen, een struct
is een type waarde, en wordt gemaakt op de lokale stack en niet op de beheerde hoop, door gebrek. Dit betekent dat zodra de specifieke stapel buiten het bereik valt, de struct
wordt toegewezen. Opgenomen referentietypen van niet-toegewezen struct
worden ook geveegd, zodra de GC bepaalt dat ze niet langer door de struct
.
struct
kunnen niet erven en kunnen geen basis zijn voor erfenis, ze zijn impliciet verzegeld en kunnen ook geen protected
leden omvatten. Een struct
kan echter een interface implementeren, zoals klassen.
Een struct verklaren
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
instantievelden kunnen worden ingesteld via een geparametriseerde constructor of individueel nastruct
constructie.Particuliere leden kunnen alleen door de constructeur worden geïnitialiseerd.
struct
definieert een verzegeld type dat impliciet van System.ValueType erft.Structs kunnen niet van een ander type erven, maar ze kunnen interfaces implementeren.
Structs worden bij toewijzing gekopieerd, wat betekent dat alle gegevens naar de nieuwe instantie worden gekopieerd en dat wijzigingen in de ene niet door de andere worden weerspiegeld.
Een struct kan niet
null
, hoewel het wel als een nulbaar type kan worden gebruikt:Vector v1 = null; //illegal Vector? v2 = null; //OK Nullable<Vector> v3 = null // OK
Structs kunnen worden geïnstantieerd met of zonder de
new
operator te gebruiken.//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;
De
new
operator moet echter worden gebruikt om een initialisatie te gebruiken:Vector v1 = new MyStruct { X=1, Y=2, Z=3 }; // OK Vector v2 { X=1, Y=2, Z=3 }; // illegal
Een struct kan alles aangeven wat een klasse kan verklaren, met enkele uitzonderingen:
- Een struct kan een parameterloze constructor niet declareren.
struct
instantievelden kunnen worden ingesteld via een geparametriseerde constructor of individueel nastruct
constructie. Particuliere leden kunnen alleen door de constructeur worden geïnitialiseerd. - Een struct kan leden niet als beschermd verklaren, omdat het impliciet is verzegeld.
- Struct-velden kunnen alleen worden geïnitialiseerd als ze const of statisch zijn.
Struct gebruik
Met constructeur:
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);
Zonder constructeur:
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;
Als we een struct met zijn constructor gebruiken, hebben we geen problemen met niet-toegewezen veld (elk niet-toegewezen veld heeft een null-waarde).
In tegenstelling tot klassen hoeft een struct niet te worden geconstrueerd, dwz het is niet nodig om het nieuwe trefwoord te gebruiken, tenzij u een van de constructors moet aanroepen. Voor een struct is het nieuwe sleutelwoord niet nodig, omdat het een waardetype is en dus niet nul kan zijn.
Struct implementatie interface
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;
}
}
Structs worden op opdracht gekopieerd
Sinse-structs zijn waardetypes, alle gegevens worden bij toewijzing gekopieerd en wijzigingen aan de nieuwe kopie veranderen de gegevens voor de originele kopie niet. Het onderstaande codefragment laat zien dat p1
naar p2
wordt gekopieerd en dat wijzigingen op p1
geen invloed hebben op p2
instantie.
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