» Publishers, Monetize your RSS feeds with FeedShow: More infos (Show/Hide Ads)
In diesem Artikel werden VB Funktionen wie CType, DirectCast, CInt, CStr, ... betrachtet.
Ist Option Strict aktiviert, fordert der Visual Basic Compiler, dass man beim Zugriff auf Funktionen und Eigenschaften eines Objekts den Datentyp angibt.
1 Dim person1 As Person 2 person1 = New Person 3 Console.WriteLine(person1.Name) ' funktioniert 4 Dim person2 As Object 5 person2 = New Person 6 Console.WriteLine(person2.Name) ' Compilerfehler, da Name keine Eigenschaft von Object ist.
In diesem Beispiel müsste man zuerst das Objekt person2 in den Typ Person casten.
Was ist ein Cast?
Bei einem Cast eines Objekts o in den Typ T, teilt man dem Compiler mit, dass er das Objekt o nun als eine Instanz des Typs T betrachten soll.
1 Dim o As Object 2 o = New Person 3 ' o ist vom Typ Person, also kann man dies dem Compiler mitteilen 4 Dim p As Person 5 p = DirectCast(o, Person)
Hier wurde dem Compiler mitgeteilt, das Objekt o als Instanz des Typs Person zu betrachten. Nun kann man auf die Eigenschaften und Funktionen, die Person bereitstellt, zugreifen.
Beim Casten bleiben die zugrundeliegenden Daten unverändert, man ändert nur die "Sichtweise".
VBs DirectCast ist ein "pures" Casting, es findet also keine Umwandlung statt, und damit ist es equivalent mit dem C# Cast.
Dim p As Person = DirectCast(o, Person)
1 Person p = (Person)o;
Was ist eine Conversion?
Unter VB steht neben DirectCast noch das Schlüsselwort CType zur Verfügung. Dieses Schlüsselwort kann neben "purem" Casting auch noch Conversions also Umwandlungen durchführen.
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = CType(o, Integer)
In diesem Beispiel wird der Variable o der Wert "12" zugewiesen, somit ist sie vom Typ String. Eine Umwandlung mit DirectCast zum Typ Integer würde einen Fehler erzeugen, da der zugrundeliegende Datentyp nicht Integer sonder String ist und somit noch eine Umwandlung erforderlich wäre.
CType wandelt also die zugrundeliegenden Daten (hier vom Typ String in Integer).
Alternativ zu CType stellt Visual Basic noch spezielle Konvertierungsschlüsselwörter wie CStr, CInt, CDbl, CDate, etc. (Im Folgenden C* genannt) zur Verfügung, die für die Umwandlung in die entsprechenden Datentypen zur Verfügung stehen. Diese sind kürzer als die CType Notation und sparen somit Tipparbeit.
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = CInt(o)
Beim Umwandeln von primitiven Datentypen wie Strings, Integers, etc. werden sowohl CType als auch C* vom Compiler in Aufrufe von Microsoft.VisualBasic.Conversion umgewandelt.
Ein Aufruf von CType(o, String) bzw. CStr wird vom Compiler in Microsoft.VisualBasic.Conversions.Str(o) umgewandelt.
Neben den VB Spezifischen Umwandlungen stellt das .NET Framework mit der Convert Klasse eine für alle .NET Sprachen einheitliche Möglichkeit zur Verfügung Daten umzuwandeln.
1 Dim o As Object 2 o = "12" 3 Dim i As Integer 4 i = Convert.ToInt32(o)
Performancebetrachtung
Die Visual Studio Intellisense empfiehlt stets eine Umwandlung mittels CType oder C* ist dann DirectCast vollkommen unnötig?
Hier gilt es zwei Fälle zu unterschieden:
- Typen, die nicht IConvertible implementieren (idR. Refrenztypen: Controls, Forms, selbst definierte Klassen, Interfaces, etc.)
In Beispiel 1 wurde eine Variable vom Typ Object, die eine Instanz des Person Typs enthält, gecastet. Da es sich hier um einen Referenz handelt und keine Konvertierung möglich ist, wird CType vom Compiler als DirectCast übersetzt. Es macht hier also keinen Unterschied CType oder DirectCast zu nehmen. - Typen, die IConvertible implementieren (idR. Datentypen: Integer, Double, Date, ... aber auch String)
Hier macht es einen deutlichen Unterschied ob man CType, C*, DirectCast oder Convert verwendet.
Um Aussage etwas mit Zahlen zu unterlegen habe ich einen kleinen Benchmark geschrieben, der die Dauer in Millisekunden angibt, die es auf meinem System benötigt hat die gewünschte Operation 100.000.000 mal durchzuführen.
Für mich ergibt sich daraus
- Wann immer möglich DirectCast verwenden, da es bis zu 10 mal schneller ist als CType.
- Ist eine Umwandlung des zugrundeliegenden Werts notwendig, dann zeigen die Methoden der .NET Convert Klasse deutlich bessere Performance als die Conversion Methoden von Visual Basic, weshalb man CInt(o), etc. durch Convert.ToInt32(o), etc. ersetzten sollte.
Ausnahme bilden hier CStr und CDate, die nicht in VisualBasic.Conversion vertreten sind, sondern direkt Methoden des Frameworks aufrufen. - Stellen die Datentypen also eigene Umwandlungsmethoden zur Verfügung wie Integer.Parse bzw. Object.ToString, dann sind diese zu empfehlen.
Ergebnis
Dieser Artikel hat gezeigt, dass die Empfehlung der Visual Studio Intellisense bequem ist und Schreibarbeit spart, jedoch auch Performanceeinbußen mit sich bringt. Der tatsächliche Verlust ist zwar von Anwendung zu Anwendung verschieden aber in einigen Fallen macht er sich sogar mit Faktor 10 bemerkbar.
Schade ist, dass die Implementierung der Visual Basic Conversion doch deutlich langsamer ist als die des .NET Frameworks. Grund dafür ist wahrscheinlich die Abwärtskompatibilität zu VB6 ...
Ich werde mich in Zukunft an DirectCast und Convert halten, was auch den Vorteil hat, dass C#-ler meinen Code leichter lesen können.
Source Code
Den verwendeten Source Code habe ich in diesem Beispielprojekt zusammengefasst.
Vielleicht hat man sich diese Frage schon ein oder zweimal gestellt. Nun haben Microsoft Mitarbeiter ein Video veröffentlicht, um einen Einblick in ihr Leben bei Microsoft zu geben.
Video: Life At Microsoft - The Truth Revealed
Wer bereits etwas mit WPF gearbeitet hat kennt vielleicht das XAML Pad. Ein sehr schlankes Tool, das einem erlaubt, Xaml Code zu schreiben und das Ergebnis in einem "Split View" sofort angezeigt zu bekommen.
Xaml Pad ist zwar sehr partisch aber vom Fuktionsumfang doch etwas begrenzt. Doch jetzt gibt es eine Abhilfe namens Kaxaml.
Das Tool bietet eine ganze Reihe von Features wie
- IntelliSense
- Syntax Highlighting
- Split View (Xaml, Preview)
- Mehrere Dokumente in Tabs
- Einen Color Picker
- Snippets
- Plugin System
- uvm.
Ein must-have für jeden WPF Entwickler!
Kaxaml Webseite
http://www.kaxaml.com/
Visual Studio 2008 bringt viele Neuerungen mit sich, darunter auch neue Features, um die Entwicklungsumgebung zu erweitern.
Ein hervorragendes Beispiel ist das AddOn Studio for World of Warcraft, das auf der Visual Studio Shell, also dem Grundgerüst von Visual Studio basiert, und eine Umgebung für die Erstellung von World of Warcraft Addons zur Verfügung stellt.
Zum Weiterlesen
Visual Studio Shell
http://msdn.com/vsx/
AddOn Studio for World of Warcraft
http://www.codeplex.com/WarcraftAddOnStudio
Wie versprochen, stelle ich hier die Slides und die Beispiele meines Vortrags vom 12.02. online.
Powerpoint Slides
Download (pdf)
Beispiel Visual Studio IDE
Download (zip)
Beispiel Windows Forms
Download (zip)
Beispiel Web Forms
Download (zip)
Themenvorschläge für weitere Vorträge sind willkommen.
Ressourcen
Visual Studio Express Editions
http://www.microsoft.com/germany/express/
XNA Game Studio
http://creators.xna.com/Education/GettingStarted.aspx








