Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Visual Basic egyesíti a struktúrák és osztályok szintaxisát, így mindkét entitás ugyanazokat a funkciókat támogatja. A struktúrák és az osztályok között azonban fontos különbségek is vannak.
Az osztályok előnye, hogy referenciatípusok – a referencia átadása hatékonyabb, mint egy struktúraváltozó átadása az összes adattal. Másrészt a struktúrák nem igényelnek memóriafoglalást a globális halomra.
Mivel nem örökölhet szerkezetből, a struktúrákat csak olyan objektumokhoz szabad használni, amelyeket nem kell kiterjeszteni. Akkor használjon struktúrákat, ha a létrehozni kívánt objektum kis példányméretű, és vegye figyelembe az osztályok és struktúrák teljesítményjellemzőit.
Hasonlóságok
A struktúrák és osztályok a következő szempontok szerint hasonlóak:
Mindkettő tárolótípus , ami azt jelenti, hogy tagként más típusokat is tartalmaznak.
Mindkettőnek vannak tagjai, amelyek lehetnek konstruktorok, metódusok, tulajdonságok, mezők, állandók, számbavételek, események és eseménykezelők.
Mindkét tag egyéni hozzáférési szinttel rendelkezhet. Például egy tag deklarálható
Public, egy másik pedigPrivate.Mindkettő képes interfészeket implementálni.
Mindkettő rendelkezhet közös konstruktorokkal paraméterekkel vagy anélkül.
Mindkettő közzétehet egy alapértelmezett tulajdonságot, feltéve, hogy a tulajdonság legalább egy paramétert vesz igénybe.
Mindkettő deklarálhat és előhozhat eseményeket, és mindkettő deklarálhat meghatalmazottakat.
Különbségek
A struktúrák és osztályok a következő adatokban különböznek:
A struktúrák értéktípusok; az osztályok referenciatípusok. Egy struktúratípus változója a struktúra adatait tartalmazza, nem pedig az adatokra mutató hivatkozást, ahogy az osztálytípus teszi.
A struktúrák veremfoglalást használnak; az osztályok halomfoglalást használnak.
Minden szerkezeti elem alapértelmezés szerint
Public; az osztályváltozók és az állandók alapértelmezés szerintPrivate, míg más osztálytagok alapértelmezés szerintPublic. Ez az osztálytagok viselkedése kompatibilitást biztosít a Visual Basic 6.0 alapértelmezett rendszerével.A szerkezetnek legalább egy nem tagolt változóval vagy nem tagolt, nemcustom eseményelemsel kell rendelkeznie; egy osztály teljesen üres lehet.
A struktúraelemeket nem lehet
Protected-ként deklarálni; osztálytagokat viszont igen.A struktúraeljárások csak akkor
Subtudják kezelni az eseményeket, ha megosztott eljárásról van szó, és csak az AddHandler utasítással; bármely osztályművelet képes kezelni az eseményeket a Handles kulcsszó vagy azAddHandlerutasítás használatával. További információ: Események.A struktúraváltozó-deklarációk nem adhatnak meg inicializálókat vagy kezdeti méreteket a tömbökhöz, míg az osztályváltozó-deklarációk ezt megtehetik.
A struktúrák a System.ValueType osztályból implicit módon örökölnek, és nem örökölhetnek más típusból; az osztályok bármely más osztályból örökölhetnek, kivéve a System.ValueType osztályból.
A struktúrák nem örökölhetők; az osztályok igen.
A struktúrák soha nem fejeződnek be, így a közös nyelvi futtatókörnyezet (CLR) soha nem hívja meg a Finalize metódust semmilyen struktúrán; az osztályokat a szemétgyűjtő (GC) leállítja, amely meghív Finalize egy osztályt, amikor észleli, hogy nincsenek aktív hivatkozások.
A szerkezet nem igényel konstruktort; egy osztály igen.
A struktúrák csak akkor tartalmazhatnak nem tagolt konstruktorokat, ha paramétereket vesznek fel; az osztályok paraméterekkel vagy anélkül is rendelkezhetnek.
Minden struktúra implicit nyilvános konstruktorsal rendelkezik paraméterek nélkül. Ez a konstruktor inicializálja a struktúra összes adatelemét az alapértelmezett értékükre. Ezt a viselkedést nem lehet újradefinini.
Példányok és változók
Mivel a struktúrák értéktípusok, minden struktúraváltozó véglegesen egy adott struktúrapéldányhoz van kötve. Az osztályok azonban referenciatípusok, és az objektumváltozók különböző osztálypéldányokra hivatkozhatnak különböző időpontokban. Ez a különbség a struktúrák és osztályok használatát a következő módokon befolyásolja:
Inicializálás. A struktúraváltozó implicit módon tartalmazza az elemek inicializálását a struktúra paraméter nélküli konstruktorával.
Dim s As struct1Ezért egyenértékű aDim s As struct1 = New struct1().Változók hozzárendelése. Ha egy struktúraváltozót rendel egy másikhoz, vagy egy struktúrapéldányt egy eljárásargumentumnak ad át, a rendszer az összes változóelem aktuális értékeit az új struktúrába másolja. Ha egy objektumváltozót egy másikhoz rendel, vagy egy objektumváltozót ad át egy eljárásnak, csak a referenciamutató lesz másolva.
Semmi hozzárendelése. A Semmi értéket hozzárendelheti egy struktúraváltozóhoz, de a példány továbbra is hozzá lesz rendelve a változóhoz. Továbbra is meghívhatja a metódusokat, és hozzáférhet az adatelemekhez, bár a hozzárendelés újraincializálja a változó elemeket.
Ezzel szemben, ha egy objektumváltozót
Nothingértékre állít, megszünteti az összekapcsolását egy osztálypéldánnyal, és nem érhet el tagokat a változón keresztül, amíg újabb példányt nem rendel hozzá.Több példány. Az objektumváltozókhoz különböző osztálypéldányok rendelhetők különböző időpontokban, és egyszerre több objektumváltozó is hivatkozhat ugyanarra az osztálypéldányra. Az osztálytagok értékeinek módosítása hatással van ezekre a tagokra, amikor egy másik, ugyanazon példányra mutató változón keresztül férnek hozzá.
A struktúraelemek azonban elkülönítve vannak a saját példányukban. Az értékük módosítása nem jelenik meg semmilyen más struktúraváltozóban, még ugyanazon
Structuredeklaráció más példányaiban sem.Egyenlőség. Két szerkezet egyenlőségi tesztelését elemenkénti vizsgálattal kell elvégezni. A metódussal Equals két objektumváltozó hasonlítható össze. Equals jelzi, hogy a két változó ugyanarra a példányra mutat-e.