Share via


Erőforrás-kezelés: A használati kulcsszó

Ez a témakör a kulcsszót use és a using függvényt ismerteti, amely szabályozhatja az erőforrások inicializálását és kiadását.

Források

Az erőforrás kifejezés több módon is használható. Igen, az erőforrások lehetnek az alkalmazások által használt adatok, például sztringek, ábrák és hasonlók, de ebben a kontextusban az erőforrások szoftver- vagy operációsrendszer-erőforrásokra, például grafikus eszközkörnyezetekre, fájlfogópontokra, hálózati és adatbázis-kapcsolatokra, egyidejűségi objektumokra, például várakozási fogópontokra stb. utalnak. Ezeknek az erőforrásoknak az alkalmazások általi használata magában foglalja az erőforrás beszerzését az operációs rendszertől vagy más erőforrás-szolgáltatótól, majd az erőforrás későbbi kiadását a készletbe, hogy az egy másik alkalmazás számára is elérhető legyen. Problémák akkor fordulnak elő, ha az alkalmazások nem adnak vissza erőforrásokat a közös készletbe.

Erőforrások kezelése

Az alkalmazások erőforrásainak hatékony és felelősségteljes kezeléséhez azonnal és kiszámítható módon kell felszabadítania az erőforrásokat. A .NET-keretrendszer a felület megadásával System.IDisposable segít ebben. A implementálási System.IDisposable típus rendelkezik a System.IDisposable.Dispose metódussal, amely megfelelően felszabadítja az erőforrásokat. A jól megírt alkalmazások garantálják, hogy a rendszer azonnal meghívja azt System.IDisposable.Dispose , ha már nincs szükség egy korlátozott erőforrást tartalmazó objektumra. Szerencsére a legtöbb .NET-nyelv támogatást nyújt ennek megkönnyítéséhez, és az F# nem kivétel. Két hasznos nyelvi szerkezet támogatja az elidegenítési mintát: a use kötést és a függvényt using .

kötés használata

A use kulcsszónak a kötéshez hasonló űrlapja let van:

értékkifejezés = használata

Ugyanazokkal a funkciókkal rendelkezik, mint egy let kötés, de meghívja Dispose az értéket, amikor az érték túllépi a hatókört. Vegye figyelembe, hogy a fordító null értékű ellenőrzést szúr be az értékre, így ha az érték az null, akkor a rendszer nem kísérli meg a hívását Dispose .

Az alábbi példa bemutatja, hogyan zárhat be automatikusan egy fájlt a use kulcsszó használatával.

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

A rendszer több példányt use is elvet a deklarált sorrendben. Vagyis az első use lesz az utolsó kiadás.

Feljegyzés

Számítási kifejezésekben is használható use , ebben az esetben a use kifejezés testreszabott verzióját használja a rendszer. További információ: Szekvenciák, aszinkron kifejezések, feladatkifejezések és számítási kifejezések.

függvény használata

A using függvény a következő űrlapot tartalmazza:

using (kifejezés1) függvény vagy-lambda

using Egy kifejezés1 kifejezésben létrehozza azt az objektumot, amelyet el kell végezni. Az 1. kifejezés (az elvetendő objektum) eredménye argumentum, érték, függvény-vagy-lambda lesz, amely egy függvény, amely egy olyan típus egyetlen fennmaradó argumentumát várja el, amely megfelel a kifejezés1 által előállított értéknek, vagy egy lambda kifejezés, amely az adott típusú argumentumot várja. A függvény végrehajtásának végén a futtatókörnyezet meghívja Dispose és felszabadítja az erőforrásokat (kivéve, ha az nullérték , ebben az esetben az elidegenítési hívás nem lesz megkísérelve).

Az alábbi példa egy lambda kifejezéssel szemlélteti a using kifejezést.

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

A következő példa egy using függvényt tartalmazó kifejezést mutat be.

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

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

Vegye figyelembe, hogy a függvény lehet olyan függvény, amely már alkalmazott néhány argumentumot. Ezt az alábbi példakód szemlélteti. Létrehoz egy fájlt, amely a sztringet XYZtartalmazza.

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

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

A using függvény és a use kötés szinte egyenértékű módszer ugyanerre a feladatra. A using kulcsszó nagyobb ellenőrzést biztosít a híváskor Dispose . Ha használjausing, Dispose a függvény vagy a lambda kifejezés végén lesz meghívva; a kulcsszó Dispose használatakor a use rendszer a kódblokk végén hívja meg. Általában inkább a függvény helyett érdemes használniuse.using

Lásd még