Hoppa till innehåll

Enum, filer och undantag

↑

Exemplen är oberoende C#-utdrag för moderna .NET-konsolprojekt, om inget annat anges. Klassdeklarationer och toppnivåkod kan placeras i samma Program.cs-fil, med toppnivåkoden först.

Enum ger namn åt en begränsad uppsättning numeriska värden. Filhantering kan misslyckas av yttre orsaker; undantag beskriver fel som behöver hanteras.

En enum är en värdetyp med namn på heltalsvärden. Använd den hellre än oförklarade tal för ett bestämt antal alternativ. En enum kan ändå innehålla numeriska värden som saknar namn, så validera extern indata.

Example.cs
GameState state = GameState.Playing;
if (state == GameState.Playing)
Console.WriteLine("Game running");
enum GameState { Menu, Playing, Paused }

File.WriteAllText och File.ReadAllText är enkla för små textfiler. Välj en sökväg som passar miljön och tänk på kodning, rättigheter och filstorlek. I Unity används normalt en skrivbar persistent-data-sökväg för sparfiler.

Example.cs
using System.IO;
string path = Path.Combine(Path.GetTempPath(), "hcstech-example.txt");
File.WriteAllText(path, "Hello file");
Console.WriteLine(File.ReadAllText(path));
File.Delete(path);

Fånga bara undantag som du kan hantera på ett meningsfullt sätt. finally kör städning oavsett om ett undantag inträffar; using hjälper med resurser som ska frigöras. Dölj inte alla fel tyst.

Example.cs
using System.IO;
try
{
string text = File.ReadAllText("missing-file.txt");
Console.WriteLine(text);
}
catch (FileNotFoundException)
{
Console.WriteLine("No saved data found.");
}
finally
{
Console.WriteLine("Read attempt finished.");
}

Fördjupning: modellera tillstånd och hantera resurser och fel

Section titled “Fördjupning: modellera tillstånd och hantera resurser och fel”

Enum ger namn, inte automatisk indatavalidering

Section titled “Enum ger namn, inte automatisk indatavalidering”

En enum ger namn åt heltalskonstanter, vilket gör GameState.Paused tydligare än ett okänt tal. Normalt bygger enum på int, och vilket heltal som helst inom den underliggande typen kan konverteras till enumtypen, även om ingen medlem har just det värdet. Validera därför extern indata med Enum.IsDefined eller en uttrycklig mappning i stället för att anta att alla värden är giltiga.

En sökväg kanske inte finns, åtkomst kan nekas och disken kan vara full. File.ReadAllText och File.WriteAllText passar små filer; större data kan behöva strömmar och asynkron I/O. Behandla aldrig opålitliga filnamn som säkra sökvägsdelar utan kontroll. I Unity bör du använda skrivbara mappar som Application.persistentDataPath snarare än försöka ändra paketerade assets i en färdig build.

Program.cs
using System.IO;
string path = Path.Combine(Path.GetTempPath(), "hcstech-example.txt");
try
{
File.WriteAllText(path, "Saved");
Console.WriteLine(File.ReadAllText(path));
}
catch (IOException ex)
{
Console.Error.WriteLine($"Storage failed: {ex.Message}");
}

Undantag beskriver fel utanför normala resultat

Section titled “Undantag beskriver fel utanför normala resultat”

Använd undantag för fel som lagring utan åtkomst eller brutna metodkontrakt, inte som standardmetod för varje förväntad spelarinmatning. Fånga ett specifikt undantag när du kan återhämta dig eller tillföra sammanhang. throw; inne i catch bevarar den ursprungliga stackinformationen medan throw ex; förstör viktig information. finally körs vid normal avslutning och undantag; using och await using är vanligen tydligare för resurser som måste stängas.

Ett tomt catch kan få en skadad sparfil att se ut som en lyckad laddning. Om ett fel inte kan hanteras lokalt bör det skickas vidare eller få mer sammanhang med det ursprungliga undantaget som inner exception. Rapportera fel på ett sätt som passar programmet, men visa inte hemligheter eller interna filsystemsvägar för opålitliga användare.

Använd enum för namngivna lägen, filer för beständig data och riktad felhantering när externa operationer kan misslyckas.

Anta inte att en fil finns eller att skrivning lyckas. Använd throw; i stället för throw ex; när samma undantag ska kastas vidare med rätt stackspår.

Skapa en enum för spelläge och hantera en saknad sparfil utan krasch.

Visa ett lösningsförslag

Använd enum GameState och fånga FileNotFoundException vid läsningen.