Thursday, April 07, 2005 5:40 AM
UweInside
My, ist das geil!
Ja my! Mystens gibt es ja Diskussionen zwischen VB.NETlern und C#-Anhängern, welches denn jetzt die bessere Programmiersprache ist. Die offizielle Aussage von Mycrosoft war ja immer: Beide sind gleichgut. Myne Mynung zu diesem Thema ist ja hinlänglich bekannt und wird jetzt noch durch das neue, geile My-Template untermauert. Das gibt's nämlich nur für VB.NET!
Genug gekalauert. Das My-Template bietet eine Abkürzung zu den meisten, täglich anfallenden Aufgaben bei der Programmierung. Beispiel gefällig?
Aus:
Dim File As New System.IO.StreamReader("c:\test.txt")
Dim Words As String = File.ReadToEnd()
File.Close()
Wird:
Dim Words As String = _
My.Computer.FileSystem.ReadAllText("c:\test.txt")
Gut, was? Folgendes war schon immer üble Steinzeit:
Private Declare Auto Function PlaySound Lib "winmm.dll" _
(ByVal lpszSoundName As String, ByVal hModule As Integer, _
ByVal dwFlags As Integer) As Integer
Private Const SND_FILENAME As Integer = &H20000
Dim bAns As Boolean, iRet As Integer = 0
Try
iRet = PlaySound("C:\sound.wav", 0, SND_FILENAME)
Catch
End Try
Dieser wunderschöne Code wird jetzt aufgeräumt zu:
My.Computer.Audio.Play ("C:\sound.wav")
Im My-Namespace finden sich sieben sogenannte Rootobjekte, die jewils selbstbeschreibend Zugriff auf bestimmte Funktionalitäten und Tools geben:
- My.Application liefert Infos über das aktuell laufende Programm: Applikationstitel, -version, -beschreibung, Logfiles uvm.
- My.Computer bietet Zugriff auf Ressourcen des Rechners: Registry, Audio, Dateisystem, serielle Schnittstellen, usw.
- My.User informiert über den aktuell angemeldeten Besitzer (Name, Domain, Gruppen etc.)
- My.Ressources erlaubt den Zugriff auf alle eingebetteten Ressourcen - mit Intellisense anstatt dem RessourceManager aus der Hölle
- My.Settings macht das abspeichern von Benutzer- und Applikationseinstellungen zum Kinderspiel
- My.Webservices und My.Forms bieten per Intellisense blitzschnellen Zugriff auf alle im Projekt definierten Webservices bzw. Fensterklassen.
Aber das kann man natürlich woanders nachlesen. Mein Tip: Das My-Objekt läßt sich auch prima erweitern. Das betrifft sowohl die Erweiterung der Rootobjekte selbst als auch das Hinzufügen neuer Rootobjekte.
Ein Beispiel: Firma VB-Trans, eine Spedition, muß sehr viele Programme schreiben, die einen an den Computer angeschlossenen Barcodescanner benutzen. Kann man das My.Computer-Objekt, das ja Zugriff auf solche Dinge wie Schnittstellen und Geräte bietet, um Barcodescanner-Funktionen erweitern, die dann über My.Computer.Barcode ansprechbar sind? Ja man kann. Und so geht's:
Namespace My
Public Class BarcodeReader
Public Function Scan() As String
Return "Ein toller Barcode"
End Function
End Class
Partial Class MyComputer
Private _BarcodeReader As BarcodeReader
Public ReadOnly Property BarCodeReader() As BarcodeReader
Get
If _BarcodeReader Is Nothing Then
_BarcodeReader = New BarcodeReader
End If
Return _BarcodeReader
End Get
End Property
End Class
End Namespace
Hier ist bemerkenswert, daß nicht die Klasse Computer im Namespace My erweitert wird, sondern (aufpassen!) die Klasse MyComputer im Namespace My. Trotzdem wird die Funktion Scan nachher über
My.Computer.BarcodeReader.Scan()
angesprochen? Wie kann das sein? Ganz einfach: Der VB.NET-Compiler übersetzt die Aufrufe entsprechend: In Wirklichkeit ist Computer eine nämlich öffentliche Eigenschaft der MyComputer-Klasse - dies verheimlicht uns VB.NET durch fiese Tricks aber vollständig. Mit ildasm kommt man dem Spuk aber auf die Schliche.
Das Erweitern der MyComputer-Klasse ist aber durch die neuen partiellen Klassen sehr einfach: Unsere eigene Barcode-Funktionalität wird beim Kompilieren mit der "eingebauten" MyComputer-Klasse zusammengefügt und in eine einzige kompilierte Klasse gepackt.
Analog funktioniert das Erstellen eigener Rootobjekte. Als alter Philosoph wünschte ich mir, jeden Tag einen neuen Sinnspruch beim Start meiner Applikation anzeigen zu können - Zeit für ein My.ThoughtOfTheDay-Objekt. Kein Problem. Einfach eine Bibliothek zur Philosophiegenerierung (PhilosophyLib) samt Funktion GetDeepTought() geschrieben und folgendermaßen als Rootobjekt in den My-Namespace integriert:
Imports PhilosophyLib
Namespace My
Friend Module My_ThoughtOfTheDay
Private _ThoughtOfTheDay As ThoughtOfTheDay
Public ReadOnly Property ThoughtOfTheDay() As ThoughtOfTheDay
Get
If _ThoughtOfTheDay Is Nothing Then _ThoughtOfTheDay = New ThoughtOfTheDay
Return _ThoughtOfTheDay
End Get
End Property
End Module
End Namespace
So entsteht ein neues Rootobjekt:
My.ThoughtOfTheDay.GetDeepTought()
Ich habe zu beiden Vorgehensweisen zwei kleine Beispielprojekte gestrickt, die hier zu finden sind. Da diese Projekte jedoch mit einem Microsoft-internen Build der Beta 2 von VB.NET Express erstellt wurden können My-Fans (bzw. my fans :-) das Ganze erst ausprobieren, wenn demnächst endlich die finale, öffentliche Beta 2 erscheint. Bis dahin kann man die Beispiele natürlich mit einem handelsüblichen Texteditor betrachten und sich in Vorfreude üben - ist ja bekannlich die schönste Freude (meines Erachtens ist dieses Sprichwort Schwachsinn. Ich will alles, und zwar jetzt. Aber das gehört ja nicht zum Thema.)
Viel Spaß also mit dem My-Template und selbstgebastelten Funktionen wie My.Computer.Needs.More.Memory etc...