Opschoningscode uitvoeren met ten slotte
Het doel van een finally
instructie is ervoor te zorgen dat de benodigde opschoonbewerking van objecten, meestal objecten die externe resources bevatten, onmiddellijk plaatsvindt, zelfs als er een uitzondering wordt gegenereerd. Een voorbeeld van een dergelijke opschoonactie is dat er onmiddellijk na gebruik wordt aangeroepen CloseFileStream in plaats van te wachten totdat het object door de algemene taalruntime wordt verzameld, als volgt:
static void CodeWithoutCleanup()
{
FileStream? file = null;
FileInfo fileInfo = new FileInfo("./file.txt");
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
file.Close();
}
Opmerking
Als u de vorige code wilt omzetten in een try-catch-finally
instructie, wordt de opschoningscode als volgt gescheiden van de werkende code.
static void CodeWithCleanup()
{
FileStream? file = null;
FileInfo? fileInfo = null;
try
{
fileInfo = new FileInfo("./file.txt");
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
}
finally
{
file?.Close();
}
}
Omdat een uitzondering op elk gewenst moment binnen het try
blok kan optreden voordat de OpenWrite()
oproep wordt aangeroepen, of de OpenWrite()
aanroep zelf kan mislukken, wordt niet gegarandeerd dat het bestand is geopend wanneer we proberen het te sluiten. Het finally
blok voegt een controle toe om ervoor te zorgen dat het FileStream object zich niet null
bevindt voordat u de Close methode aanroept. Zonder de null
controle kan het finally
blok een eigen NullReferenceExceptionblok genereren, maar het genereren van uitzonderingen in finally
blokken moet worden vermeden als dit mogelijk is.
Een databaseverbinding is een andere goede kandidaat om in een finally
blok te worden gesloten. Omdat het aantal verbindingen dat is toegestaan voor een databaseserver soms beperkt is, moet u databaseverbindingen zo snel mogelijk sluiten. Als er een uitzondering wordt gegenereerd voordat u de verbinding kunt sluiten, is het gebruik van het finally
blok beter dan wachten op garbagecollection.