Ceea ce este diferit în structura din clasa
NET suportă două tipuri de tipuri: dimensiunea (valoarea) și referința (referință). tip de valoare variabilă conține în mod direct variabilele de date și de referință conțin o referire la zona de memorie care conține date. În acest caz, memoria pentru variabilele de referință sunt întotdeauna alocate pe heap, iar memoria pentru dimensiunea, de obicei, în stivă. După cum se știe, în NET pentru a elibera memorie neutilizate în grămada utilizată de colectorul de gunoi. O caracteristică a stivei este faptul că memoria este eliberată în mod automat (fără cheltuieli generale). Astfel, distrugerea obiectelor de referință de o colecție de gunoi este mai puțin eficientă decât dimensiunea.
Acum, înapoi la întrebarea noastră. Spre deosebire de structura unei clase în .NET:
Nu contează dacă nu vă puteți aminti toate diferența. Principalul lucru de reținut și de a înțelege principal:
1 - efect al acestui fapt este că clasa este instanțiat într-o grămadă, iar structurile sunt, de obicei (dar nu întotdeauna) pe stivă
3 - Ar trebui să fie evident
4 este rezultatul 6, ca un cod de câmp de inițializare este introdus în mod implicit în toate designeri
6 este un rezultat al optimizării utilizării structurilor pentru a accelera
Caracteristici 8 și 9 pentru structurile discutate mai jos mai în detaliu, deoarece este le place să se concentreze pe interviu.
Luați în considerare acest exemplu:
Acum, ia în considerare nuanțele asociate cu impachetat si despachetat. După cum se știe, tipurile dimensionale pot moșteni de la interfețe (interfețele implimentirovat). Oamenii întreabă adesea dacă ambalajul este produs de tipul de valoare acționare la interfața. Răspunsul corect este - da, există, după cum Interfața este un tip de referință.
Luați în considerare acest exemplu:
Valoare tip interfață int implimentiruet IFormattable, conținând metoda ToString (). Deoarece ToString () metoda face parte dintr-un int de clasă, iar compilatorul stie ca acest tip de valoare, și, prin urmare, o ToString virtuală () metodă nu poate fi înlocuită (structura de tip p.f. este sigilat), compilatorul introduce un apel de metodă directă la un șir de caractere 2 și ambalare are loc. În linia 3 a ambalajului are loc deoarece Am redus la IFormattable interfață. Acum te poți spune ce se întâmplă pe linia 4: exprimate implicit la IFormattable de interfață și de apel ToString () metoda, ceea ce conduce, de asemenea, la pachet.
Și încă un lucru. Tablourile sunt tipuri de referință, dar pot conține dimensiuni. În cazul în care acesta va fi plasat, de exemplu, o serie de întregi? În grămadă, numerele întregi sunt ambalați.
această valoare. Pentru clasa:
Structura nu poate fi nul, iar acum nu va funcționa:
if (s == null). // compilare de eroare, în cazul în care s - struct
Structura nu este posibilă utilizarea operatorului ca
Direct, nu = s ca Direct; // eroare de compilare, în cazul în care Direct - struct
Structura nu este posibilă utilizarea unui operator de blocare
blocare (e) // compilare de eroare, în cazul în care s - struct
Pot exista câmpuri de tip volatile (cuvinte cheie volatile indică faptul că un câmp poate fi modificat în mai multe fire care rulează în același timp.)
câmp direct volatil privat; // eroare de compilare, în cazul în care Direct - struct
Numai struktru poate lucra cu indicii, exemple
(Cuvinte cheie nesigure denotă context nesigur necesar pentru a lucra cu indicii).
variabilă directă = nou directă ();
nesigur <
Direct * = PTR variabilă; // compilează OK
//.
>
variabilă indirectă = nou indirectă ();
structura se poate utiliza numai sizeof
int size = sizeof (Direct); // compilează OK
Acesta funcționează diferit de comparație Rezultat
struct directă
<
publică directă (valoare int)
<
câmp = valoare;
>
câmp int privat;
>
clasă indirectă
<
Indirect (valoarea int) publică
<
câmp = valoare;
>
câmp int privat;
>
clasa EqualsBehavior
<
static void Main ()
<
s1 Direct = new Direct (42);
s2 Direct = nou directă (42);
c1 indirect = new indirect (42);
c2 indirect = new indirect (42);
bool structEquality = s1. Egali (s2); // true
bool classIdentity = c1. Equals (c2); // fals
În ceea ce privește codul nesecurizată (nesigur, sizeof, etc), datele sunt de lucru cu aceste metode nu ar trebui să fie dimensionate numai de tip, dar nu conține tipurile de referință (de exemplu, câmpurile de referință acestea ar trebui să nu fie ei trebuie să fie în sus și în jos structura)