Struct-uri C#

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.

Struct-urile sunt deosebit de folositoare pentru structuri mici de date care au înțeles de valoare. Numere complexe, puncte într-un sistem de coordonate, sau perechi cheie-valoare într-un dicționar sunt toate exemple bune de struct-uri. Utilizarea struct-urilor mai degrabă decât a claselor pentru structuri mici de date poate face o diferență enormă în numărul de alocări de memorie pe care le realizează o aplicație. De exemplu, următorul program creează și inițializează un tablou de 100 de puncte. Cu Point implementat ca o clasă, 101 de obiecte separate sunt instanțiate — unul pentru tablou și unul pentru fiecare din cele 100 de elemente.

public class PointExample
{
    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.

Niciun comentariu:

Trimiteți un comentariu