Delen via


Algemene typen in Visual Basic (Visual Basic)

Een algemeen type is één programmeerelement dat wordt aangepast om dezelfde functionaliteit voor meerdere gegevenstypen uit te voeren. Wanneer u een algemene klasse of procedure definieert, hoeft u geen afzonderlijke versie te definiëren voor elk gegevenstype waarvoor u die functionaliteit mogelijk wilt uitvoeren.

Een analogie is een schroevendraaierset met verwijderbare hoofden. U inspecteert de schroef en selecteert de juiste kop voor die schroef (gekruist, uitgesterd). Zodra u de juiste kop in de schroevendraaier plaatst, voert u exact dezelfde functie uit met de schroevendraaier, namelijk het draaien van de schroef.

Diagram van een schroevendraaierset met verschillende hoofden.

Wanneer u een algemeen type definieert, parameteriseert u dit met een of meer gegevenstypen. Met typeparameters kunt u code gebruiken om de gegevenstypen aan te passen aan de vereisten. Uw code kan verschillende programmeerelementen van het algemene element declareren, elk element dat op een andere set gegevenstypen werkt. Maar de gedeclareerde elementen voeren allemaal dezelfde logica uit, ongeacht welke gegevenstypen ze gebruiken.

U kunt bijvoorbeeld een wachtrijklasse maken en gebruiken die werkt op een specifiek gegevenstype, zoals String. U kunt een dergelijke klasse uit System.Collections.Generic.Queue<T>declareren, zoals in het volgende voorbeeld wordt weergegeven.

Public stringQ As New System.Collections.Generic.Queue(Of String)

U kunt nu stringQ gebruiken om uitsluitend te werken met String waarden. Omdat stringQ specifiek is voor String in plaats van te worden gegeneraliseerd voor Object waarden, hebt u geen late binding of typeconversie. Algemene typen besparen uitvoeringstijd en verminderen runtimefouten.

Zie How to: Use a Generic Classvoor meer informatie over het gebruik van een algemeen type.

Voorbeeld van een algemene klasse

In het volgende voorbeeld ziet u een basisdefinitie van een algemene klasse.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

In het voorgaande skelet is t een typeparameter, dat wil zeggen, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u de klasse declareert. Elders in uw code kunt u verschillende versies van classHolder declareren door verschillende gegevenstypen voor top te geven. In het volgende voorbeeld ziet u twee dergelijke declaraties.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

De voorgaande instructies declareren samengestelde klassen, waarin een specifiek type de typeparameter vervangt. Deze vervanging wordt doorgegeven in de code binnen de samengestelde klasse. In het volgende voorbeeld ziet u hoe de processNewItem procedure eruitziet in integerClass.

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

Zie Een klasse definiëren die identieke functionaliteit kan bieden voor verschillende gegevenstypenvoor een volledig voorbeeld.

In aanmerking komende programmeerelementen

U kunt algemene klassen, structuren, interfaces, procedures en gemachtigden definiëren en gebruiken. .NET definieert verschillende algemene klassen, structuren en interfaces die veelgebruikte algemene elementen vertegenwoordigen. De System.Collections.Generic naamruimte bevat woordenlijsten, lijsten, wachtrijen en stacks. Voordat u uw eigen algemene element definieert, controleert u of het al beschikbaar is in System.Collections.Generic.

Procedures zijn geen typen, maar u kunt algemene procedures definiëren en gebruiken. Zie Algemene procedures in Visual Basic.

Voordelen van algemene typen

Een algemeen type fungeert als basis voor het declareren van verschillende programmeerelementen, die elk op een specifiek gegevenstype werken. De alternatieven voor een algemeen type zijn:

  1. Eén type dat op het Object gegevenstype werkt.
  2. Een collectie van typespecifieke versies van het type. Elke versie wordt afzonderlijk gecodeerd en wordt uitgevoerd op één specifiek gegevenstype, zoals String, Integerof een door de gebruiker gedefinieerd type, zoals customer.

