C# Academy · Lekcja

Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)

Proszę emulować wyrażenia switch za pomocą klasycznych metod switch zwracających wynik, dodawać sprawdzanie warunków oraz używać default throws do wykrywania nieobsłużonych przypadków w czasie działania.

Lekcja 2 z 38 kroki

Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Plan: naśladowanie switch

Cel: Naśladować współczesne wyrażenia switch w C# 6.

  • Zwracaj wartości z klasycznej instrukcji switch
  • Wstępnie sprawdzaj dane za pomocą warunków ochronnych
  • Szybko kończ działanie przez default throw, aby zapewnić obsługę wszystkich przypadków

Instrukcja switch zwracająca wartość

Instrukcja switch, która zwraca wartość, działa jak wyrażenie switch. default rzucający wyjątek przechwytuje nieznane wartości.

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” za pomocą guardów

Należy używać sprawdzania guardami (ifs), aby emulować klauzule when. Najpierw należy zweryfikować dane wejściowe, a następnie rozgałęzić logikę według zakresów.

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
  }
}

Pomocnik kompletności

Należy dodać niewielki pomocnik Exhaustive.Unhandled i wywoływać go w default. Testy zakończą się niepowodzeniem, gdy nowa wartość enuma nie będzie obsługiwana.

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
  }
}

Guardy + switch po kind

Należy zweryfikować dane dla każdej gałęzi za pomocą guardów wstępnych, a następnie wykonać switch po dyskryminatorze. Odpowiada to użyciu „when” w poszczególnych przypadkach.

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));
  }
}

Wskazówki i pułapki

Wskazówki:

  • Należy preferować małe metody zwracające wynik (jedna odpowiedzialność)
  • Należy zachować default rzucający wyjątek, aby wcześnie ujawniać brakujące przypadki
  • Należy umieszczać guardy przed switch; działają jak warunki when

Emulowanie kompletności

Szybkie sprawdzenie: Jak w C# 6 można emulować kompletną obsługę switcha, podobną do wyrażenia switch z when?

Podsumowanie

Podsumowanie: Należy zwracać wartość z klasycznego switch, podobnie jak z wyrażenia switch, dodawać guardy dla „when” i zachować default rzucający wyjątek, aby ujawniać brakujące przypadki.

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)” jest bezpłatna?

Tak — pełny tekst „Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)”?

Proszę emulować wyrażenia switch za pomocą klasycznych metod switch zwracających wynik, dodawać sprawdzanie warunków oraz używać default throws do wykrywania nieobsłużonych przypadków w czasie działa… Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wzorce is, relacyjne i logiczne (emulacja w C# 6)
  2. Wyrażenia switch i sprawdzanie kompletności za pomocą when (emulacja w C# 6)
  3. Modelowanie domeny za pomocą sum rozłącznych (rekordy) — emulacja w C# 6
← Powrót do C# Academy