Tradus din această pagină oficială de documentație Microsoft.
La fel ca clasele, struct-urile sunt structuri de date care pot conține membrii date și membri funcții, dar spre deosebire de clase, struct-urile sunt tipuri valoare și nu cer alocare pe heap. O variabilă de un tip struct stochează direct datele struct-urii, în timp ce o variabilă de un tip clasă stochează o referință la un obiect alocat dinamic. Tipurile struct nu suportă moștenire specificată de utilizator, și toate tipurile struct moștenesc implicit de la tipul ValueType, care la rândul lui moștenește implicit de la object.
{
public static void Main()
{
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i);
}
}
O alternativă este să facem Point un struct.
struct Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
Acum, doar un obiect este instanțiat — unul pentru tablou — și instanțele Point sunt stocate liniar în tablou.
Constructorii struct sunt invocați cu operatorul new, similar cu un constructor de clasă. Dar, în schimbul alocării dinamice a unui obiect pe heap-ul gestionat (en. managed) și a returnării unei referințe către el, un constructor de struct pur și simplu întoarce valoarea struct-urii în sine (de obicei ca o locație temporară pe stivă), și această valoare este apoi copiată după cât este necesar.
Cu clase, este posibil pentru două variabile să se refere la același obiect și deci posibil pentru operațiile asupra unei variabile să afecteze obiectul referit de cealaltă variabilă. Cu struct-uri, variabilele au fiecare propria lor copie a datelor, și nu este posibil pentru operațiile asupra uneia să afecteze cealaltă. De exemplu, ieșirea produsă de următorul fragment de cod depinde dacă Point este o clasă sau o struct.
Point a = new Point(10, 10);
Point b = a;
a.x = 20;
Console.WriteLine(b.x);
Dacă Point este o clasă, ieșirea este 20 deoarece a și b se referă la același obiect. Dacă Point este o struct, ieșirea este 10 deoarece atribuirea lui a la b creează o copie a valorii, și această copie este neafectată de atribuiri ulterioare la a.x.
Exemplul anterior evidențiază două din limitările struct-urilor. In primul rând, copierea unei întregi struct este de obicei mai puțin eficientă decât copierea unei referințe de obiect, deci atribuirea și transmiterea parametrilor valoare pot fi mai scumpe cu struct-urile decât cu tipurile referință. In al doilea rând, cu excepția parametrilor in, ref, și out, nu este posibil să se creeze referințe la struct-uri, ceea ce exclude utilizarea lor într-un număr de situații.
Tradus din această pagină oficială de documentație Microsoft.