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 een 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 Implement a DisposeAsync method voor meer informatie over het gebruik van IAsyncDisposable exemplaren.
U kunt ook een using
declaratie 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.
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 exemplaarmethode Dispose
, die toegankelijk, parameterloos is en een void
retourtype heeft.
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:
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 raden we u aan om een wegwerpvariabele in de using
instructie of met de using
declaratie te declareren.
C#-taalspecificatie
Zie de sectie Using-instructie van de C#-taalspecificatie en de voorstelnotitie over 'op patroon gebaseerd gebruik' en 'declaraties gebruiken'.