C# von den Grundlagen bis zum Profi — Folge 7
Verwalten der Ressourcenlebensdauer mit Ausnahmen und IDisposable
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Code, der fehlschlagen kann, muss so gestaltet sein, dass er den Zustand nach dem Fehler enthält. Es ist nicht nur wichtig, Ausnahmen abzufangen, sondern auch sicherzustellen, dass Ressourcen wie Dateien und Verbindungen in jedem Pfad organisiert sind.
vorhersehbares Scheitern
bool TrySpendGold(int amount)
{
if (amount < 0 || Gold < amount)
{
return false;
}
Gold -= amount;
return true;
}
Häufig auftretende Ergebnisse, wie z. B. Goldmangel, können als Bool oder als separater Ergebnistyp ausgedrückt werden. Ausnahmen werden für Fehler verwendet, die im aktuellen Ablauf nur schwer normal behandelt werden können, z. B. Dateibeschädigung oder Vertragsverletzung.
Ausnahmebehandlung
try
{
string json = File.ReadAllText(path);
settings = JsonSerializer.Deserialize<Settings>(json)
?? throw new InvalidDataException("Settings are empty");
}
catch (IOException error)
{
logger.Log(error.Message);
settings = Settings.CreateDefault();
}
Fangen Sie nur Ausnahmen ab, die behandelt werden können, und stellen Sie sie entweder wieder her oder geben Sie sie mit aussagekräftigeren Informationen weiter. Wenn Sie alle Ausnahmen abfangen, ohne deren Inhalt zu bearbeiten, können sich Fehler unbemerkt verstecken.
IEinweg- und Verwendungszweck
using FileStream stream = File.OpenRead(path);
using var reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Wenn es den Verwendungsbereich verlässt, wird Dispose aufgerufen. Zusätzlich zu den normalen Rückgaben werden Dateihandles aus dem Pfad bereinigt, in dem eine Ausnahme aufgetreten ist.
GC fordert Speicher für verwaltete Objekte zurück, verspricht jedoch nicht, Dateien, Sockets oder native Puffer sofort zu schließen. Typen, die diese Ressourcen besitzen, müssen einen IDisposable-Vertrag bereitstellen.
Staaten später ersetzen
Settings LoadSettings(string path)
{
string json = File.ReadAllText(path);
return JsonSerializer.Deserialize<Settings>(json)
?? throw new InvalidDataException("Invalid settings");
}
Settings loaded = LoadSettings(path);
currentSettings = loaded;
Wenn Sie eine Einstellung komplett neu erstellen und diese durch die bestehende Einstellung ersetzen, bleibt der bestehende Zustand bestehen, auch wenn es beim Laden zu einem Fehler kommt. Bei der Ausnahmebehandlung geht es darum, den Status und die Ressourcenlebensdauer vor und nach einem Fehler vorhersehbarer zu machen als die Anzahl der Fänge.