Een algemeen type heeft de volgende voordelen ten opzichte van deze alternatieven:

  • Typeveiligheid Algemene typen zorgen voor typecontrole tijdens compileertijd. Typen op basis van Object elk gegevenstype accepteren en u moet code schrijven om te controleren of een invoergegevenstype acceptabel is. Door generieke typen kan de compiler typecompatibiliteitsfouten opsporen voordat het programma wordt uitgevoerd.
  • Voorstelling. Algemene typen hoeven vak niet te en gegevens uit te schakelen, omdat elk type speciaal is voor één gegevenstype. Bewerkingen op basis van Object moeten invoergegevenstypen boxen om ze naar Object te converteren en gegevens unboxen die bestemd zijn voor uitvoer. Boxing en unboxing verminderen de prestaties. Typen op basis van Object zijn ook laat gebonden, wat betekent dat het aanroepen van hun leden tijdens runtime extra code vereist. Typeconversies verminderen ook de prestaties.
  • Code-consolidatie. De code in een algemeen type moet slechts één keer worden gedefinieerd. Een set typespecifieke versies van een type moet in elke versie dezelfde code repliceren, waarbij het enige verschil het specifieke gegevenstype voor die versie is. Met algemene typen worden de typespecifieke versies allemaal gegenereerd op basis van het oorspronkelijke algemene type.
  • Code hergebruiken. Code die niet afhankelijk is van een bepaald gegevenstype, kan opnieuw worden gebruikt met verschillende gegevenstypen als dit algemeen is. U kunt het vaak opnieuw gebruiken, zelfs met een gegevenstype dat u oorspronkelijk niet hebt voorspeld.
  • IDE-ondersteuning. Wanneer u een samengesteld type gebruikt dat is gedeclareerd op basis van een algemeen type, kan de IDE (Integrated Development Environment) u meer ondersteuning bieden terwijl u uw code ontwikkelt. IntelliSense kan u bijvoorbeeld de typespecifieke opties voor een argument aan een constructor of methode laten zien.
  • Algemene algoritmen. Abstracte algoritmen die typeonafhankelijk zijn, zijn goede kandidaten voor algemene typen. Een algemene procedure waarmee items worden gesorteerd met behulp van de IComparable-interface, kan bijvoorbeeld worden gebruikt met elk gegevenstype dat IComparableimplementeert.

Beperkingen

Hoewel de code in een algemene typedefinitie zo typeonafhankelijk moet zijn als mogelijk, moet u mogelijk een bepaalde mogelijkheid vereisen van elk gegevenstype dat aan uw algemene type wordt geleverd. Als u bijvoorbeeld twee items wilt vergelijken om te sorteren of samen te voegen, moet hun gegevenstype de IComparable-interface implementeren. U kunt deze vereiste afdwingen door een beperking toe te voegen aan de typeparameter.

Voorbeeld van een beperking

In het volgende voorbeeld ziet u een basisdefinitie van een klasse met een beperking waarvoor het typeargument is vereist om IComparablete implementeren.

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

Als de volgende code probeert een klasse op te bouwen van itemManager en een type opgeeft dat IComparableniet implementeert, geeft de compiler een foutmelding.

Typen beperkingen

Uw beperking kan de volgende vereisten opgeven in elke combinatie:

  • Het typeargument moet een of meer interfaces implementeren
  • Het typeargument moet van het type zijn of overnemen van maximaal één klasse.
  • Het typeargument moet een parameterloze constructor beschikbaar maken die toegankelijk is voor de code waarmee objecten worden gemaakt
  • Het typeargument moet een verwijzingstypeof een waardetype zijn.

C#-code kan aangeven dat een typeargument een onbeheerde typemoet zijn. Visual Basic dwingt deze beperking af voor Visual Basic-code die gebruikmaakt van een algemeen type of methode die is gedefinieerd met deze beperking (in C#). U kunt echter geen unmanaged beperking declareren voor een typeparameter in Visual Basic.

Als u meer dan één vereiste moet opleggen, gebruikt u een door komma's gescheiden lijst met beperkingen tussen accolades ({ }). Als u een toegankelijke constructor wilt vereisen, neemt u het New Operator trefwoord op in de lijst. Als u een verwijzingstype wilt vereisen, neemt u het Class trefwoord op; als u een waardetype wilt vereisen, neemt u het Structure trefwoord op.

Zie Lijst met typenvoor meer informatie over beperkingen.

Voorbeeld van meerdere beperkingen

In het volgende voorbeeld ziet u een basisdefinitie van een algemene klasse met een lijst met beperkingen voor de typeparameter. In de code waarmee een exemplaar van deze klasse wordt gemaakt, moet het typeargument zowel de IComparable- als IDisposable-interfaces implementeren, een verwijzingstype zijn en een toegankelijke constructor zonder parameter beschikbaar maken.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

Belangrijke termen

Algemene typen introduceren en gebruiken de volgende termen:

  • Algemeen type. Een definitie van een klasse, structuur, interface, procedure of gemachtigde waarvoor u ten minste één gegevenstype opgeeft wanneer u deze declareert.
  • Parametertype. In een algemene typedefinitie, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u het type declareert.
  • Argumenttypen. Een specifiek gegevenstype dat een typeparameter vervangt wanneer u een samengesteld type declareert van een algemeen type.
  • beperking. Een voorwaarde voor een typeparameter waarmee het typeargument wordt beperkt dat u hiervoor kunt opgeven. Een beperking kan vereisen dat het typeargument een bepaalde interface implementeert, overnemen van een bepaalde klasse, een toegankelijke parameterloze constructor heeft of een verwijzingstype of een waardetype is. U kunt deze beperkingen combineren, maar u kunt maximaal één basisklasse opgeven.
  • samengesteld type. Een klasse, structuur, interface, procedure of gedelegeerde die is gedeclareerd vanuit een algemeen type door typeargumenten op te geven voor de typeparameters.

Zie ook