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.8. Voorwaardelijk Casten - TypeOf, GetType en TryCast

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.

Het gebruik van DirectCast zal een compileerfout geven indien men probeert te casten tussen twee types waartussen geen inheritance (of implementation) relatie heerst.  In dergelijke gevallen kan men dus nooit een foutief programma bekomen.

Wanneer men echter probeert te casten naar een foutief type - weliswaar binnen de inheritanceketen - zal er een InvalidCastException runtimefout optreden.
Visual Basic 2012 Broncode - Codevoorbeeld 382
Class Person
End Class
Class Student : Inherits Person
End Class
Class Teacher : Inherits Person
End Class
Class Example1
    Public Shared Sub Main()
        Dim person1 As Person = New Student
        Dim teacher1 As Teacher = DirectCast(person1, Teacher) ' runtime error
    End Sub
End Class
De runtimefout die hierbij optreedt bevat de vermelding : "Unable to cast object of type Student to type Teacher.".  Het dynamisch type van person1 is immers Student en niet Teacher.

Bovenstaande Client gaat dus onvoorwaardelijk casten.
In een "weakly typed" programmeertaal (een taal waar er at runtime nog typefouten kunnen optreden) zoals Visual Basic (maar ook zoals alle voor de hand liggende OOPs) gaat men beter voorwaardelijk casten.
Visual Basic 2012 Broncode - Codevoorbeeld 383
Class Example2
    Public Shared Sub Main()
        Dim person1 As Person = New Student
        Dim teacher1 As Teacher
        If TypeOf person1 Is Teacher Then
            teacher1 = DirectCast(person1, Teacher)
        Else
            Console.WriteLine("No Teacher.")
        End If
    End Sub
End Class
Console Application Output
No Teacher.
De TypeOf operator kan gebruikt worden om het dynamisch type van een expressie na te gaan, en dat op volgende wijze : TypeOf <expression> Is <typename>.
Visual Basic 2012 Broncode - Codevoorbeeld 384
Class Example3
    Public Shared Sub Main()
        Dim teacher1 As Teacher = New Teacher
        'Dim student1 As Student = DirectCast(teacher1, Student)           ' (1)
        'If TypeOf teacher1 Is Student Then                                ' (2)
        '    ' ...
        'End If
    End Sub
End Class
Bij DirectCast treedt meteen een compileerfout op wanneer je probeert een expressie te casten naar een type dat zich niet boven of onder het te-casten type bevindt in de inheritanceketen (1).  Logisch want dit is onzinnig om te proberen casten.

Ook bij TypeOf zal er meteen een compileerfout optreden indien je probeert na te gaan of het te-controleren type van een type is dat zich niet boven of onder het te-controleren type bevindt in de inheritanceketen bevindt (2).
Ook dit is logisch want ook dit blijft onzinnig om na te gaan.
Visual Basic 2012 Broncode - Codevoorbeeld 385
Class Example4
    Public Shared Sub Main()
        Dim persons As Person() = New Person() {New Person, _
                                                New Student, _
                                                New Teacher}
        For Each person As Person In persons
            If TypeOf person Is Student Then
                Console.WriteLine("type : Student")
            ElseIf TypeOf person Is Teacher Then
                Console.WriteLine("type : Teacher")
            Else
                Console.WriteLine("type : Person")
            End If
            Console.WriteLine(person.GetType().Name)                      ' (3)
        Next
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
type : Person
Person
type : Student
Student
type : Teacher
Teacher

14.8.1. GetType Method

Ook de GetType() method wordt in bovenstaand voorbeeld gedemonstreerd (3).
Deze method is gedefinieerd in het System.Object type en wordt van deze overgeërfd in alle andere types.  Deze method levert een System.Type object op dat een abstractie vormt voor het dynamisch type van de expressie waarop deze method wordt gebruikt.  De Name property van een System.Type object levert in String vorm de identifier van het geabstraheerde type op.

Zowel de TypeOf operator als de GetType() method zijn vormen van reflection.  Reflection is het inspecteren van types (van objecten), dit kan zowel statisch als dynamische informatie opleveren.

14.8.2. TryCast

Functie TryCast wordt op dezelfde manier gebruikt als DirectCast, maar zal nooit exceptions opleveren.  Indien de casting niet mogelijk is levert TryCast Nothing op.
Visual Basic 2012 Broncode - Codevoorbeeld 386
Class Example5
    Public Shared Sub Main()
        Dim person1 As Person = New Student With {.Name = "John"}
        Dim student1 As Student = TryCast(person1, Student)
        If student1 IsNot Nothing Then
            Console.WriteLine("Student : " & student1.Name)
        Else
            Console.WriteLine("Nothing")
        End If
        '
        Dim person2 As Person = New Teacher
        Dim student2 As Student = TryCast(person2, Student)
        If student2 IsNot Nothing Then
            Console.WriteLine("Student : " & student1.Name)
        Else
            Console.WriteLine("Nothing")
        End If
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Student : John
Nothing
Functie TryCast is enkel bruikbaar op referencetypes (zoals klassen en interfaces).

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