Share via


Die "My"-Funktion in Visual Basic 2005

Veröffentlicht: 12. Sep 2004 | Aktualisiert: 14. Nov 2004

Von

Dieser Artikel vermittelt eine Übersicht darüber, wie die My-Funktion .NET Framework-Funktionen zur Verfügung stellt, einschließlich verfügbarer Klassen, dynamisch erstellter Klassen und Threading.

Downloaden Sie die Beispieldatei "MyInternals.msi" (in Englisch).

Hinweis Dieser Artikel und der Beispielcode basieren auf einer Vorabversion von Microsoft Visual Studio 2005, früherer Codename: "Whidbey". Für alle in diesem Artikel enthaltenen Informationen sind Änderungen vorbehalten. Für das Beispielprojekt ist Visual Studio 2005, Beta 1, oder höher erforderlich.

Auf dieser Seite

 Einführung
 .NET Framework-Klassen, die über "My" verfügbar sind
 Dynamisch erstellte Klassen
 Threading
 Schlussfolgerung

Einführung

My ist eine neue Funktion in Visual Basic 2005, mit der Sie häufig verwendete Funktionen sofort zur Verfügung haben und weniger Code schreiben müssen. My erledigt diese Aufgabe effizient, stabil und threadsicher. In einem Arbeitsumfeld, in dem die Entwicklerproduktivität wichtiger ist als je zuvor, kann My Sie dabei unterstützen, Ihre Aufgaben schneller zu bewältigen, ein Hauptanliegen von Visual Basic.

In diesem Artikel wird untersucht, wie My Zugriff auf .NET Framework-Funktionen und Projektelemente zur Verfügung stellt.

 

.NET Framework-Klassen, die über "My" verfügbar sind

Aufgrund des Umfangs von .NET Framework kann es zu einer entmutigenden Aufgabe werden, die Funktion zu finden, die Sie benötigen. Zur Lösung dieses Problems bietet My Einstiegspunkte für häufig verwendete .NET Framework-Klassen und Funktionen. My stellt auch neue, hoch entwickelte .NET Framework-Klassen bereit, die verwandte Funktionen in aufgabenbasierten APIs zusammenfassen.

My stellt Funktionen auf drei Arten bereit: durch Zurückgeben einer instanziierten, fertigen .NET Framework-Klasse, durch das Weiterleiten eines Aufrufs an eine .NET Framework-Methode oder durch Zurückgeben einer dynamisch erstellten Klasse, die Zugriff auf Elemente im Projekt bietet.

Direkte Bereitstellung
Wann immer es möglich ist, dient My als Erkennungsmechanismus für bestehende .NET Framework-Klassen und stellt die Typen direkt bereit. Betrachten Sie als Beispiel My.Application.Deployment:

Public ReadOnly Property Deployment() As _ 
 System.Deployment.ApplicationDeployment 
  Get 
   Return _ 
   System.Deployment.ApplicationDeployment.CurrentDeployment 
  End Get 
 End Property

Weitere Beispiele für direkte Bereitstellung sind My.Computer.FileSystem.OpenTextFileReader(), die System.IO.StreamReader zurückgibt, My.Application.OpenForms(), die System.Windows.Forms.FormsCollection zurückgibt und My.User, die System.Security.Principal.IPrincipal zurückgibt.

Fassade
My gibt auch neue Klassen zurück, die aufgabenbasierte APIs für Vorgänge bereitstellen, die früher schwierig waren. Die Funktionen waren schwer zu finden, und/oder es mussten mehrere Objekte koordiniert werden, um das gewünschte Ziel zu erreichen.

Häufige Aufgaben, für die Low-level-APIs von .NET Framework oder mehrere Zeilen Code erforderlich wären, werden erheblich einfacher. Betrachten Sie als Beispiel den folgenden Code, mit dem ermittelt wird, ob eine Netzwerkverbindung verfügbar ist:

Imports System.Net.NetworkInformation 
Public ReadOnly Property IsAvailable() As Boolean 
 Get 
  For Each NetInterface As NetworkInterface In _ 
NetworkInterface.GetAllNetworkInterfaces() 
   If NetInterface.Type <> InterfaceType.Loopback _ 
   AndAlso NetInterface.Type <> InterfaceType.Tunnel _ 
   AndAlso NetInterface.OperationalStatus = _ 
     OperationalStatus.Up Then 
     Return True 
   End If 
  Next 
  Return False 
 End Get 
