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 nullhodnota , 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 usingvý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í nullhodnota , 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á usingna 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 useusing .

Viz také