Zusammenfassung: Überblick darüber, wie die My-Funktion die .NET Framework-Funktionalität verfügbar macht, einschließlich verfügbarer Klassen, dynamisch generierter Klassen und Threading.
Hinweis: Dieser Artikel und der Beispielcode basieren auf der Vorabversion von Microsoft Visual Studio 2005 (zuvor Codename „Whidbey“). Alle hierin enthaltenen Informationen können sich ändern. Das Beispielprojekt erfordert Visual Studio2005Beta1 oder höher.
Einführung
My ist eine neue Funktion in Visual Basic 2005, die Ihnen häufig verwendete Funktionen zur Verfügung stellt und die Anzahl der Codezeilen reduziert, die Sie schreiben müssen. Dies geschieht auf effiziente, zuverlässige und threadsichere Weise. In einer Umgebung, in der die Produktivität von Programmierern besonders wichtig ist, kann My Ihnen dabei helfen, Ihre Arbeit schneller abzuschließen. Dies ist die Essenz von Visual Basic.
Der Zweck dieses Artikels besteht darin, zu untersuchen, wie Sie mit My auf .NET Framework-Funktionen und -Elemente in Ihrem Projekt zugreifen können.
.NETFramework-Klassen verfügbar bei My
Da .NET Framework so viel beinhaltet, kann es schwierig sein, die benötigte Funktionalität zu finden. Um dieses Problem zu lösen, stellt My Einstiegspunkte zu häufig verwendeten .NET Framework-Klassen und -Funktionen bereit. My stellt außerdem neue .NET Framework-Klassen auf hoher Ebene bereit, die verwandte Funktionen in aufgabenbasierten APIs zusammenfassen.
My stellt Funktionalität bereit, indem es eine .NETFramework-Klasse zurückgibt, die instanziiert und einsatzbereit ist, Aufrufe von .NETFramework-Methoden zurückstellt und dynamisch generierte Klassen zurückgibt, die für den Zugriff auf Elemente in Ihrem Projekt verwendet werden können.
Direkt öffentlich
Wann immer möglich, dient My als Erkennungsmechanismus für vorhandene Klassen im .NET Framework und macht diese Typen direkt verfügbar. Sehen Sie sich das folgende My.application.Deployment-Beispiel an:
PublicReadOnlyPRpertyDeployment()As_
System.Deployment.ApplicationDeployment
Erhalten
Zurückkehren_
System.Deployment.ApplicationDeployment.CurrentDeployment
EndGet
EndProperty
Weitere Beispiele für direkte Offenlegung sind My.Computer.FileSystem.OpenTextFileReader() (das System.IO.StreamReader zurückgibt), My.Application.OpenForms() (das System.Windows.Forms.FormsCollection zurückgibt), My.User (das zurückgibt System.Security.Principal.IPrincipal) usw.
Aussehen
Ich kann auch neue Klassen zurückgeben, die eine aufgabenbasierte API zum Ausführen von Vorgängen bereitstellen, die zuvor schwierig durchzuführen waren, weil das Auffinden von Funktionen schwierig war und/oder die Zusammenarbeit mehrerer Objekte erforderlich war.
Häufige Aufgaben, die die Verwendung der Low-Level-API des .NET Framework oder mehrere Codezeilen erfordern, werden erheblich vereinfacht. Sehen Sie sich das folgende Aufgabenbeispiel an, um festzustellen, ob eine Netzwerkverbindung verfügbar ist:
ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
Erhalten
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
ReturnTrue
EndIf
Nächste
ReturnFalse
EndGet
EndProperty
Der obige Code erfordert detaillierte Kenntnisse über mehrere Typen im System.Net.NetworkInformation-Namespace. Mithilfe des Erscheinungsmusters reduziert My.Computer.Network diese Typen und ihre Beziehungen auf eine einzige Codezeile: My.Computer.Network.IsAvailable().
Erscheinungsbilder können auch einfach verwandte Funktionen zusammenführen, die sonst schwer zu finden wären. My.Computer vereint beispielsweise Eigenschaften aus verschiedenen Klassen, um den Computernamen und den Zugriff auf den Bildschirm bereitzustellen:
PublicReadOnlyPropertyName()AsString
Erhalten
ReturnSystem.Environment.MachineName
EndGet
EndProperty
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
Erhalten
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
EndGet
EndProperty
Weitere Beispiele für Klassen in My, die verwandte Funktionen aus mehreren .NET Framework-Typen zusammenführen, sind My.Application, My.Computer, My.Computer.FileSystem, My.Computer.Info und My.Application.Info.
Proxy-Klasse
Die Proxy-Klasse ist eine sehr „dünne“ Klasse, die alle Aufrufe an sie an das Basisobjekt weiterleitet. Wenn Sie beispielsweise My.Computer.Clipboard.GetText() aufrufen, rufen Sie tatsächlich die Proxy-Klassenmethode ClipboardProxy.GetText() auf, die wie folgt definiert ist:
PublicFunctionGetText()AsString
ReturnClipboard.GetText()
EndFunction
Konventionell haben Proxy-Klassen immer das Suffix Proxy. Beim Zugriff auf die Zwischenablage, das Dateisystem und die Registrierung verwendet My Proxys, da die von Proxys bereitgestellten Basisklassen aus gemeinsam genutzten Methoden bestehen, die in IntelliSense nicht sichtbar sind. Die Proxy-Klasse kann vom Benutzer nicht instanziiert werden. Leistungstests haben gezeigt, dass die Weiterleitung von Anrufen über einen Proxy keinen Sinn macht.
Dynamisch generierte Klassen
Im Einklang mit dem Ziel, Ihnen „Funktionalität zur Verfügung zu stellen“, bietet My Zugriff auf die in Ihrem Projekt definierten Formulare, Webdienste, Ressourcen und Einstellungen. Wenn Ihr Projekt beispielsweise einen Verweis auf den Webdienst MapDirections enthält, können Sie den Webdienst sofort nutzen, ohne wissen zu müssen, wie eine Instanz des Webdienst-Proxys gestartet wird. Sie geben einfach Folgendes ein: My.WebServices.MapDirections.GetDirections(...)
Wie funktioniert das? Factory-Klassen werden von einem Compiler generiert, der bei Bedarf verzögert erstellte Instanzen für die Formulare, Webdienste, Einstellungen und Ressourcen in Ihrem Projekt zurückgibt. Die Factory-Klasse ist so angepasst, dass sie Instanzen auf eine Art und Weise zurückgibt, die für den Projekttyp (exe/dll/web) geeignet ist, in dem Ihr Code ausgeführt wird. Weitere Einzelheiten finden Sie im Abschnitt „Einfädeln“.
Meine.Formulare
Betrachten Sie als Beispiel für eine dynamisch generierte Klasse My.Forms. Diese Klasse wird Ihnen zur Verfügung gestellt und definiert Factory-Methoden für jedes Formular in Ihrem Projekt. Wenn Sie über My.Forms.Form1 auf das Formular zugreifen, prüft die Factory-Methode, ob bereits eine Instanz von Form1 geöffnet ist. Wenn eine Instanz bereits geöffnet ist, wird diese Instanz zurückgegeben. Andernfalls wird eine Instanz von Form1 erstellt und zurückgegeben. Der generierte Code für das Projekt, das Form1 enthält, sieht folgendermaßen aus:
ClassMyForms
'Code in Fettschrift wird vom Compiler generiert
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
Erhalten
m_Form1=Create__Instance__(OfForm1)(m_Form1)
Returnm_Form1
EndGet
Set(ByValValueAsForm1)
IfValueIsm_Form1
Zurückkehren
EndIf
IfNotValueIsNothingThen
ThrowNewArgumentException(_
PropertycanonlybesettoNothing.)
EndIf
Dispose__Instance__(OfForm1)(m_Form1)
EndSet
EndProperty
EndClass
Die Funktion Create__Instance__() ist dafür verantwortlich, bei Bedarf Instanzen des Formulars zu erstellen. Es prüft, ob das Formular (gespeichert in m_Form1) instanziiert wurde. Wenn das Formular bereits instanziiert wurde, wird das Formular zurückgegeben. Andernfalls wird eine Instanz erstellt und zurückgegeben. Create__Instance__() erfasst auch rekursive Formularerstellungsversuche. Dispose__Instance__() ist für das Schließen des Formulars verantwortlich.
My.Forms bietet außerdem eine Methode zum erneuten Einführen einer Standardinstanz eines Formulars, die Sie möglicherweise aus früheren Versionen von Visual Basic kennen. Standardinstanzen ermöglichen es, auf eine Instanz eines Formulars zu verweisen, ohne zunächst explizit eine Instanz des Formulars zu erstellen.
Beispielsweise könnten Sie in Visual Basic 6.0 stattdessen Form1.Show() geschrieben haben:
DimForm1InstanceasForm1
Form1Instance=newForm1
Form1Instance.Show()
Da der Compiler in Visual Basic 2005 My.Forms zum Erstellen von Standardinstanzen verwendet, können Sie einfach Form1.Show() schreiben.
Meine.WebServices
Eine der Schwierigkeiten, auf die Menschen beim Codieren von Webdiensten stoßen, besteht darin, zu bestimmen, gegen welche Klasse codiert werden soll. My.WebServices eliminiert diesen Bestimmungsprozess und stellt bei Bedarf Instanzen von Webdienst-Proxys bereit.
My.WebServices eignet sich am besten für synchrone Aufrufe von Webdiensten. Das zum Bereitstellen einer Instanz des Webdienst-Proxys generierte Codemuster ist dasselbe wie das angezeigte Codemuster zum Zurückgeben einer Instanz des Formulars.
Meine.Einstellungen
Neu in Visual Basic 2005 ist der Settings Designer, mit dem Sie Anwendungseinstellungen auf Anwendungs- oder Benutzerbasis festlegen können. Der Designer erstellt eine Klasse, mit der Sie stark typisiert auf Ihre Einstellungen zugreifen können. Sie können ein Beispiel der MySettings-Klasse sehen, indem Sie im Projektmappen-Explorer „Alle Dateien“ anzeigen und unter dem Knoten „MySettings.Settings“ nach der Datei „MySettings.vb“ suchen.
Das Folgende ist ein Beispiel für eine Eigenschaft, die zum Verwalten einer Anwendungseinstellung namens SampleUserSetting generiert wurde:
PartialNotInheritableClassMySettings
ErbtSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(TryMe)>_
PublicPropertySampleUserSetting()AsString
Erhalten
ReturnCType(Me(SampleUserSetting),String)
EndGet
Satz
Me(SampleUserSetting)=Wert
EndSet
EndProperty
EndClass
Die generierten Klassen erledigen die ganze schwere Arbeit für Sie. Um auf diese Einstellung zuzugreifen, geben Sie einfach Folgendes ein:
My.Settings.SampleUserSetting
Meine.Ressourcen
Eine weitere neue Funktion in Visual Basic 2005 ist der Ressourcen-Designer, mit dem Sie Ressourcen zu Ihrer Anwendung hinzufügen können. Der Ressourcen-Designer erstellt außerdem ein Modul, mit dem Sie auf stark typisierte Weise auf Ressourcen in Ihrer Anwendung zugreifen können. Wenn Sie Ihrem Projekt beispielsweise eine Bitmap mit dem Namen Smiley hinzufügen, können Sie über My.Resources.Smiley auf die Bitmap zugreifen. Sie können ein Beispiel des generierten Ressourcenmoduls anzeigen, indem Sie im Projektmappen-Explorer des Beispielprojekts „Alle Dateien“ anzeigen und unter dem Knoten „MyResources.resx“ nach der Datei „MyResources.vb“ suchen.
Das Folgende ist ein Beispiel für ein Beispielprojekt, das generiert wurde, um eine Fabrikeigenschaft für eine Smiley-Ressource zurückzugeben:
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
Erhalten
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
System.Drawing.Bitmap)
EndGet
EndProperty
Das generierte stark typisierte Ressourcenmodul verarbeitet Ressourcen-IDs, bei denen die Groß-/Kleinschreibung beachtet wird, verwendet die System.Resources.ResourceManager-Klasse zum Abrufen Ihrer Ressourcen und verwaltet die Details im Zusammenhang mit der ordnungsgemäßen Erstellung des ResourceManager für Ihre Anwendung.
Um auf dieselbe Smiley-Bitmap in VisualBasic2002 oder VisualBasic2003 zuzugreifen, müssen Sie die Bitmap zunächst in eine .resx-Datei einfügen, was schwierig ist. Eine andere Möglichkeit besteht darin, sie als eingebettete Ressource in das Projekt einzufügen. Dabei müssen Sie daran denken, die Build-Aktion im Eigenschaftenraster der Ressource zu ändern, die als eingebettete Ressource dienen soll. Auf diese Weise sollte der Code, den Sie schreiben, folgendermaßen aussehen:
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)
Dieser Code enthält einige wichtige Details, die Sie kennen müssen. Sie müssen wissen, wie Sie die aktuell ausgeführte Assembly abrufen und GetManifestResourceStream() darauf aufrufen können. Sie müssen daran denken, Ressourcennamen mit dem Root-Namespace-Namen zu qualifizieren. Sie müssen die Berechtigung zur Groß-/Kleinschreibung einholen, da bei dem an GetManifestResourceStream() übergebenen Namen die Groß-/Kleinschreibung beachtet wird. Sie müssen wissen, wo die Stream-Klasse definiert werden muss, damit Sie den Rückgabewert von GetManifestResource im Stream-Objekt erfassen können. Sie müssen wissen, wie man aus einem Stream eine Bitmap erstellt. Es kann zu Frustrationen kommen, wenn Sie herausfinden möchten, warum ein BitMapStream aufgrund eines der oben genannten Probleme immer „Nothing“ zurückgibt.
Visual Basic 2005 löst das erste Problem durch die Bereitstellung von ResourceEditor, der es einfach macht, neue oder vorhandene Ressourcen in .resx-Dateien zu platzieren. Auf diese Ressourcen kann dann problemlos über My zugegriffen werden. Alles was Sie tun müssen, ist Folgendes zu schreiben:
DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley
Einfädeln
Die in My verfügbaren Klasseninstanzen werden auf eine Weise verfügbar gemacht, die Threading-Probleme lindert, da Instanzen von My-Objekten pro Thread bereitgestellt werden. Das heißt, die in Thread 1 zurückgegebene Instanz von My.Computer unterscheidet sich von der in Thread 2 zurückgegebenen Instanz von My.Computer. Dies bedeutet, dass Sie bei Verwendung des My-Objekts keinen Synchronisierungscode schreiben müssen.
In einer Webanwendung wird die von My zurückgegebene Instanz auf Anfrage gespeichert.
Zusammenfassung
Wir haben untersucht, wie My .NET Framework-Klassen verfügbar macht und wie dynamisch generierte Klassen als Ergänzung zu My generiert werden können.
Schließlich reduziert My die Anzahl der Codezeilen, die Sie schreiben müssen, und bietet Zugriff auf häufig verwendete Funktionen. Dies geschieht auf effiziente, zuverlässige und threadsichere Weise. In einer Umgebung, in der die Arbeitseffizienz von Programmierern besonders wichtig ist, kann My Ihnen dabei helfen, Ihre Arbeit schneller und effektiver zu erledigen.
->