használati utasítás – az eldobható tárgyak megfelelő használatának biztosítása
Az using
utasítás biztosítja egy példány megfelelő használatát IDisposable :
var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
string line;
while ((line = reader.ReadLine()) is not null)
{
if (int.TryParse(line, out int number))
{
numbers.Add(number);
}
}
}
Amikor a vezérlő elhagyja az utasítás blokkját using
, a rendszer egy beszerzett IDisposable példányt megsemmisít. A nyilatkozat különösen biztosítja, using
hogy egy eldobható példányt akkor is megsemmisítsen, ha kivétel történik a using
nyilatkozat blokkjában. Az előző példában egy megnyitott fájl az összes sor feldolgozása után bezárul.
await using
Az utasítás használatával helyesen használhat egy példánytIAsyncDisposable:
await using (var resource = new AsyncDisposableExample())
{
// Use the resource
}
A példányok használatáról további információt az DisposeAsync metódus implementálásáról IAsyncDisposable szóló cikk Aszinkron használata című szakaszában talál.
Olyan deklarációt using
is használhat, amely nem igényel kapcsos zárójelet:
static IEnumerable<int> LoadNumbers(string filePath)
{
using StreamReader reader = File.OpenText(filePath);
var numbers = new List<int>();
string line;
while ((line = reader.ReadLine()) is not null)
{
if (int.TryParse(line, out int number))
{
numbers.Add(number);
}
}
return numbers;
}
Ha deklarációban using
deklarálják, a rendszer a helyi változót annak a hatókörnek a végén dobja el, amelyben deklarálva van. Az előző példában az ártalmatlanítás egy metódus végén történik.
Az utasítás vagy deklaráció using
által deklarált változók írásvédettek. Nem rendelheti hozzá újra, és nem adhatja át paraméterként vagy out
paraméterkéntref
.
Egy using
utasításban több azonos típusú példányt is deklarálhat, ahogyan az alábbi példa mutatja:
using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
// Process both files
}
Ha több példányt deklarál egy using
utasításban, azok a deklaráció fordított sorrendjében lesznek megsemmisítve.
Az utasítást és a using
deklarációt egy olyan refstruktúrapéldánysal is használhatja, amely megfelel az eldobható mintának. Ez azt jelent, hogy egy példánymetódussal Dispose
rendelkezik, amely elérhető, paraméter nélküli, és visszatérési típussal void
rendelkezik.
Az using
utasítás a következő formában is szerepelhet:
using (expression)
{
// ...
}
ahol expression
eldobható példányt hoz létre. Az alábbi példa a következőket mutatja be:
StreamReader reader = File.OpenText(filePath);
using (reader)
{
// Process file content
}
Figyelmeztetés
Az előző példában, miután az ellenőrzés elhagyja az using
utasítást, egy eldobható példány továbbra is hatókörben marad, amíg az már el van állítva. Ha tovább használja ezt a példányt, előfordulhat, hogy kivételt tapasztal, ObjectDisposedExceptionpéldául. Ezért javasoljuk, hogy deklaráljon egy eldobható változót az using
utasításban vagy a deklarációban using
.
C# nyelvspecifikáció
További információkért lásd a C# nyelvspecifikációjának a "using statement" szakaszát, valamint a "mintaalapú használat" és a "deklarációk használata" című javaslati megjegyzést.