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...