C# Academy · Lektion

switch-uttryck; fullständighetskontroller med when (C# 6-emulering)

Emulera switch-uttryck med klassiska metoder som returnerar från switch, lägg till skyddskontroller och använd default-throw för att upptäcka ohanterade fall vid körning.

Lektion 2 av 38 steg

switch-uttryck; fullständighetskontroller med when (C# 6-emulering) är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 2 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.

Plan: emulera switch

Mål: Efterlikna moderna switch-uttryck i C# 6.

  • Returnera värden från en klassisk switch
  • Gör en förhandskontroll med skyddskontroller
  • Avsluta direkt med default throw för fullständighet

Switch som returnerar ett värde

En switch som returnerar ett värde fungerar som ett switch-uttryck. default throw fångar okända värden.

using System;

public enum Grade { A, B, C, D, F }

public class Program
{
  static string Describe(Grade g)
  {
    switch (g)
    {
      case Grade.A: return "Excellent";
      case Grade.B: return "Good";
      case Grade.C: return "Average";
      case Grade.D: return "Below average";
      case Grade.F: return "Fail";
      default: throw new ArgumentOutOfRangeException("g");
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(Describe(Grade.A));
    Console.WriteLine(Describe(Grade.F));
  }
}

when via guard-kontroller

Använd guard-kontroller (ifs) för att efterlikna when-satser. Validera indata först och välj sedan gren utifrån intervall.

using System;

public class Program
{
  // Emulate: switch(score) { case var s when s >= 90: ... } using pre-guards
  static string LabelScore(int score)
  {
    if (score < 0 || score > 100) throw new ArgumentOutOfRangeException("score");

    if (score >= 90) return "A";
    if (score >= 80) return "B";
    if (score >= 70) return "C";
    if (score >= 60) return "D";
    return "F";
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(LabelScore(92)); // A
    Console.WriteLine(LabelScore(77)); // C
  }
}

Hjälpmetod för uttömmande hantering

Lägg till en liten hjälpmetod, Exhaustive.Unhandled, och anropa den i default. Tester misslyckas när ett nytt enum-värde inte hanteras.

using System;

public enum Status { New, Active, Closed }

public static class Exhaustive
{
  public static Exception Unhandled(object x)
  {
    return new InvalidOperationException("Unhandled case: " + x);
  }
}

public class Program
{
  static int ToHttp(Status s)
  {
    switch (s)
    {
      case Status.New: return 201;
      case Status.Active: return 200;
      case Status.Closed: return 410;
      default: throw Exhaustive.Unhandled(s);
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ToHttp(Status.Active)); // 200
  }
}

Guard-kontroller + switch på typmarkör

Validera data per gren med pre-guards och gör sedan en switch på diskriminanten. Det efterliknar “when” för olika fall.

using System;

public enum ShapeKind { Circle, Square }

public sealed class Shape
{
  public ShapeKind Kind;
  public double Radius; // for circle
  public double Side;   // for square
}

public class Program
{
  static double Area(Shape s)
  {
    if (s == null) throw new ArgumentNullException("s");

    // “when” guards (validate needed fields)
    if (s.Kind == ShapeKind.Circle && s.Radius < 0) throw new ArgumentException("Radius must be >= 0");
    if (s.Kind == ShapeKind.Square && s.Side < 0) throw new ArgumentException("Side must be >= 0");

    switch (s.Kind)
    {
      case ShapeKind.Circle: return Math.PI * s.Radius * s.Radius;
      case ShapeKind.Square: return s.Side * s.Side;
      default: throw new InvalidOperationException("Unhandled shape: " + s.Kind);
    }
  }

  public static void Main(string[] args)
  {
    Shape c = new Shape { Kind = ShapeKind.Circle, Radius = 2.0 };
    Console.WriteLine("Area circle = " + Area(c));
  }
}

Tips och fallgropar

Tips:

  • Föredra små metoder som returnerar (ett enda ansvar)
  • Låt default kasta ett undantag så att saknade fall upptäcks tidigt
  • Placera guard-kontroller före switch; de fungerar som when-villkor

Efterlikna uttömmande hantering

Snabbkontroll: Hur kan man i C# 6 efterlikna uttömmande switch-hantering, på liknande sätt som ett switch-uttryck med when?

Sammanfattning

Sammanfattning: Returnera från en klassisk switch som från ett switch-uttryck, lägg till guard-kontroller för “when” och använd default throw för att synliggöra saknade fall.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”switch-uttryck; fullständighetskontroller med when (C# 6-emulering)” gratis?

Ja – hela texten till ”switch-uttryck; fullständighetskontroller med when (C# 6-emulering)” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”switch-uttryck; fullständighetskontroller med when (C# 6-emulering)”?

Emulera switch-uttryck med klassiska metoder som returnerar från switch, lägg till skyddskontroller och använd default-throw för att upptäcka ohanterade fall vid körning. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 3.

Hur lång tid tar lektionen ”switch-uttryck; fullständighetskontroller med when (C# 6-emulering)”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. is-mönster; relationella och logiska mönster (C# 6-emulering)
  2. switch-uttryck; fullständighetskontroller med when (C# 6-emulering)
  3. Domänmodellering med diskriminerade unioner (records) – C# 6-emulering
← Tillbaka till C# Academy