|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Class PersonEnd ClassClass Student : Inherits PersonEnd ClassClass Teacher : Inherits PersonEnd ClassClass Example1 Public Shared Sub Main() Dim person1 As Person = New Student Dim teacher1 As Teacher = DirectCast(person1, Teacher) End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode Class Example3 Public Shared Sub Main() Dim teacher1 As Teacher = New Teacher End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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) Next Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output type : Person
Person
type : Student
Student
type : Teacher
Teacher 14.7.1. GetType MethodOok 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. boven
14.7.2. TryCastTryCast wordt op dezelfde manier gebruikt als DirectCast, maar zal nooit exceptions opleveren. Indien de casting niet mogelijk is levert TryCast Nothing op. Visual Basic 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Student : John
Nothing TryCast is enkel bruikbaar op referencetypes ( zoals klassen en interfaces ).
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|