Sunday, May 26, 2019 17:04

Structuri

În C# și framework-ul .NET există două implementări ale conceptului de „clasă”, din punct de vedere al OOP: clase și structuri.

Știm deja că clasele sunt definite utilizând cuvântul cheie class; structurile sunt definite utilizând cuvântul cheie struct.

Cea mai importantă diferență dintre o structură și o clasă este faptul că clasele sunt tipuri de referință (referințe la adresele de heap care dețin membrii lor), în timp ce structurile (struct) sunt tipuri de valoare (dețin membrii lor direct în stiva de execuție a programului).

Să luăm un exemplu de definire a unei structuri, utilizând cea mai populară structură .NET, punctul 2D:

După cum puteți vedea, codul de mai sus este identic cu o clasă, cu singura diferență notabilă de folosire a cuvântului cheie struct în loc de class. Point2D este o structură, un tip de valoare, deci instanțele sale se comportă ca int și double. Acestea sunt tipuri de valori (nu obiecte), ceea ce înseamnă că ele nu pot fi nule, și sunt trimise prin valoare atunci când sunt luate ca parametri de metodă.

Pentru a ilustra acest lucru, să ne jucăm un pic cu structura Point2D:

Când compilăm și executăm codul de mai sus, rezultatul este următorul:

structuri

Din acest exemplu, putem observa demonstrarea faptului că structurile sunt tipuri de valori. Atunci când acestea sunt transmise ca parametri pentru metode și funcții, câmpurile lor sunt copiate (la fel cum se întâmplă și în cazul parametrilor int), iar atunci când sunt modificate în interiorul acelei metode sau funcții, modificarea nu afectează originalele, ci doar copiile.

Primul pas, variabila punct este creată și deține o valoare de (3, -2). Apoi, metoda IncearcaSaSchimbiPunct(Point2D p) este apelată, și copiază valoarea variabilei punct într-un alt loc din stivă, alocat parametrului p al metodei. Când parametrul p este schimbat în corpul metodei, acesta este modificat în stivă și acest lucru nu afectează variabila punct inițială, care a fost anterior trecută ca argument atunci când am apelat metoda.

Dacă schimbăm Point2D din struct în clasă, rezultatul va fi foarte diferit:

struct

Acest lucru se datorează faptului că variabila punct va fi trecută acum prin referință (nu prin valoare), iar valoarea sa va fi împărțită între punct și p din stivă.

Cum să decideți când să utilizați o clasă și când o structură? Iată câteva sfaturi generale:

  • Utilizați structurile pentru a păstra structuri de date simple constând din câțiva câmpuri care sunt înrudite. Exemple: ​​coordonate, dimensiuni, locații, culori, etc.
  • Structurile nu trebuie să aibă funcționalitate înăuntrul lor (fără metode, cu excepția celor simple, cum ar fi ToString() și comparatori).
  • Utilizați structuri pentru structuri de date mici, constând dintr-un set de câmpuri care ar trebui să fie trecute prin valoare.
  • Utilizați clase pentru scenarii mai complexe, în care combinați datele și logica de programare într-o clasă. Dacă aveți logică, utilizați o clasă.
  • Dacă aveți mai mult de câțiva câmpuri simple, utilizați o clasă.
  • Dacă trebuie să treceți variabilele prin referință, utilizați o clasă.
  • Dacă trebuie să atribuiți o valoare nulă, e preferabil să folosiți o clasă.
    Dacă preferați să lucrați cu tipuri de referință, utilizați o clasă.
  • Clasele sunt folosite mai des decât structurile. Utilizați structurile ca excepții, și numai dacă știți bine ce faceți!
  • Toate tipurile prin valoare (int, bool, char) sunt structuri. Rareori avem de câștigat prin crearea unor structuri personalizate.

Există câteva alte diferențe între clase și structuri, pe lângă faptul că clasele sunt tipuri de referință, iar structurile sunt tipuri de valoare, dar nu le voi discuta aici. Pentru mai multe detalii, consultați articolul MSDN.

Comments

comments

Tags: , , , ,

2 Responses to “Structuri”

  1. M spune:

    Foarte interesant articolul

Leave a Reply