Delen via


Algemene typen in Visual Basic (Visual Basic)

Een algemeen type is één programmeerelement dat wordt aangepast om dezelfde functionaliteit uit te voeren voor verschillende gegevenstypen. 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 die u moet draaien en selecteert de juiste kop voor die schroef (gekruist, uitgehongerd). 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 of a screwdriver set with different heads.

Wanneer u een algemeen type definieert, parameteriseert u dit met een of meer gegevenstypen. Hierdoor kan het gebruik van code de gegevenstypen aanpassen 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 declareren van System.Collections.Generic.Queue<T>, zoals in het volgende voorbeeld wordt weergegeven.

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

U kunt nu stringQ uitsluitend met String waarden werken. Omdat stringQ dit specifiek is voor String in plaats van gegeneraliseerd te worden voor Object waarden, hebt u geen late binding of typeconversie. Dit bespaart uitvoeringstijd en vermindert runtimefouten.

Zie Een algemene klasse gebruiken voor 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 t is 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 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, waarbij 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 gegevenstypen voor een volledig voorbeeld.

In aanmerking komende programmeerelementen

U kunt algemene klassen, structuren, interfaces, procedures en gemachtigden definiëren en gebruiken. Het .NET Framework definieert verschillende algemene klassen, structuren en interfaces die veelgebruikte algemene elementen vertegenwoordigen. De System.Collections.Generic naamruimte bevat woordenlijsten, lijsten, wachtrijen en stapels. 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 wordt uitgevoerd.

  2. Een set typespecifieke versies van het type, elke versie 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:

  • Type Veiligheid. Algemene typen dwingen controle van het type compileertijd af. Typen op Object basis van het accepteren van een gegevenstype en u moet code schrijven om te controleren of een invoergegevenstype acceptabel is. Met algemene typen kan de compiler type niet overeenkomen voordat de runtime wordt uitgevoerd.

  • Prestaties. Algemene typen hoeven geen gegevens te gebruiken en uit te schakelen, omdat elk type speciaal is voor één gegevenstype. Bewerkingen op Object basis van invoergegevenstypen moeten boxinvoergegevens bevatten om ze te converteren naar Object en gegevens uit te schakelen die bestemd zijn voor uitvoer. Boksen en uitpakken vermindert de prestaties.

    Typen op Object basis van zijn ook te laat gebonden, wat betekent dat voor toegang tot hun leden tijdens runtime extra code is vereist. Dit vermindert ook de prestaties.

  • Codeconsolidatie. 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 worden hergebruikt 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 wordt geïmplementeerd IComparable.

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 voor het sorteren of sorteren, moet het bijbehorende 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 moet worden geïmplementeerd IComparable.

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

Als de volgende code probeert een klasse te maken van het leveren van itemManager een type dat niet wordt geïmplementeerd IComparable, geeft de compiler een fout aan.

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 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 verwijzingstype zijn of moet een waardetype zijn

Als u meer dan één vereiste moet opleggen, gebruikt u een lijst met door komma's gescheiden beperkingen binnen accolades ({ }). Als u een toegankelijke constructor wilt vereisen, neemt u het trefwoord Nieuwe operator 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 typen voor 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 als de IComparableIDisposable interfaces implementeren, een verwijzingstype zijn en een toegankelijke parameterloze constructor 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.

  • Typ parameter. In een algemene typedefinitie, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u het type declareert.

  • Typ argument. 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 moet implementeren, een bepaalde interface moet implementeren of overnemen van een bepaalde klasse, een toegankelijke parameterloze constructor moet hebben of een verwijzingstype of een waardetype moet zijn. U kunt deze beperkingen combineren, maar u kunt maximaal één klasse opgeven.

  • Samengesteld type. Een klasse, structuur, interface, procedure of gemachtigde die is gedeclareerd van een algemeen type door typeargumenten op te geven voor de typeparameters.

Zie ook