End Property

Für den oben dargestellten Code sind genaue Kenntnisse über mehrere Typen im System.Net.NetworkInformation-Namespace erforderlich. Mithilfe des Fassadenmusters fasst My.Computer.Network die Typen und ihre Beziehungen in einer einzigen Codezeile zusammen: My.Computer.Network.IsAvailable().

Eine Fassade kann auch einfach verwandte Funktionen zusammenstellen, die andernfalls schwer zu finden sind. My.Computer aggregiert beispielsweise Eigenschaften verschiedener Klassen, um den Computernamen und den Zugriff auf den Bildschirm bereitzustellen:

Public ReadOnly Property Name() As String 
 Get 
  Return System.Environment.MachineName 
 End Get 
End Property 
Public ReadOnly Property Screen() As System.Windows.Forms.Screen 
 Get 
  Return System.Windows.Forms.Screen.PrimaryScreen 
 End Get 
End Property

Weitere Beispiele für die Klassen in My, die verwandte Funktionen mehrerer .NET Framework-Typen aggregieren, sind My.Application, My.Computer, My.Computer.FileSystem, My.Computer.Info und My.Application.Info.

Proxyklassen
Eine Proxyklasse ist eine sehr einfach aufgebaute Klasse, die alle an sie gerichteten Aufrufe an ein darunter liegendes Objekt weiterleitet. Wenn Sie zum Beispiel My.Computer.Clipboard.GetText() aufrufen, rufen Sie die Proxyklassenmethode ClipboardProxy.GetText() auf, die wie folgt definiert ist:

Public Function GetText() As String 
 Return Clipboard.GetText() 
End Function

Der Konvention folgend wird an Proxyklassen immer Proxy angehängt. My verwendet Proxys beim Zugriff auf die Zwischenablage, das Dateisystem und die Registrierung, da die zugrunde liegenden Klassen, die durch die Proxys bereitgestellt werden, aus freigegebenen Methoden bestehen, die andernfalls in IntelliSense nicht angezeigt werden. Proxyklassen können nicht vom Benutzer instanziiert werden. Leistungstests zeigen, dass das Weiterleiten von Aufrufen über Proxys nur unbedeutende Auswirkungen hat.

 

Dynamisch erstellte Klassen

My bietet Ihnen direkten Zugriff auf Formulare, Webdienste, Ressourcen und Einstellungen, die im Projekt definiert sind. Wenn Ihr Projekt beispielsweise einen Verweis auf den Webdienst MapDirections enthält, können Sie diesen Webdienst sofort verwenden, ohne dass Sie wissen müssen, wie Sie eine Instanz vom Webdienstproxy starten. Sie können einfach Folgendes eingeben: My.WebServices.MapDirections.GetDirections(...)

Wie funktioniert das? Für die Formulare, Webdienste, Einstellungen und Ressourcen im Projekt wird durch den Compiler eine Factoryklasse erstellt, die die erzeugten Instanzen bei Bedarf zurückgibt. Die Factoryklassen werden optimiert, um Instanzen passend für den Projekttyp (EXE/DLL/WEB) zurückzugeben, in dem der Code ausgeführt wird. Weitere Informationen hierzu finden Sie in diesem Artikel im Abschnitt "Threading".

"My.Forms"
My.Forms ist ein Beispiel für eine dynamisch erstellte Klasse. Diese Klasse wird für Sie bereitgestellt und definiert eine Factorymethode für jedes Formular in Ihrem Projekt. Wenn Sie über My.Forms.Form1 auf Form zugreifen, prüft die Factorymethode, ob bereits eine Instanz von Form1 geöffnet ist. Wenn dies der Fall ist, wird diese Instanz zurückgegeben. Andernfalls wird eine Instanz von Form1 erstellt und zurückgegeben. Der erzeugte Code für ein Projekt, das Form1 enthält, würde wie folgt aussehen:

