Delen via


using-instructie- zorg voor het juiste gebruik van wegwerpobjecten

De using instructie zorgt ervoor dat het juiste gebruik van een IDisposable exemplaar wordt gegarandeerd:

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);
        }
    }
}

Wanneer het besturingselement het blok van de using instructie verlaat, wordt het overgenomen IDisposable exemplaar verwijderd. Met name zorgt de using instructie ervoor dat een wegwerpexemplaren worden verwijderd, zelfs als er een uitzondering optreedt binnen het blok van de using instructie. In het voorgaande voorbeeld wordt een geopend bestand gesloten nadat alle regels zijn verwerkt.

Gebruik de await using instructie om een IAsyncDisposable exemplaar correct te gebruiken:

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}

Zie de sectie Using async disposable van het artikel Een DisposeAsync-methode implementeren voor meer informatie over het gebruik IAsyncDisposable van exemplaren.

U kunt ook een usingdeclaratie gebruiken waarvoor geen accolades nodig zijn:

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;
}

Wanneer deze wordt gedeclareerd in een using declaratie, wordt een lokale variabele verwijderd aan het einde van het bereik waarin deze wordt gedeclareerd. In het voorgaande voorbeeld vindt verwijdering plaats aan het einde van een methode.

De C#-taalreferentiedocumenten de laatst uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

Een variabele die door de using instructie of declaratie is gedeclareerd, wordt gelezen. U kunt deze niet opnieuw toewijzen of doorgeven als een ref of out parameter.

U kunt verschillende exemplaren van hetzelfde type in één using instructie declareren, zoals in het volgende voorbeeld wordt weergegeven:

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
    // Process both files
}

Wanneer u meerdere exemplaren in één using instructie declareert, worden ze in omgekeerde volgorde van declaratie verwijderd.

U kunt ook de using instructie en declaratie gebruiken met een exemplaar van een refstruct die past bij het wegwerppatroon. Dat wil gezegd, het heeft een instantiemethode Dispose die toegankelijk, parameterloos is en een void retourtype heeft.

Een return binnenkant van een using blok garandeert nog steeds verwijdering. De compiler herschrijft deze in een try/finally, zodat de resource Dispose altijd wordt aangeroepen voordat de methode daadwerkelijk wordt geretourneerd.

De using instructie kan ook van de volgende vorm zijn:

using (expression)
{
    // ...
}

waarbij expression een wegwerpexemplaren worden geproduceerd. In het volgende voorbeeld ziet u dat formulier:

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Waarschuwing

Nadat het besturingselement in het voorgaande voorbeeld de using instructie verlaat, blijft een wegwerpexemplaren binnen het bereik terwijl deze al is verwijderd. Als u die instantie verder gebruikt, kunt u bijvoorbeeld ObjectDisposedExceptioneen uitzondering tegenkomen. Daarom moet u een wegwerpvariabele in de using instructie of met de using declaratie declareren.

C#-taalspecificatie

Zie de sectie Using-instructie van de C#-taalspecificatie voor meer informatie.

Zie ook