Megosztás a következőn keresztül:


Struktúrák és osztályok (Visual Basic)

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 pedig Private.

  • 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 szerint Private, míg más osztálytagok alapértelmezés szerint Public. 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 akkorSub tudjá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 az AddHandler utasí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 struct1 Ezért egyenértékű a Dim 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 Structure deklará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.

Lásd még