Class MyForms 
    'Code in bold is generated by the compiler
    Public m_Form1 As Form1
    Public Property Form1() As Form1
        Get
            m_Form1 = Create__Instance__ (Of Form1)(m_Form1) 
            Return m_Form1 
        End Get
        Set(ByVal Value As Form1)
         If Value Is m_Form1
        Return
           End If
           If Not Value Is Nothing Then
              Throw New ArgumentException( _
  "Property can only be set to Nothing.")
           End If
           Dispose__Instance__ (Of Form1)(m_Form1)
        End Set
    End Property
End Class

Die Create__Instance__()-Funktion hat die Aufgabe, bei Bedarf eine Instanz des Formulars zu erstellen. Die Funktion prüft, ob das Formular (in m_Form1 gespeichert) instanziiert wurde oder nicht. Wenn bereits eine Instanz erstellt wurde, wird diese zurückgegeben. Andernfalls wird eine Instanz erstellt und zurückgegeben. Create__Instance__() fängt auch rekursive Formularerstellungsversuche ab. Dispose__Instance__() ist für das Schließen des Formulars verantwortlich.

My.Forms bietet auch die Möglichkeit, für Formulare wieder Standardinstanzen einzuführen, die Sie möglicherweise von früheren Visual Basic-Versionen kennen. Mithilfe von Standardinstanzen können Sie auf eine Formularinstanz verweisen, ohne diese zuvor ausdrücklich erstellen zu müssen.

In Visual Basic 6.0 hätten Sie zum Beispiel Form1.Show() geschrieben, anstelle von folgendem Code:

Dim Form1Instance as Form1 
Form1Instance = new Form1 
Form1Instance.Show()

Da der Compiler in Visual Basic 2005 My.Forms zum Erstellen von Standardinstanzen verwendet, können Sie einfach Form1.Show() schreiben.

"My.WebServices"
Für viele ist es schwierig, beim Codieren für einen Webdienst zu ermitteln, für welche Klasse der Code geschrieben wird. My.WebServices erspart die Vermutungen und stellt bei Bedarf eine Instanz des Webdienstproxys bereit.

My.WebServices ist besonders für synchrone Webdienstaufrufe geeignet. Der Code zum Bereitstellen von Instanzen von Webdienstproxys folgt dem gleichen Muster, das eben für das Zurückgeben von Formularinstanzen gezeigt wurde.

"My.Settings"
Neu in Visual Basic 2005 ist der Settings-Designer, mit dem Sie Anwendungseinstellungen auf Anwendungsbasis oder für einzelne Benutzer angeben können. Der Designer erstellt eine Klasse, die stark typisierten Zugriff auf Ihre Einstellungen bereitstellt. Das Beispielprojekt enthält ein Beispiel der Klasse MySettings. Um diese anzuzeigen, zeigen Sie alle Dateien im Projektmappen-Explorer an. Unter dem Knoten MySettings.Settings finden Sie die Datei MySettings.vb.

Der folgende Code ist ein Beispiel für eine Eigenschaft, die zum Verwalten einer Anwendungseinstellung mit dem Namen SampleUserSetting erstellt wurde:

Partial NotInheritable Class MySettings 
Inherits System.Configuration.ApplicationSettingsBase 
 <System.Diagnostics.DebuggerNonUserCode(),  _ 
  System.Configuration.UserScopedSettingAttribute(),  _ 
  System.Configuration.DefaultSettingValueAttribute("Try Me")>  _ 
 Public Property SampleUserSetting() As String 
  Get 
   Return CType(Me("SampleUserSetting"),String) 
  End Get 
  Set 
   Me("SampleUserSetting") = value 
  End Set 
 End Property 
End Class

Die erstellte Klasse übernimmt den Großteil der Arbeit für Sie. Um auf die Einstellung zuzugreifen, müssen Sie lediglich Folgendes schreiben:

My.Settings.SampleUserSetting

"My.Resources"
Mit dem Resource-Designer, ebenfalls neu in Visual Basic 2005, können Sie Ihrer Anwendung Ressourcen hinzufügen. Dieser Designer erstellt ebenfalls ein Modul, das stark typisierten Zugriff auf die Ressourcen in der Anwendung zur Verfügung stellt. Wenn Sie dem Projekt beispielsweise eine Grafik namens Smiley hinzufügen, können Sie auf diese Grafik mit My.Resources.Smiley zugreifen. Um ein Beispiel des erstellten Ressourcenmoduls zu betrachten, zeigen Sie alle Dateien im Projektmappen-Explorer an. Unter dem Knoten MyResources.resx finden Sie die Datei MyResources.vb.

