Správa prostředků: Klíčové slovo use
Toto téma popisuje klíčové slovo use
a using
funkci, které mohou řídit inicializaci a uvolnění prostředků.
Zdroje informací
Prostředek termínu se používá více než jedním způsobem. Ano, prostředky můžou být data, která aplikace používá, jako jsou řetězce, grafika a podobně, ale v tomto kontextu prostředky odkazují na prostředky softwaru nebo operačního systému, jako jsou kontexty grafických zařízení, popisovače souborů, síťová a databázová připojení, objekty souběžnosti, jako jsou popisovače čekání atd. Použití těchto prostředků aplikacemi zahrnuje získání prostředku z operačního systému nebo jiného poskytovatele prostředků, následované pozdějším vydáním prostředku do fondu, aby bylo možné ho poskytnout jiné aplikaci. K problémům dochází, když aplikace nevyvolá prostředky zpět do společného fondu.
Správa prostředků
Pokud chcete efektivně a zodpovědně spravovat prostředky v aplikaci, musíte prostředky uvolnit okamžitě a předvídatelným způsobem. Rozhraní .NET Framework vám to pomůže tím, že System.IDisposable
poskytuje rozhraní. Typ, který implementuje System.IDisposable
, má metodu System.IDisposable.Dispose
, která správně uvolní prostředky. Dobře napsané aplikace zaručují, že System.IDisposable.Dispose
se volá okamžitě, když už není potřeba žádný objekt, který obsahuje omezený prostředek. Většina jazyků .NET naštěstí poskytuje podporu pro usnadnění a jazyk F# není výjimkou. Existují dva užitečné jazykové konstrukce, které podporují vzor Dispose: vazby use
a using
funkce.
použít vazbu
Klíčové use
slovo má tvar, který se podobá vazbě let
:
use value = expression
Poskytuje stejné funkce jako let
vazba, ale přidává volání Dispose
hodnoty, když hodnota přejde mimo rozsah. Všimněte si, že kompilátor vloží na hodnotu kontrolu null, takže pokud je null
hodnota , volání Dispose
se nepokusí.
Následující příklad ukazuje, jak automaticky zavřít soubor pomocí klíčového use
slova.
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."
Více instancí use
je uvolněno v obráceném pořadí, ve kterém jsou deklarovány. To znamená, že první use
bude poslední vydané.
Poznámka:
Můžete použít use
ve výpočetních výrazech, v takovém případě se používá přizpůsobená verze výrazu use
. Další informace najdete v tématu Sekvence, asynchronní výrazy, výrazy úloh a výpočetní výrazy.
using – funkce
Funkce using
má následující tvar:
using
(expression1) function-or-lambda
Ve výrazu using
výraz1 vytvoří objekt, který musí být uvolněn. Výsledkem výrazu 1 (objekt, který musí být uvolněn) se stane argumentem, hodnotou, funkcí nebo lambda, což je funkce, která očekává jeden zbývající argument typu, který odpovídá hodnotě vytvořené výrazem1, nebo výraz lambda, který očekává argument daného typu. Na konci provádění funkce modul runtime volá Dispose
a uvolní prostředky (pokud není null
hodnota , v takovém případě se volání Dispose nepokusí).
Následující příklad ukazuje using
výraz s výrazem 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 jumps over the lazy brown dog."
Následující příklad ukazuje using
výraz s funkcí.
let printToFile (file1 : System.IO.StreamWriter) =
file1.WriteLine("Test output");
using (System.IO.File.CreateText("test.txt")) printToFile
Všimněte si, že funkce může být funkce, která už má některé argumenty použité. Následující příklad kódu ukazuje toto. Vytvoří soubor, který obsahuje řetězec XYZ
.
let printToFile2 obj (file1 : System.IO.StreamWriter) =
file1.WriteLine(obj.ToString())
using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")
Funkce using
a use
vazba jsou téměř ekvivalentními způsoby, jak dosáhnout stejné věci. Klíčové using
slovo poskytuje větší kontrolu nad tím, kdy Dispose
je volána. Při použití se Dispose
volá using
na konci funkce nebo výrazu lambda; při použití use
klíčového slova je Dispose
volána na konci obsahujícího bloku kódu. Obecně byste měli raději místo funkce používat use
using
.