Share via


Resurshantering: Nyckelordet använd

Det här avsnittet beskriver nyckelordet useusing och funktionen, som kan styra initieringen och lanseringen av resurser.

Resurser

Termen resurs används på mer än ett sätt. Ja, resurser kan vara data som ett program använder, till exempel strängar, grafik och liknande, men i det här sammanhanget refererar resurser till program- eller operativsystemresurser, till exempel grafikenhetskontexter, filhandtag, nätverks- och databasanslutningar, samtidighetsobjekt som väntehandtag och så vidare. Användningen av dessa resurser av program innebär att du förvärvar resursen från operativsystemet eller någon annan resursprovider, följt av den senare versionen av resursen till poolen så att den kan tillhandahållas till ett annat program. Problem uppstår när program inte släpper tillbaka resurser till den gemensamma poolen.

Hantera resurser

För att effektivt och ansvarsfullt hantera resurser i ett program måste du frigöra resurser snabbt och förutsägbart. .NET Framework hjälper dig att göra detta genom att tillhandahålla System.IDisposable gränssnittet. En typ som implementerar System.IDisposable har System.IDisposable.Dispose metoden, som frigör resurser på rätt sätt. Välskrivna program garanterar att System.IDisposable.Dispose anropas snabbt när objekt som innehåller en begränsad resurs inte längre behövs. Som tur är har de flesta .NET-språk stöd för att göra detta enklare, och F# är inget undantag. Det finns två användbara språkkonstruktioner som stöder mönstret för bortskaffande: bindningen use och using funktionen.

använda bindning

Nyckelordet use har ett formulär som liknar bindningens let :

använda värdeuttryck =

Det ger samma funktioner som en let bindning men lägger till ett anrop till Dispose på värdet när värdet hamnar utanför omfånget. Observera att kompilatorn infogar en null-kontroll av värdet, så att anropet till Dispose inte görs om värdet är null.

I följande exempel visas hur du stänger en fil automatiskt med hjälp av nyckelordet use .

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."

Flera instanser av use tas bort i omvänd ordning där de deklareras. Den första use blir den sista som släpps.

Kommentar

Du kan använda use i beräkningsuttryck, i vilket fall en anpassad version av use uttrycket används. Mer information finns i Sekvenser, Async-uttryck, Uppgiftsuttryck och Beräkningsuttryck.

använda funktion

Funktionen using har följande formulär:

using (expression1) function-or-lambda

I ett using uttryck skapar expression1 det objekt som måste tas bort. Resultatet av expression1 (objektet som måste tas bort) blir ett argument, värde, till function-or-lambda, som antingen är en funktion som förväntar sig ett enda återstående argument av en typ som matchar värdet som genereras av expression1 eller ett lambda-uttryck som förväntar sig ett argument av den typen. I slutet av körningen av funktionen anropar Dispose och frigör runtime resurserna (såvida inte värdet är null, i vilket fall anropet till Avyttra inte görs).

I följande exempel visas uttrycket using med ett lambda-uttryck.

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."

I nästa exempel visas uttrycket using med en funktion.

let printToFile (file1 : System.IO.StreamWriter) =
    file1.WriteLine("Test output");

using (System.IO.File.CreateText("test.txt")) printToFile

Observera att funktionen kan vara en funktion som redan har vissa argument tillämpade. Följande kodexempel visar detta. Den skapar en fil som innehåller strängen XYZ.

let printToFile2 obj (file1 : System.IO.StreamWriter) =
    file1.WriteLine(obj.ToString())

using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")

Funktionen using och bindningen use är nästan likvärdiga sätt att åstadkomma samma sak. Nyckelordet using ger mer kontroll över när Dispose anropas. När du använder usinganropas , Dispose i slutet av funktionen eller lambda-uttrycket. När du använder nyckelordet useDispose anropas i slutet av det innehållande kodblocket. I allmänhet bör du föredra att använda use i stället för funktionen using .

Se även