Der folgende Code aus dem Beispielprojekt zeigt eine Factory-Eigenschaft, die erstellt wird, um die Smiley-Ressource zurückzugeben:

Public ReadOnly Property Smiley() As System.Drawing.Bitmap 
 Get 
  Return CType(ResourceManager.GetObject("Smiley", _resCulture),_ 
   System.Drawing.Bitmap) 
 End Get 
End Property

Das stark typisierte Ressourcenmodul verarbeitet Ressourcen-IDs (unter Beachtung der Groß-/Kleinschreibung), verwendet die Klasse System.Resources.ResourceManager zum Abrufen der Ressourcen und verwaltet die zugehörigen Details zum korrekten Erstellen von ResourceManager für die Anwendung.

Um in Visual Basic 2002 oder Visual Basic 2003 auf dieselbe Smiley-Bitmap zuzugreifen, hätten Sie die Bitmap zunächst mühsam in eine .RESX-Datei einfügen müssen. Möglicherweise hätten Sie die Bitmap stattdessen als eingebettete Ressource in das Projekt eingefügt. In diesem Fall hätten Sie daran denken müssen, den Buildvorgang im Eigenschaftenraster der Ressource auf Embedded Resource zu ändern. Anschließend hätten Sie in etwa Folgendes geschrieben:

Dim CurrentAssembly As Reflection.Assembly = _ 
Reflection.Assembly.GetExecutingAssembly 
Dim BitMapStream As IO.Stream = _ 
CurrentAssembly.GetManifestResourceStream( _ 
"WindowsApplication2.Smiley.bmp") 
Dim SmileyBitmap as Drawing.Bitmap = New Bitmap(BitMapStream)

Um diesen Code richtig zu erstellen, wären einige wichtige Angaben erforderlich. Sie müssten wissen, wie Sie die aktuell ausführende Assembly erhalten und GetManifestResourceStream() für sie aufrufen. Sie müssten daran denken, den Ressourcennamen mit dem Namen vom Stamm-Namespace zu qualifizieren. Sie müssten beim Namen, der an GetManifestResourceStream() übergeben wird, auf die Groß-/Kleinschreibung achten. Sie müssten wissen, wo die Streamklasse definiert wird, um den Rückgabewert von GetManifestResource in ein Streamobjekt einzufügen. Sie müssten wissen, wie eine Bitmap aus einem Stream erstellt wird. Und Sie hätten wahrscheinlich vergeblich versucht, herauszufinden, welche der eben genannten Hürden dafür verantwortlich ist, dass der BitMapStream immer wieder schlicht Nothing zurückgibt.

Visual Basic 2005 löst das Problem durch einen Resource Editor, mit dem neue oder bestehende Ressourcen auf einfache Weise in eine .RESX-Datei eingefügt werden können. Mithilfe von My können Sie dann leicht auf die Ressourcen zugreifen. Sie müssen lediglich diesen Code schreiben:

Dim SmileyBitmap as Drawing.Bitmap = My.Resources.Smiley

 

Threading

Instanzen von My-Objekten werden pro Thread bereitgestellt. Wenn Klasseninstanzen durch My verfügbar sind, werden daher Threadingprobleme verringert. Die Instanz von My.Computer, die auf Thread 1 zurückgegeben wird, unterscheidet sich von der Instanz von My.Computer, die auf Thread 2 zurückgegeben wird. Wenn Sie My-Objekte verwenden, müssen Sie also keinen Synchronisierungscode schreiben.

Bei einer Webanwendung werden die Instanzen, die von My zurückgegeben werden, pro Anforderung gespeichert.

 

Schlussfolgerung

In diesem Artikel wurde gezeigt, wie My .NET Framework-Klassen bereitstellt und wie dynamisch erstellte Klassen erzeugt werden, um My zu ergänzen.

My verringert die Anzahl Codezeilen, die Sie schreiben müssen, und bietet Ihnen schnellen Zugriff auf die Funktionen, die Sie am häufigsten benötigen. My erledigt diese Aufgaben effizient, stabil und threadsicher.

In einem Arbeitsumfeld, in dem die Entwicklerproduktivität wichtiger ist als jemals zuvor, können Sie My verwenden, um schneller und effizienter zu arbeiten.