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

Viz také