Strängar, tecken och booleska värden
↑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.
Snabböversikt
Section titled “Snabböversikt”Strängar representerar text och booleska värden representerar villkor. Text indexeras från noll och en C#-string är oföränderlig: operationer ger nya strängar.
Så fungerar det
Section titled “Så fungerar det”Sammanfogning och interpolering
Section titled “Sammanfogning och interpolering”Använd + för att sammanfoga strängar eller $"...{uttryck}..." för att infoga värden. Interpolering blir ofta tydligare när flera värden ska visas.
string player = "Alex";int score = 25;string oldWay = player + ": " + score;string message = $"{player}: {score} points";Console.WriteLine(message);Index, tecken och escape-sekvenser
Section titled “Index, tecken och escape-sekvenser”text[0] hämtar den första UTF-16-kodenheten. Length räknar UTF-16-kodenheter, inte alltid tecken som användaren ser dem. \n ger radbrytning, \" citationstecken och verbatim-strängar med @ passar för sökvägar.
string label = "Level";char first = label[0];string multiline = "Line one\nLine two";string path = @"C:\Games\Save.txt";Console.WriteLine($"{first}, {label.Length}");Booleska värden
Section titled “Booleska värden”En bool är antingen true eller false. C# behandlar inte automatiskt heltal som booleska värden: if (1) är ogiltigt. Jämförelser ger booleska resultat.
bool isReady = true;int lives = 0;bool canPlay = isReady && lives > 0;Console.WriteLine(canPlay); // FalseFördjupning: text, tecken och villkor
Section titled “Fördjupning: text, tecken och villkor”Strängar är oföränderliga
Section titled “Strängar är oföränderliga”En string lagrar en sekvens av UTF-16-kodenheter. Metoder som Replace, Trim, ToUpper och Substring ger en ny sträng (eller motsvarande befintlig); de ändrar inte den ursprungliga variabeln om du inte tilldelar resultatet. Strängar är därför enkla att dela, men upprepad sammanfogning i en stor loop kan skapa många tillfälliga objekt. Använd StringBuilder vid omfattande upprepad textbearbetning.
string original = " Alex ";string cleaned = original.Trim().ToUpperInvariant();Console.WriteLine($"[{original}]"); // [ Alex ]Console.WriteLine(cleaned); // ALEXchar är inte alltid ett synligt tecken
Section titled “char är inte alltid ett synligt tecken”text[0] läser en char, alltså en UTF-16-kodenhet. Vissa Unicode-symboler, till exempel många emoji, kräver två kodenheter och vissa synliga tecken består av flera kodpunkter. För enkla namn med enbart vanliga latinska tecken är skillnaden sällan märkbar, men för internationella användartexter spelar den roll. Använd Unicode-medvetna API:er när du behöver arbeta med synliga tecken snarare än enskilda char.
Interpolering skiljer text från värden
Section titled “Interpolering skiljer text från värden”$"Score: {score}" sätter in resultatet från ett uttryck i en sträng. Det gör meddelanden tydliga, men välj avsiktliga format för tal och tid. Skriv {{ eller }} för klammerparenteser som ska visas bokstavligt i interpolerad text. Vid SQL eller skalkommandon får du inte bara interpolera opålitlig indata; använd parametriserade API:er i det system som ska anropas.
Booleska värden beskriver tillstånd
Section titled “Booleska värden beskriver tillstånd”En bool är true eller false. Namn som isAlive, hasKey eller canJump tydliggör avsikten. Kombinera villkor med &&, || och !. Jämförelsen if (isAlive == true) är onödigt omständlig jämfört med if (isAlive). Skilj också mellan ett lagrat booleskt fält och en egenskap som kan beräknas utifrån annat tillstånd.
När och varför?
Section titled “När och varför?”Använd gärna interpolering för utskrifter och tydliga booleska namn som isActive eller hasPermission.
Vanligt misstag
Section titled “Vanligt misstag”Index utanför strängens längd ger undantag. Emoji kan dessutom använda fler än en UTF-16-kodenhet.
Testa själv
Section titled “Testa själv”Skriv ut spelarnamn och antal liv med interpolering, följt av om spelaren har fler än noll liv.
Visa ett lösningsförslag
Console.WriteLine($"{name}: {lives}"); Console.WriteLine(lives > 0);.
