Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden das Schlüsselwort use und die using Funktion beschrieben, die die Initialisierung und Freigabe von Ressourcen steuern kann.
Ressourcen
Die Ausdrucksressource wird auf mehrere Weise verwendet. Ja, Ressourcen können Daten sein, die von einer Anwendung verwendet werden, z. B. Zeichenfolgen, Grafiken und ähnliches, aber in diesem Kontext beziehen sich Ressourcen auf Software- oder Betriebssystemressourcen, z. B. Grafikgerätekontexte, Dateihandles, Netzwerk- und Datenbankverbindungen, Parallelitätsobjekte wie Wartezeithandles usw. Die Verwendung dieser Ressourcen durch Anwendungen umfasst den Erwerb der Ressource vom Betriebssystem oder einem anderen Ressourcenanbieter, gefolgt von der späteren Veröffentlichung der Ressource in den Pool, sodass sie für eine andere Anwendung bereitgestellt werden kann. Probleme treten auf, wenn Anwendungen keine Ressourcen wieder in den gemeinsamen Pool freigeben.
Verwalten von Ressourcen
Um Ressourcen in einer Anwendung effizient und verantwortungsbewusst zu verwalten, müssen Sie Ressourcen umgehend und vorhersehbar freigeben. Das .NET Framework hilft Ihnen dabei, indem sie die System.IDisposable Schnittstelle bereitstellt. Ein implementierter System.IDisposable Typ verfügt über die System.IDisposable.Dispose Methode, die Ressourcen korrekt freigibt. Gut geschriebene Anwendungen garantieren, dass diese System.IDisposable.Dispose umgehend aufgerufen werden, wenn ein Objekt, das eine begrenzte Ressource enthält, nicht mehr benötigt wird. Glücklicherweise bieten die meisten .NET-Sprachen Unterstützung, um dies zu vereinfachen, und F# ist keine Ausnahme. Es gibt zwei nützliche Sprachkonstrukte, die das Dispose-Muster unterstützen: die use Bindung und die using Funktion.
Bindung verwenden
Das use Schlüsselwort weist ein Formular auf, das der Bindung ähnelt let :
= Wertausdruck verwenden
Sie stellt die gleiche Funktionalität wie eine let Bindung bereit, fügt jedoch einen Aufruf für Dispose den Wert hinzu, wenn der Wert außerhalb des Gültigkeitsbereichs steht. Beachten Sie, dass der Compiler eine NULL-Prüfung für den Wert einfügt, sodass der Aufruf Dispose nicht versucht wird, wenn der Wert nullist.
Das folgende Beispiel zeigt, wie eine Datei mithilfe des use Schlüsselworts automatisch geschlossen wird.
open System.IO
let writetofile filename obj =
use file1 = File.CreateText(filename)
file1.WriteLine("{0}", obj.ToString() )
// file1.Dispose() is called implicitly here.
writetofile "abc.txt" "Humpty Dumpty sat on a wall."
Mehrere Instanzen werden use in umgekehrter Reihenfolge verworfen, in der sie deklariert werden. Das heißt, der erste use wird die letzte Veröffentlichung sein.
Hinweis
Sie können in Berechnungsausdrücken verwenden use , in diesem Fall wird eine angepasste Version des use Ausdrucks verwendet. Weitere Informationen finden Sie unter Sequenzen, Asynchrone Ausdrücke, Aufgabenausdrücke und Berechnungsausdrücke.
Verwenden der Funktion
Die using Funktion weist das folgende Format auf:
using (Ausdruck1) Funktions- oder Lambda-Funktion
In einem using Ausdruck erstellt Expression1 das Objekt, das verworfen werden muss. Das Ergebnis von Expression1 (das Objekt, das verworfen werden muss) wird zu einem Argument, Wert, zu Funktion oder Lambda, bei dem es sich entweder um eine Funktion handelt, die ein einzelnes verbleibendes Argument eines Typs erwartet, der dem von Expression1 erzeugten Wert entspricht, oder zu einem Lambda-Ausdruck, der ein Argument dieses Typs erwartet. Am Ende der Ausführung der Funktion ruft die Laufzeit die Ressourcen auf Dispose und gibt sie frei (es sei denn, der Wert ist null, in diesem Fall wird der Aufruf von Dispose nicht versucht).
Im folgenden Beispiel wird der using Ausdruck mit einem Lambda-Ausdruck veranschaulicht.
open System.IO
let writetofile2 filename obj =
using (System.IO.File.CreateText(filename)) ( fun file1 ->
file1.WriteLine("{0}", obj.ToString() )
)
writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."
Das nächste Beispiel zeigt den using Ausdruck mit einer Funktion.
let printToFile (file1 : System.IO.StreamWriter) =
file1.WriteLine("Test output");
using (System.IO.File.CreateText("test.txt")) printToFile
Beachten Sie, dass die Funktion eine Funktion sein könnte, die bereits einige Argumente angewendet hat. Im folgenden Codebeispiel wird dies veranschaulicht. Sie erstellt eine Datei, die die Zeichenfolge XYZenthält.
let printToFile2 obj (file1 : System.IO.StreamWriter) =
file1.WriteLine(obj.ToString())
using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")
Die using Funktion und die use Bindung sind nahezu gleichwertige Möglichkeiten, dasselbe zu erreichen. Das using Schlüsselwort bietet mehr Kontrolle über den Aufruf Dispose . Wenn Sie das Schlüsselwort verwenden using, Dispose wird am Ende der Funktion oder des Lambda-Ausdrucks aufgerufen. Wenn Sie das use Schlüsselwort verwenden, Dispose wird am Ende des enthaltenden Codeblocks aufgerufen. Im Allgemeinen sollten Sie die Verwendung use anstelle der using Funktion bevorzugen.