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

35.5. Array Type Inference op basis van Return Type

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.

35.5.1. Type Inference bij Array Initializers

In Visual Basic 2010 (10.0) was het reeds mogelijk om door middel van local type inference (Option Infer On (1)) het datatype van array initializers af te leiden.

Zo kan de compiler in volgend voorbeeld op basis van het statisch type van de opgesomde waardes in deze initializers afleiden dat array1 een Integer() en array2 een String() is:
Visual Basic 2012 Broncode - Codevoorbeeld 851
Option Strict Off
Option Infer On                                                           ' (1)
Class ArrayTypeInferenceExample
    Public Shared Sub Main()
        Dim array1 = {1, 2, 3} 'or: New Integer() {1, 2, 3}
        Console.WriteLine(array1.GetType().Name)
        '
        Dim array2 = {"one", "two", "three"}
        Console.WriteLine(array2.GetType().Name)
        '
        Dim array3 = {}                                                   ' (2)
        Console.WriteLine(array3.GetType().Name)
        '
        Dim array4
        'Console.WriteLine(array4.GetType().Name) 'NullReferenceException
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Int32[]
String[]
Object[]
Array initializers kunnen ook leeg zijn (2), zoiets kan handig zijn omdat we dan toch reeds over een array instantie beschikken.  Deze array bevat geen element en heeft lengte nul maar bestaat wel.  Dat in tegenstelling tot array4 bijvoorbeeld die nog niet wijst naar een instantie van een array.

Zo zou je in volgend voorbeeld de controle op regel (1) kunnen vermijden:
Visual Basic 2012 Broncode - Codevoorbeeld 852
Namespace WithoutArrayInitializer
    Class Names
        Private _Items As String()
        Public ReadOnly Property Count As Integer
            Get
                If _Items IsNot Nothing Then Count = _Items.Length ' (1)
            End Get
        End Property
        Public Sub Add(name As String)
            ReDim Preserve _Items(Count)
            _Items(Count - 1) = name
        End Sub
    End Class
End Namespace
Door toch reeds een array instantie te creëren:
Visual Basic 2012 Broncode - Codevoorbeeld 853
Namespace WithArrayInitializer
    Class Names
        Private _Items As String() = {}                            ' (1)
        Public ReadOnly Property Count As Integer
            Get
                Count = _Items.Length                              ' (1)
            End Get
        End Property
        Public Sub Add(name As String)
            ReDim Preserve _Items(Count)
            _Items(Count - 1) = name
        End Sub
    End Class
End Namespace
Op zich kan je ook een lege (lengte nul) array instantie aanmaken door bij de declaratie een upperbound kleiner dan nul op te geven:
Private _Items(-1) As String
Los van het nut van de lege array initializers wil ik het hier hebben over de type inference die daarop van toepassing is.

35.5.2. Array Type Inference op basis van Return Type

In voorbeeld ArrayTypeInferenceExample merken we hoe array3 van type Object() is.  De compiler kan immers moeilijk anders veronderstellen, want er worden geen waarden opgesomd om het elementtype van af te leiden.  Object() is dan ook een logische keuze.

Bij bepaalde implementaties kan dit vervelend zijn.  Zo zal volgend voorbeeld tot en met Visual Basic 2010 (10.0) een compilefout opleveren (1):
Visual Basic 2012 Broncode - Codevoorbeeld 854
Class ArrayTypeInferenceReturnTypeExample
    Public Shared Sub Main()
        Console.WriteLine(GetSomething(0).GetType().Name)
        '
        Console.ReadLine()
    End Sub
    Public Shared Function GetSomething(count As Integer) As Integer()
        If count <= 0 Then
            Return {}                                                     ' (1)
        Else
            'Return Something
        End If
    End Function
End Class
Onder permissive type semantics (Option Strict Off) krijgen we volgende compilefout (1):
Value of type 1-dimensional array of Object cannot be converted to 1-dimensional array of Integer because Object is not derived from Integer.
Dergelijke fout is nog relatief eenvoudig op te lossen, maar we hadden liever gehad dat de compiler het datatype van de te creëren array instantie ging afleiden van het return type van de functie.

Dit is nu net de aanpassing die men in Visual Basic 2012, ook wel Visual Basic 11 (of 11.0) genoemd, heeft aangebracht.  In een Return statement, of net zo goed bij een toekenning aan de functienaam, waar de operand een array literal is, zal het datatype van de array niet gebaseerd worden op de array literal maar op het return type in de functie signatuur.

In Visual Basic 2012 krijgen we dan ook volgende output:
Console Application Output
Int32[]

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