Strukturer och klasser (Visual Basic)
Visual Basic förenar syntaxen för strukturer och klasser, vilket resulterar i att båda entiteterna stöder de flesta av samma funktioner. Det finns dock också viktiga skillnader mellan strukturer och klasser.
Klasser har fördelen att vara referenstyper – att skicka en referens är effektivare än att skicka en strukturvariabel med alla dess data. Å andra sidan kräver strukturer inte allokering av minne på den globala heapen.
Eftersom du inte kan ärva från en struktur bör strukturer endast användas för objekt som inte behöver utökas. Använd strukturer när objektet du vill skapa har en liten instansstorlek och ta hänsyn till prestandaegenskaperna för klasser jämfört med strukturer.
Likheter
Strukturer och klasser är liknande i följande avseenden:
Båda är containertyper , vilket innebär att de innehåller andra typer som medlemmar.
Båda har medlemmar, som kan innehålla konstruktorer, metoder, egenskaper, fält, konstanter, uppräkningar, händelser och händelsehanterare.
Medlemmar i båda kan ha individualiserade åtkomstnivåer. En medlem kan till exempel deklareras
Public
och en annanPrivate
.Båda kan implementera gränssnitt.
Båda kan ha delade konstruktorer, med eller utan parametrar.
Båda kan exponera en standardegenskap, förutsatt att egenskapen tar minst en parameter.
Båda kan deklarera och skapa händelser, och båda kan deklarera ombud.
Skillnad
Strukturer och klasser skiljer sig åt i följande uppgifter:
Strukturer är värdetyper. Klasser är referenstyper. En variabel av en strukturtyp innehåller strukturens data i stället för att innehålla en referens till data som en klasstyp gör.
Strukturer använder stackallokering; Klasser använder heap-allokering.
Alla strukturelement är
Public
som standard. Klassvariabler och konstanter ärPrivate
som standard, medan andra klassmedlemmar ärPublic
som standard. Det här beteendet för klassmedlemmar ger kompatibilitet med Visual Basic 6.0-systemet med standardvärden.En struktur måste ha minst en icke-delad variabel eller icke-delad, icke-anpassad händelseelement. en klass kan vara helt tom.
Strukturelement kan inte deklareras som
Protected
; klassmedlemmar kan.En strukturprocedur kan endast hantera händelser om det är en delad
Sub
procedur och endast med hjälp av AddHandler-instruktionen. Alla klassprocedurer kan hantera händelser med nyckelordet Handles eller instruktionenAddHandler
. Mer information finns i Händelser.Strukturvariabeldeklarationer kan inte ange initialiserare eller initiala storlekar för matriser. klassvariabeldeklarationer kan.
Strukturer ärver implicit från System.ValueType klassen och kan inte ärva från någon annan typ. Klasser kan ärva från någon annan klass eller klasser än System.ValueType.
Strukturer är inte ärvbara. klasser är.
Strukturer avslutas aldrig, så CLR (Common Language Runtime) anropar Finalize aldrig metoden på någon struktur. Klasserna avslutas av skräpinsamlaren (GC), som anropar Finalize en klass när den upptäcker att det inte finns några aktiva referenser kvar.
En struktur kräver ingen konstruktor. en klass gör det.
Strukturer kan endast ha icke-delade konstruktorer om de tar parametrar. Klasser kan ha dem med eller utan parametrar.
Varje struktur har en implicit offentlig konstruktor utan parametrar. Den här konstruktorn initierar alla strukturens dataelement till deras standardvärden. Du kan inte omdefiniera det här beteendet.
Instanser och variabler
Eftersom strukturer är värdetyper är varje strukturvariabel permanent bunden till en enskild strukturinstans. Men klasser är referenstyper och en objektvariabel kan referera till olika klassinstanser vid olika tidpunkter. Den här skillnaden påverkar din användning av strukturer och klasser på följande sätt:
Initiering. En strukturvariabel innehåller implicit en initiering av elementen med hjälp av strukturens parameterlösa konstruktor.
Dim s As struct1
Därför motsvararDim s As struct1 = New struct1()
.Tilldela variabler. När du tilldelar en strukturvariabel till en annan, eller skickar en strukturinstans till ett procedurargument, kopieras de aktuella värdena för alla variabelelement till den nya strukturen. När du tilldelar en objektvariabel till en annan eller skickar en objektvariabel till en procedur kopieras endast referenspekaren.
Tilldelar ingenting. Du kan tilldela värdet Ingenting till en strukturvariabel, men instansen fortsätter att vara associerad med variabeln. Du kan fortfarande anropa dess metoder och komma åt dess dataelement, även om variabelelement initieras om av tilldelningen.
Om du däremot anger en objektvariabel till
Nothing
kopplar du bort den från någon klassinstans och du kan inte komma åt några medlemmar via variabeln förrän du tilldelar en annan instans till den.Flera instanser. En objektvariabel kan ha olika klassinstanser tilldelade vid olika tidpunkter, och flera objektvariabler kan referera till samma klassinstans samtidigt. Ändringar som du gör i klassmedlemmarnas värden påverkar dessa medlemmar när de nås via en annan variabel som pekar på samma instans.
Strukturelement är dock isolerade i sin egen instans. Ändringar av deras värden återspeglas inte i andra strukturvariabler, inte ens i andra instanser av samma
Structure
deklaration.Jämställdhet. Likhetstestning av två strukturer måste utföras med ett element-för-element-test. Två objektvariabler kan jämföras med metoden Equals . Equals anger om de två variablerna pekar på samma instans.