|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
Vermijd impliciete conversie en dus het "per-ongeluk" bekomen van vreemde, onverwachte omzettingen ( die moeilijk te debuggen zijn indien foutief ) door Option Strict op On te zetten en dus enkel expliciet te kunnen converteren ( in geval van narrowing ). Waardoor men zich zeker bewust zal zijn van het bekomen van de vreemde of onverwachte omzettingen. 14.5.1. Expliciet ConverterenNaast het impliciet converteren, kunnen we dus ook expliciet converteren, waarbij we opgeven VAN welk datatype, NAAR welk datatype we wensen te converteren.
Expliciet converteren kan door een aantal shared functies uit de klasse System.Convert te gaan gebruiken. Deze functies hebben tal van overladen versies om argumentwaarden van zowat alle intrensic types aan te kunnen doorgeven. Visual Basic 2010 Broncode Option Explicit OnOption Strict OnModule Example1 Sub Main() Dim lngGetal As Long Dim dblGetal As Double = 34.5 Dim intGetal As Integer = 100 Dim bytGetal As Byte bytGetal = System.Convert.ToByte(dblGetal) Console.WriteLine(bytGetal) bytGetal = System.Convert.ToByte(intGetal) lngGetal = System.Convert.ToInt64(bytGetal) lngGetal = System.Convert.ToInt64(intGetal) Dim object1 As Object = Convert.ChangeType(123, TypeCode.Byte) Dim object2 As Object = _ Convert.ChangeType(-1, Convert.GetTypeCode( False)) Console.WriteLine(object2) Console.ReadLine() End SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 34
True (1) EXPLICIETE NARROWING CONVERSIES : excepties kunnen voorkomen
(2) EXPLICIETE WIDENING CONVERSIE : excepties zullen hier nooit voorkomen
Ook voor andere intrensic types bestaan conversie functies, bijvoorbeeld : - System.Convert.ToInt16(...) voor conversie naar Short - System.Convert.ToInt32(...) voor conversie naar Integer - System.Convert.ToSingle(...) voor conversie naar Single - System.Convert.ToDouble(...) voor conversie naar Double - System.Convert.ToBoolean(...) voor conversie naar Boolean - System.Convert.ToDateTime(...) voor conversie naar Date - System.Convert.ToChar(...) voor conversie naar Char - ...
(3) EXPLICIETE CONVERSIE RESULTEREND IN BOXING OPERATIE via Convert.ChangeType(...) : de waarden ( eerste argumentwaarde ) worden omgezet naar het opgegeven type ( 2e argumentwaarde, van enumeratietype System.TypeCode ) en zo geboxed in een Object variabele waarvan de referentie wordt opgeleverd
Convert.GetTypeCode(obj As Object) As TypeCode is een shared member die kan gebruikt worden om de TypeCode-enumeratie waarde van een bepaalde expressie te achterhalen.
Ook de expliciete conversies kunnen de "vreemde onverwachte" resultaten opleveren (4) ( zoals naartoe werd verwezen in vorig voorbeeld ). Maar doordat men hier expliciet converteert, is de kans op zen minst groter dat men zich bewust zal zijn van dit soort van omzetting. boven
14.5.2. Converteren naar StringHieronder zien we een voorbeeld hoe men expliciet naar het String-formaat kan converteren. Visual Basic 2010 Broncode Class Person Private m_Name As String Public Property Name() As String Get Name = m_Name End Get Set( ByVal value As String) m_Name = value End Set End Property Public Overrides Function ToString() As String Return Name End FunctionEnd ClassClass Example2 Public Shared Sub Main() Console.WriteLine(System.Convert.ToString(123)) Console.WriteLine((123).ToString()) Dim a As Integer = 123 Console.WriteLine(a.ToString()) Console.WriteLine(System.Convert.ToString(1234.5678)) Console.WriteLine((1234.5678).ToString()) Dim b As Double = 1234.5678 Console.WriteLine(b.ToString()) Console.WriteLine(System.Convert.ToString( True)) Console.WriteLine(( True).ToString()) Dim c As Boolean = True Console.WriteLine(c.ToString()) Console.WriteLine(System.Convert.ToString( "a"c)) Console.WriteLine(( "a"c).ToString()) Dim d As Char = "a"c Console.WriteLine(d.ToString()) Console.WriteLine(System.Convert.ToString(#3/20/2005#)) Console.WriteLine((#3/20/2005#).ToString()) Dim e As Date = #3/20/2005# Console.WriteLine(e.ToString()) Dim object1 As Object = 5 Console.WriteLine(System.Convert.ToString(object1)) Console.WriteLine(object1.ToString()) Dim object2 As Object = New System.Object Console.WriteLine(System.Convert.ToString(object2)) Console.WriteLine(object2.ToString()) Dim person1 As Person = New Person With {.Name = "John"} Console.WriteLine(System.Convert.ToString(person1)) Console.WriteLine(person1.ToString()) Dim object3 As Object Console.WriteLine(System.Convert.ToString(object3)) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 123
123
123
1234,5678
1234,5678
1234,5678
True
True
True
a
a
a
20/03/2005 0:00:00
20/03/2005 0:00:00
20/03/2005 0:00:00
5
5
System.Object
System.Object
John
John De System.Convert.ToString(...) method zet de opgegeven argumentwaarde om naar een tekstuele representatie, dit wordt gebaseerd op de ToString() implementatie van dat type zelf.
Zoals we reeds weten kunnen we ook zelf deze implementatie bepalen, door die implementatie te gaan overschrijven, zoals in bovenstaand voorbeeld is gebeurt voor het Person type.
Bij Convert.ToString(...) zullen nooit runtimefouten optreden. Elk type beschikt immers over een ToString() implementatie, minimaal is deze implementatie overgeërfd van het System.Object-basistype.
Zelfs al wordt aan de Convert.ToString(...) functie Nothing doorgegeven dan nog zal geen exceptie optreden. Vooraleer de ToString() implementatie van het doorgegeven argument wordt aangeroepen zal hierop een controle gebeuren.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|