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 typy kontejnerů jsou typu 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.
Differences
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 jsouPrivate
ve výchozím nastavení, zatímco ostatní členy třídy jsouPublic
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, prvek události noncustom; třída může být zcela prázdná.
Prvky struktury nelze deklarovat jako
Protected
; členy třídy lze.Procedura struktury může zpracovávat události pouze v případě, že se jedná o sdílenou 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
.Sub
Další informace naleznete v tématu Události.Deklarace proměnných struktury nemohou určit inicializátory nebo počáteční velikosti polí; Deklarace proměnných třídy 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 ukončeny, takže modul CLR (Common Language Runtime) nikdy nevolá metodu Finalize pro žádnou strukturu; třídy jsou ukončeny uvolňováním paměti (GC), který volá Finalize třídu, když zjistí, že neexistují žádné aktivní odkazy zbývající.
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řazování nic 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 , oddružíte ji od jakékoli instance třídy a nebudete mít přístup k žádným členům prostřednictvím 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.Rovnosti. Testování rovnosti dvou struktur musí být provedeno pomocí testu element-by-element. Pomocí metody lze porovnat dvě proměnné objektu Equals . Equals určuje, zda dvě proměnné odkazují na stejnou instanci.