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)