Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

14.3. Local Type Inference - Option Infer

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Vanaf Visual Basic 9.0 (2008) kan de compiler het datatype van een lokale variabele, gedeclareerd zonder type specifier (As clausule), afleiden van het datatype van de initialization expression.
Visual Basic 2012 Broncode - Codevoorbeeld 368
Option Infer On
Option Explicit Off
Option Strict Off
Class Example1
    Public Shared Sub Main()
        Dim value1 = 1
        Dim value2 = "2"
        Dim value3 = "3"c
        Dim value4 = GetSomeByte()
        Dim value5 = New Integer() {1, 2, 3}
        For Each value6 In value5
            ' ...
        Next
        Static value7 = 4
        '
        Console.ReadLine()
    End Sub
    Public Shared Function GetSomeByte() As Byte
    End Function
End Class
De statische types van de variabelen zijn :
value1 -> 'Int32'
value2 -> 'String'
value3 -> 'Char'
value4 -> 'Byte'
value5 -> 'Integer()'
value6 -> 'Integer'
value7 -> 'Object'
De Static variabelen hebben een langere lifespan dan gewone lokale variabelen.  Op deze is geen type inference van toepassing.

14.3.1. Early Bound en Strongly Typed Objecten

In Visual Basic 8.0 (2005) was het ook toegestaan variabelen te declareren zonder type specifiers, althans bij permissive type semantics (Option Strict Off).  In dat geval werden deze variabelen van het type Object beschouwd.
Met alle bijhorende nadelen ((un)boxing en nadelen van late bound objects) vandien.
Bij een verwijzing naar objecten kan pas at runtime (very "late") worden gecontroleerd of een member (aangeroepen op een late bound object) wel degelijk aanwezig is in het effectieve datatype van het gewrapte object.  Dit introduceert het risico op typefouten at runtime en veroorzaakt een bepaalde performance overhead.

In Visual Basic 9.0 (2008) echter zorgt type inference ervoor dat deze lokale variabelen strongly typed zijn, waardoor we hier enkel met early bound objecten werken.
De compiler kan reeds problemen opvangen (voor runtime) die zouden optreden bij een foutief gebruik (bijvoorbeeld het aanroepen van een onbestaande member) van deze stongly typed expressies (hier variabelen).
Verder hebben early bound objecten als voordeel dat geheugen preciezer kan worden ge-alloceerd, en dat de compiler betere optimalisaties kan uitvoeren.
Visual Studio : Werken met strongly typed objectexpressies biedt natuurlijk ook als voordeel dat de IDE IntelliSense hulp kan bieden over de members van een object.

14.3.2. Option Infer

Visual Studio : Compiler optie Option Infer On is de default voor Visual Studio 2008 projecten.

Projecten die vanuit vorige Visual Studio versies worden ge-upgrade naar Visual Basic 2008 gebruiken Option Infer Off.  Dit is een logische keuze, gezien de variabelen die daar gedeclareerd werden zonder type specifier, beschouwd werden als Object variabelen.  Indien de declaratie ook een initialisatie bevatte, zou onder Option Infer On deze variabelen opeens van een meer strikt datatype kunnen zijn, wat uiteraard compilefouten kan opleveren.
Local type inference kan worden uitgeschakeld via Option Infer Off (op document of project niveau).

Local type inference kan worden toegepast op gewone lokale variabelen.  Het wordt bijvoorbeeld niet toegepast op parameters of velden van een klasse.

Volgende code wordt uitgevoerd onder Option Strict Off, Option Explicit Off en Option Infer On.

Probeer hier na te gaan wat het dynamische (at runtime) en statisch type (gekend door de compiler) is van de gebruikte variabelen.
Visual Basic 2012 Broncode - Codevoorbeeld 369
Option Explicit Off
Option Strict Off
Option Infer On
Class Example2
    Private Shared variable1
    Private Shared variable2 = "a"
    Public Shared Sub Main()
        variable1 = 1
        Dim variable3
        variable3 = 2S
        Dim variable4 = "b"c
        variable5 = "c"
        Dim variable6 = SomeFunction(variable4, variable5)
        Dim variable10 = 3UI
        'Stop
    End Sub
    Public Shared Function SomeFunction(ByVal variable7, _
                                        Optional ByVal variable8 = "d", _
                                        Optional ByVal variable9 = 4)
        SomeFunction = variable8
        'Stop
    End Function
End Class
Visual Studio : Door middel van bijvoorbeeld de debugtool "Locals" kan je nagaan welke het dynamische en statisch type is van de lokale variabelen.  Dit althans wanneer de omgeving zich in breakmodus bevindt.  Je kan naar breakmodus over gaan door een breakpoint te plaatsen of door een Stop statement op te nemen.
Het statische type van de variabelen 1, 2, 3, 5, 6, 7, 8 en 9 is steeds Object.  Enkel de variabelen 4 en 10 hebben respectievelijk de statische types Char en UInteger.

Het dynamisch type (at runtime) van de variabelen 1 en 9 is Integer, van 2, 5, 6 en 8 String, van 3 Short, van 4 en 7 Char en van 10 UInteger.

Je ziet hoe verwarrend code kan zijn bij Option Strict en Option Explicit op Off en Option Infer op On.  Deze ondermijnen deels het statisch getypeerde aspect van Visual Basic, en zorgen voor een verhoogd risico op bijvoorbeeld (un)boxing en late-bound objecten, met alle nadelen vandien.

Persoonlijk raad ik aan om zo veel mogelijk code onder Option Strict On, Option Explicit On en Option Infer Off te schrijven.
Local type inference kan bijna altijd vermeden worden, uitgezonderd in geval van anonymous types (zie verderop).

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.