Sdílet prostřednictvím


Struktury a třídy (Visual Basic)

Visual Basic sjednocuje syntaxi struktur a tříd s výsledkem, že obě entity podporují většinu stejných funkcí. Existují však také důležité rozdíly mezi strukturami a třídami.

Třídy mají výhodu, že se jedná o odkazové typy – předání odkazu je efektivnější než předání proměnné struktury se všemi jejími daty. Na druhou stranu struktury nevyžadují přidělení paměti v globální haldě.

Vzhledem k tomu, že nelze dědit ze struktury, měly by se struktury používat pouze pro objekty, které není nutné rozšířit. Struktury použijte, když objekt, který chcete vytvořit, má malou velikost instance a vezměte v úvahu charakteristiky výkonu tříd a struktur.

Podobnosti

Struktury a třídy jsou podobné v následujících ohledech:

  • Oba jsou typy kontejneru, což znamená, že obsahují jiné typy jako členy.

  • Oba mají členy, které mohou zahrnovat konstruktory, metody, vlastnosti, pole, konstanty, výčty, události a obslužné rutiny událostí.

  • Členové obou můžou mít individualizované úrovně přístupu. Například jeden člen může být deklarován Public a druhý Private.

  • Obě můžou implementovat rozhraní.

  • Oba můžou mít sdílené konstruktory s parametry nebo bez parametrů.

  • Obě můžou vystavit výchozí vlastnost za předpokladu, že tato vlastnost přebírá alespoň jeden parametr.

  • Oba můžou deklarovat a vyvolat události a oba můžou deklarovat delegáty.

Rozdíly

Struktury a třídy se liší v následujících specifikách:

  • Struktury jsou typy hodnot; třídy jsou odkazové typy. Proměnná typu struktury obsahuje data struktury, nikoli odkaz na data jako typ třídy.

  • Struktury používají přidělení zásobníku; třídy používají přidělení haldy.

  • Všechny prvky struktury jsou Public ve výchozím nastavení; proměnné třídy a konstanty jsou Private ve výchozím nastavení, zatímco ostatní členy třídy jsou Public ve výchozím nastavení. Toto chování pro členy třídy poskytuje kompatibilitu se systémem Visual Basic 6.0 výchozích hodnot.

  • Struktura musí mít alespoň jednu nesdílenou proměnnou nebo nesdílenou, neuživatelskou událost; třída může být zcela prázdná.

  • Prvky struktury nelze deklarovat jako Protected; avšak členy třídy ano.

  • Procedura struktury může zpracovávat události pouze v případě, že se jedná o sdílenouSub proceduru, a to pouze pomocí příkazu AddHandler; jakákoli procedura třídy může zpracovávat události pomocí klíčového slova Handles nebo příkazu AddHandler . Další informace naleznete v části Události .

  • Deklarace proměnných struktury nemohou obsahovat inicializátory nebo určovat počáteční velikosti polí, ale deklarace proměnných třídy to mohou.

  • Struktury implicitně dědí z System.ValueType třídy a nemohou dědit z jakéhokoli jiného typu; třídy mohou dědit z jakékoli třídy nebo třídy jiné než System.ValueType.

  • Struktury nejsou zděděné; třídy jsou.

  • Struktury nejsou nikdy zrušeny, takže modul CLR (Common Language Runtime) nikdy nevolá metodu Finalize na žádnou strukturu; třídy jsou zrušeny správcem paměti (GC), který volá Finalize na třídu, když zjistí, že nezůstaly žádné aktivní odkazy.

  • Struktura nevyžaduje konstruktor; třída dělá.

  • Struktury mohou mít nesdílené konstruktory pouze v případě, že přebírají parametry; třídy je mohou mít s parametry nebo bez nich.

Každá struktura má implicitní veřejný konstruktor bez parametrů. Tento konstruktor inicializuje všechny datové prvky struktury na výchozí hodnoty. Toto chování nelze předefinovat.

Instance a proměnné

Vzhledem k tomu, že struktury jsou typy hodnot, každá proměnná struktury je trvale vázána na instanci jednotlivé struktury. Třídy jsou ale odkazové typy a proměnná objektu může odkazovat na různé instance tříd v různých časech. Toto rozlišení ovlivňuje použití struktur a tříd následujícími způsoby:

  • Inicializace. Proměnná struktury implicitně zahrnuje inicializaci prvků pomocí konstruktoru bez parametrů struktury. Dim s As struct1 Proto je ekvivalentní Dim s As struct1 = New struct1().

  • Přiřazování proměnných Když přiřadíte jednu proměnnou struktury jiné nebo předáte instanci struktury argumentu procedury, aktuální hodnoty všech elementů proměnné se zkopírují do nové struktury. Když přiřadíte jednu proměnnou objektu jiné nebo předáte proměnnou objektu procedurě, zkopíruje se pouze odkazový ukazatel.

  • Přiřazení ničeho Hodnotu Nothing můžete přiřadit proměnné struktury, ale instance bude nadále přidružena k proměnné. Stále můžete volat jeho metody a přistupovat k jeho datovým prvkům, ačkoli proměnné prvky jsou znovu inicializovány přiřazením.

    Pokud nastavíte proměnnou objektu na Nothing hodnotu, oddělíte ji od jakékoli instance třídy a nebudete mít přístup k žádným členům pomocí proměnné, dokud k ní nepřiřadíte jinou instanci.

  • Více instancí. Proměnná objektu může mít různé instance třídy přiřazené v různou dobu a několik proměnných objektu může odkazovat na stejnou instanci třídy současně. Změny hodnot členů třídy ovlivňují tyto členy při přístupu prostřednictvím jiné proměnné odkazující na stejnou instanci.

    Prvky struktury jsou však izolované v rámci své vlastní instance. Změny jejich hodnot se neprojeví v žádné jiné proměnné struktury, a to ani v jiných instancích stejné Structure deklarace.

  • Rovnost. Testování rovnosti dvou struktur musí být provedeno pomocí testu po elementech. Pomocí metody lze porovnat dvě proměnné objektu Equals . Equals určuje, zda dvě proměnné odkazují na stejnou instanci.

Viz také