Mi a különbség a szerkezet osztályából

NET támogatja kétféle típusa van: a méret (érték) és a referencia (referencia). Változó értéke típus közvetlenül tartalmazza az adatokat, és referenciaértékek, azokban hivatkozni kell a memóriában, amely tartalmazza az adatokat. Ebben az esetben a memória referenciaértékek mindig osztják a kupac, és a memória a méretet, általában a stack. Mint ismeretes, a .NET felszabadítani a nem használt memória a kupac által használt a szemétgyűjtő. A jellemzője a verem, hogy a memória felszabadul automatikusan (anélkül, hogy az általános költségek). Így, a pusztítás a referencia-tárgyak által egy szemétgyűjtő kevésbé hatékony, mint a dimenzió.

Most térjünk vissza a kérdésre. Ellentétben a szerkezet egy osztály .NET:

Nem számít, ha nem emlékszik a különbség. A legfontosabb dolog, hogy emlékezzen, és megérteni a legfontosabb:
1 - hatása az, hogy az osztály példányai egy kupacban, és a szerkezetek általában (de nem mindig) a verem
3 - egyértelműnek kell lennie,
4 annak az eredménye, 6, mint mező inicializáló kódot implicite illeszteni minden tervezők
6. eredményeként használatának optimalizálása struktúrák, hogy gyorsítsák
Jellemzők 8 és 9 a struktúrák alább részletesebben, mert ez tetszik nekik, hogy összpontosítson az interjú.

Vegyük ezt a példát:

Most tekintsük az árnyalatok kapcsolódó be- és kicsomagolás. Mint ismeretes, a háromdimenziós típusok örökölnek felületek (interfészek implimentirovat). Az emberek gyakran kérdezik, hogy a csomagolás termelt működtetésekor értéktípusaként a felület. A helyes válasz - igen, van, mivel felület egy referencia típusú.
Vegyük ezt a példát:

Érték típusa int implimentiruet interfész IFormattable tartalmazó módszerrel toString (). Mivel toString () metódus része egy osztály int, és a fordító tudja, hogy ez az érték típusát, és ezáltal egy virtuális toString () metódus nem bírálhatják (fp szerkezet típusa van zárva), a fordító beszúr egy közvetlen módszer hívást egy húr A 2. és a csomagolás zajlik. A 3. sorban a csomagolás az oka, i csökken IFormattable felület. Most te magad is mondani, hogy mi folyik a 4. sorban: implicit cast, hogy a felület IFormattable és a hívás toString () metódust, ami szintén a csomagban.

És még egy dolog. A tömbök típusai, de tartalmazhat dimenzió. Amennyiben ez is lehet helyezni, például egy sor egész? A kupac, az egészek csomagolatlan.

ezt az értéket. Az osztály:

A szerkezet nem lehet null, és most ez nem fog működni:

ha (s == null). // fordítási időben hibát, ahol s - struct

A szerkezet nem lehet használni az üzemeltető

Közvetlen no = s Direct; // fordítási időben hibát, ahol Direct - struct

A szerkezet nem lehet használni az üzemben zár

zár (s) // fordítási időben hibát, ahol s - struct

Nem lehet illékony típusú mezők (illékony kulcsszó jelzi, hogy a mező lehet módosítani több szálon fut egyszerre.)

privát illékony Direct területen; // fordítási időben hibát, ahol Direct - struct

Csak struktru tud dolgozni mutató, példákkal

(Kulcsszó biztonságos jelöli biztonságos környezetben kell dolgozni mutatókat).

Közvetlen változó = új Direct ();

veszélyes <
Közvetlen * ptr = változó; // rendben lefordul
//.
>

Közvetett változó = új közvetett ();

A szerkezet csak használni sizeof

int size = sizeof (Direct); // rendben lefordul

Úgy működik másképp összehasonlítás Eredmény

struct Direct
<
nyilvános Direct (int érték)
<
mező = érték;
>
private int területen;
>

osztály Közvetett
<
nyilvános Közvetett (int érték)
<
mező = érték;
>
private int területen;
>

osztály EqualsBehavior
<
static void Main ()
<
Közvetlen s1 = új Direct (42);
Közvetlen s2 = új Direct (42);

Közvetett c1 = új közvetett (42);
Közvetett c2 = új közvetett (42);

bool structEquality = s1. Egyenlő (s2); // true
bool classIdentity = c1. Eredmény (c2); // false

Ami a nem biztonságos kód (nem biztonságos, sizeof stb), az adatok dolgoznak ezekkel a módszerekkel nem csak kell méretezni típus, de nem tartalmazza a referencia típus (azaz referencia mezők hogy ne legyen kell lenniük fel és le a szerkezet)