using – příkaz (Referenční dokumentace jazyka C#)
Poskytuje pohodlný syntax, který zajišťuje správné použití IDisposable objektů. Počínaje jazykem C# 8,0 using příkaz zajišťuje správné použití IAsyncDisposable objektů.
Příklad
Následující příklad ukazuje, jak použít using příkaz.
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using (var reader = new StringReader(manyLines))
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
Počínaje jazykem C# 8,0 můžete použít následující alternativní syntaxi pro using příkaz, který nevyžaduje složené závorky:
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using var reader = new StringReader(manyLines);
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
Poznámky
File a Font jsou příklady spravovaných typů, které přistupují k nespravovaným prostředkům (v tomto případě popisovače souborů a kontexty zařízení). Existuje mnoho dalších druhů nespravovaných prostředků a typů knihoven tříd, které je zapouzdřují. Všechny tyto typy musí implementovat IDisposable rozhraní nebo IAsyncDisposable rozhraní.
Pokud IDisposable je životnost objektu omezena na jedinou metodu, měli byste deklarovat a vytvořit jeho instanci v using příkazu. usingPříkaz volá Dispose metodu na objekt správným způsobem a (při použití, jak je uvedeno výše), také způsobí, že se objekt sám vrátí do rozsahu, jakmile Dispose je volán. V rámci using bloku je objekt jen pro čtení a nedá se změnit ani znovu přiřadit. Pokud objekt implementuje IAsyncDisposable místo IDisposable , using příkaz zavolá DisposeAsync a awaits vrátí ValueTask . Další informace o naleznete v IAsyncDisposable tématu Implementing a DisposeAsync Method.
usingPříkaz zajistí, že Dispose (nebo DisposeAsync ) je volána i v případě, že v rámci bloku dojde k výjimce using . Stejný výsledek lze dosáhnout vložením objektu do try bloku a následným voláním Dispose (nebo DisposeAsync ) v finally bloku. to je způsob, jakým using je příkaz přeložen kompilátorem. Výše uvedený příklad kódu se v době kompilace rozšíří na následující kód (Poznamenejte si nadbytečné složené závorky pro vytvoření omezeného oboru pro objekt):
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
{
var reader = new StringReader(manyLines);
try
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
finally
{
reader?.Dispose();
}
}
Novější using syntaxe příkazu se překládá na podobný kód. tryBlok se otevře, kde je proměnná deklarována. finallyBlok se přidá na konec ohraničujícího bloku, obvykle na konci metody.
Další informace o try - finally příkazu naleznete v článku try-finally .
V jednom příkazu lze deklarovat více instancí typu using , jak je znázorněno v následujícím příkladu. Všimněte si, že nemůžete použít implicitní typové proměnné ( var ), pokud deklarujete více proměnných v jednom příkazu:
string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";
using (StringReader left = new StringReader(numbers),
right = new StringReader(letters))
{
string? item;
do
{
item = left.ReadLine();
Console.Write(item);
Console.Write(" ");
item = right.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
Můžete zkombinovat více deklarací stejného typu pomocí nové syntaxe představené v jazyce C# 8, jak je znázorněno v následujícím příkladu:
string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";
using StringReader left = new StringReader(numbers),
right = new StringReader(letters);
string? item;
do
{
item = left.ReadLine();
Console.Write(item);
Console.Write(" ");
item = right.ReadLine();
Console.WriteLine(item);
} while (item != null);
Můžete vytvořit instanci objektu prostředku a pak předat proměnnou using příkazu, ale to není doporučený postup. V takovém případě, když ovládací prvek opustí using blok, objekt zůstane v oboru, ale pravděpodobně nemá přístup k nespravovaným prostředkům. Jinými slovy, již není zcela inicializován. Pokud se pokusíte použít objekt mimo using blok, riskujete, že bude vyvolána výjimka. Z tohoto důvodu je lepší vytvořit instanci objektu v using příkazu a omezit svůj rozsah na using blok.
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
var reader = new StringReader(manyLines);
using (reader)
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
// reader is in scope here, but has been disposed
Další informace o odstraňování IDisposable objektů najdete v tématu použití objektů, které implementují IDisposable.
specifikace jazyka C#
Další informace naleznete ve specifikaci jazyka C#v příkazu Using . Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.