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 XYZ
tartalmazza.
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: