Switch Case

💡 Vad är Switch?

Tänk dig att du är en receptionist på Stark Tower och behöver dirigera besökare till rätt våning. Du kan inte bara gissa - du behöver ett system som snabbt och säkert skickar folk till rätt plats baserat på vem de ska träffa.

Det är exakt vad switch gör i C-Sharp. Istället för att kedja ihop massor av if-else-statements, ger switch dig ett elegant sätt att hantera flera möjliga värden för en variabel.

Switch finns i två smaker: traditionella switch-statements (som funnits länge) och moderna switch expressions (C-Sharp 8.0+).

🔧 Grundprinciper

Princip 1: Enkelhet framför komplexitet

Switch är perfekt när du har EN variabel som kan ha flera kända värden. Som att välja mat baserat på vad klockan är - frukost, lunch eller middag.

Princip 2: Performance och läsbarhet

Switch är inte bara snyggare än långa if-else-kedjor, det är också snabbare. Kompilatorn kan optimera switch på sätt som gör det blixtnabbt.

💭 Tänk så här (Pseudokod)


OM variabeln har värde A
  GÖR sak nummer 1
ANNARS OM variabeln har värde B
  GÖR sak nummer 2
ANNARS OM variabeln har värde C
  GÖR sak nummer 3
ANNARS
  GÖR standardsaken

🚀 Minimal implementation


string dayName = "måndag";

switch (dayName)
{
    case "måndag":
        Console.WriteLine("Ugh, måndag igen...");
        break;
    case "fredag":
        Console.WriteLine("TGIF!");
        break;
    default:
        Console.WriteLine("En vanlig dag i veckan");
        break;
}

🟢 Grundläggande användning


// RPG-karaktär väljare som Game of Thrones
public static void SelectCharacter(string characterClass)
{
    switch (characterClass.ToLower())
    {
        case "warrior":
            Console.WriteLine("Du väljer Jon Snow - stridsklädd och redo för battle!");
            Console.WriteLine("Startautrustning: Långsvärd och ringbrynja");
            break;

        case "mage":
            Console.WriteLine("Du väljer Gandalf - full av magiska krafter!");
            Console.WriteLine("Startautrustning: Trollstav och spellbook");
            break;

        case "rogue":
            Console.WriteLine("Du väljer Arya Stark - snabb och smidig!");
            Console.WriteLine("Startautrustning: Dolkar och lockpicks");
            break;

        default:
            Console.WriteLine("Okänd karaktärsklass - du får vara en NPC!");
            break;
    }
}

// Användning
SelectCharacter("warrior"); // Jon Snow mode aktiverad!

🟡 Avancerad användning - Switch Expressions


// Moderne switch expression - som att uppgradera från Nokia 3310 till iPhone
public static string GetSuperheroSlogan(string heroName) => heroName switch
{
    "Superman" => "Snabbare än en kula, starkare än ett lokomotiv!",
    "Batman" => "I am the night!",
    "Spider-Man" => "With great power comes great responsibility",
    "Wonder Woman" => "I fight for those who cannot fight for themselves",
    "Flash" => "Gotta go fast!",
    _ => "Unidentified hero detected"
};

// Pattern matching med when-clauses - Jedi-nivå
public static string AnalyzeNumber(int number) => number switch
{
    0 => "Noll - tomhet som Voldemorts hjärta",
    1 => "Ett - ensamheten som Harry Potter kände",
    var n when n > 0 && n <= 10 => $"{n} - inom Gryffindor räckvidd",
    var n when n > 10 && n <= 100 => $"{n} - Hermiones kunskapsnivå",
    var n when n > 100 => $"{n} - Dumbledores visdomslevel",
    _ => "Negativa tal - Dementor energy"
};

🔴 Proffstips - Tuple Patterns


// Matrix-style decision making med tuples
public static string GetMovieRecommendation(string mood, int energy) => (mood.ToLower(), energy) switch
{
    ("happy", > 7) => "Top Gun: Maverick - action och glädje!",
    ("sad", < 5) => "The Notebook - en bra gråtfilm",
    ("excited", > 8) => "Avengers: Endgame - ultimat hype!",
    ("tired", < 3) => "En lugn dokumentär om pingviner",
    ("angry", _) => "John Wick - släpp ut frustrationen",
    (_, 10) => "Matrix - du är på topp energi!",
    _ => "Kanske bara kolla på The Office igen?"
};

// Användning
Console.WriteLine(GetMovieRecommendation("excited", 9));
// Output: Avengers: Endgame - ultimat hype!

⚠️ Vanliga misstag

  • Misstag 1: Glömma break i traditionella switch-statements. Utan break “faller” koden genom till nästa case (fall-through behavior).

// FARLIGT - utan break!
switch (dayOfWeek)
{
    case "måndag":
        mood = "trött";
        // break; <- DENNA SAKNAS! Kompileringsfel
    case "tisdag":
        mood = "fortfarande trött"; // Kommer att köras även för måndag!
        break;
}

Men…


// FARLIGT - utan break!
switch (dayOfWeek)
{
    case "måndag":
        // break; <- DENNA SAKNAS! Här funkar det då det inte finns någon kod efter case
    case "tisdag":
        mood = "fortfarande trött"; // Kommer att köras även för måndag!
        break;
}

  • Misstag 2: Använda switch expressions fel - de ska returnera värden, inte köra statements.

// FEL - switch expressions kan inte köra Console.WriteLine direkt
var result = input switch
{
    1 => Console.WriteLine("Ett"), // Kommer inte fungera!
    _ => Console.WriteLine("Annat")
};

// RÄTT - returnera värden istället
var message = input switch
{
    1 => "Ett",
    _ => "Annat"
};
Console.WriteLine(message);

📚 Sammanfattning

  • 💡 Switch statements: Perfekt för att hantera flera kända värden på en variabel
  • 💡 Switch expressions: Modernare, mer koncis syntax för att returnera värden
  • 💡 Pattern matching: Superkraft för att matcha komplexa mönster med when-clauses

😄 Obligatoriskt pappaskämt

“Why don’t switch statements ever get lost? Because they always know which case they’re in!”


Upp

Upp


Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rättigheter förbehållna.
Du får använda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du får inte använda detta verk för kommersiella ändamål utan tillstånd från upphovsmannen.