Zarządzanie zasobami: use — Słowo kluczowe (F#)
W tym temacie opisano kluczowe use i using funkcji, można kontrolować inicjowania i wydania zasobów.
Zasoby
Określenie zasobów jest używany w więcej niż jeden sposób.Tak, zasoby mogą być dane, że aplikacja używa, takie jak ciągi, grafiki i tym podobne, ale w tym kontekście, zasobów odnosi się do oprogramowania lub zasoby systemu operacyjnego, takie jak kontekstów urządzeń graficznych, dojść do plików, połączeń sieciowych i bazy danych, obiekty współbieżności, takie jak uchwyty oczekiwania i tak dalej.Wykorzystanie tych zasobów przez aplikacje pociąga za sobą nabycie zasobów od systemu operacyjnego lub innych zasobów, następuje nowszej wersji tego zasobu do puli, tak że może być dostarczone do innej aplikacji.Gdy aplikacje nie zwalnia zasobów, wróć do wspólnej puli wystąpić problemy.
Zarządzanie zasobami
Aby skutecznie i w sposób odpowiedzialny należy zarządzać zasobami w aplikacji, musi zwolnić zasoby niezwłocznie i przewidywalny sposób..NET Framework pomaga to zrobić przez zapewnienie IDisposable interfejsu.Typ, który implementuje IDisposable ma Dispose metodę, która poprawnie zwalnia zasoby.Aplikacje napisane zagwarantować, że Dispose jest wywoływana niezwłocznie po dowolny obiekt, który posiada ograniczony zasób jest już potrzebne.Na szczęście większość.Języki netto zapewniają obsługę ułatwić i F# nie jest wyjątkiem.Istnieją dwie konstrukcje języka przydatne obsługujących deseń zbycia: use powiązania i using funkcji.
używać wiązania
use Słowo kluczowe zawiera formularz, który przypomina let powiązania:
use value =expression
Udostępnia taką samą funkcjonalność jak let wiążące, ale doda wywołanie do Dispose na wartość, gdy wartość wykracza poza zakres.Uwaga kompilator wstawia null wyboru wartości, tak że jeśli wartość jest null, wywołanie do Dispose nie jest wykonywane.
Poniższy przykład ilustruje sposób automatycznie zamknąć plik za pomocą use słowa kluczowego.
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."
[!UWAGA]
Można użyć use w wyrażeniach obliczeń, w którym to przypadku dostosowaną wersję use jest używane wyrażenie.Aby uzyskać więcej informacji, zobacz Sekwencje (F#), Asynchroniczne przepływy pracy (F#), i Wyrażenia obliczeń (F#).
za pomocą funkcji
using Funkcja ma następującą postać:
using (expression1) function-or-lambda
W using wyrażenie, expression1 tworzy obiekt, który muszą być usuwane.Wynik expression1 (obiekt muszą być unieszkodliwiane) staje się argument, value, do function-or-lambda, który jest funkcja, który oczekuje na pojedynczy pozostałych argumentu typu, który odpowiada wartości produkowanych przez expression1, lub wyrażenie lambda, którego oczekuje, że argument w tego typu.Środowisko wykonawcze wywołuje na końcu wykonanie funkcji Dispose i zwalnia zasoby (chyba, że wartość jest null, w którym to przypadku nie jest próba wywołania do zbycia).
W poniższym przykładzie zademonstrowano using wyrażenie wyrażenie lambda.
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 jumped over the lazy brown dog."
W następnym przykładzie pokazano using wyrażenie z funkcją.
let printToFile (file1 : System.IO.StreamWriter) =
file1.WriteLine("Test output");
using (System.IO.File.CreateText("test.txt")) printToFile
Należy zwrócić uwagę, że funkcja może być funkcji, która zawiera niektóre argumenty już stosowane.Poniższy przykład kodu pokazuje to.Tworzy plik zawierający ciąg XYZ.
let printToFile2 obj (file1 : System.IO.StreamWriter) =
file1.WriteLine(obj.ToString())
using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")
using Funkcji i use powiązania są prawie równoważne sposoby osiągnąć to samo.using Słowa kluczowego zapewnia większą kontrolę nad tym, kiedy Dispose jest wywoływana.Kiedy używać using, Dispose nazywa się na końcu wyrażenia funkcji lub lambda; Kiedy używać use słowa kluczowego, Dispose nazywa się na końcu zawierającego bloku kodu.Ogólnie rzecz biorąc, należy preferować użyć use zamiast using funkcji.