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 na struct 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 na struct 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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow