IRONSOFTWAREHOME
AKTUALNOŚCI DLA PROGRAMISTÓW

Wyrażenia dopasowujące wzorce w języku C# (jak to działa dla programistów)

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Jacob Mellor
Updated: 21 kwietnia 2026

Dopasowanie wzorców w C# jest potężną funkcją, która została wprowadzona w C# 7.0 i od tego czasu został poszerzona w kolejnych wersjach. Pozwala programistom pisać bardziej zwięzły i wyrazisty kod przy obsłudze instrukcji warunkowych, sprawdzania typów oraz dekonstrukcji obiektów.

Wyrażenia dopasowania wzorców zapewniają elastyczny i intuicyjny sposób dopasowywania wartości do wzorców oraz wykonywania odpowiadających im bloków kodu. W tym artykułe zgłębimy szczegóły wyrażeń dopasowania wzorców w C#, w tym składnię, przypadki użycia i przykłady kodu. Na końcu artykułu zbadamy również trochę o bibliotece generowania PDF IronPDF od Iron Software, aby dynamicznie generować dokumenty PDF w aplikacjach C#.

Benefits of Pattern Matching in C#

Dopasowanie wzorców w kodzie C# ma wiele zalet:

  • Zwiększona czytelność: Dopasowanie wzorców upraszcza złożoną logikę warunkową, ułatwiając zrozumienie i śledzenie kodu zarówno sobie, jak i innym programistom.
  • Redukcja linii kodu: Skracając złożone instrukcje warunkowe do zwięzłych wzorców, dopasowanie wzorców pomaga usprawnić bazę kodu, prowadząc do mniejszej liczby linii kodu i bardziej zwięzłej implementacji.
  • Lepsza utrzymywalność: Klarowność oferowana przez dopasowanie wzorców ułatwia konserwację i debugowanie kodu. Przy wyraźnie wyodrębnionych wzorcach łatwiej jest identyfikować i modyfikować konkretne bloki logiczne zgodnie z potrzebami, bez wpływu na resztę bazy kodu.
  • Więcej wyrazistych algorytmów: Dopasowanie wzorców umożliwia programistom wyrażanie algorytmów w sposób bardziej naturalny i intuicyjny. Dopasowując struktury kodu do paradygmatów rozwiązywania problemów, dopasowanie wzorców ułatwia tworzenie algorytmów, które ściśle przypominają swoje modele koncepcyjne.

Types of Pattern Matching in C#

Dopasowanie wzorców jest obsługiwane przez następujące wyrażenia:

  • is wyrażenie
  • switch polecenia
  • switch wyrażenia

Następujące wzorce mogą być używane do dopasowania do konstrukcji:

Wzorce deklaracji i typów

Wzorce deklaracji i typów są istotnymi narzędziami w C# do sprawdzania zgodności typów wyrażenia w czasie wykonania z podanymi typami. Dzięki wzorcom deklaracji można jednocześnie sprawdzić zgodność i zadeklarować nową zmienną lokalną. Rozważmy następujący przykład:

object greeting = "Iron Software is Awesome!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: iron software is awesome!
}

Tutaj wzorzec deklaracji zapewnia, że jeśli wyrażenie greeting pasuje do typu string, jest przypisane do zmiennej message, umożliwiając dalsze operacje.

Gdy spełnione są jakiekolwiek z poniższych warunków, wzorzec deklaracji jest prawidłowy:

  • Typ czasu wykonywania wyrażenia to T.
  • Typ czasu wykonywania wyrażenia pochodzi od T, implementuje interfejs T lub może być niejawnie konwertowany do T.
  • Typ czasu wykonywania wyrażenia jest typem wartości nullable z podstawowym typem T.
  • Istnieje konwersja boxing lub unboxing z typu czasu wykonywania wyrażenia do typu T.

Rozważ poniższy przykład demonstrujący powyższe warunki:

int? nullableX = 8;
int y = 45;
object boxedy = y;
if (nullableX is int a && boxedy is int b)
{
    Console.WriteLine(a + b);  // output: 53
}

Tutaj nullableX pasuje do wzorca, ponieważ jest typem wartości nullable z podstawowym typem int, a boxedy pasuje, ponieważ można go unboxować do int.

Kiedy potrzebujesz sprawdzić tylko typ wyrażenia bez deklarowania nowej zmiennej, możesz wykorzystać pominięcie _, jak widać w przykładzie poniżej:

public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
{
    Bus _ => 4.00m,
    Motor _ => 8.50m,
    null => throw new ArgumentNullException(nameof(vehicle)),
    _ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
};

W tym fragmencie _ służy jako zastępstwo dla dowolnego typu pasującego do Vehicle.

Zarówno wzorce deklaracji, jak i typów zapewniają, że wyrażenia nie są puste przed dopasowaniem wzorców. Możesz sprawdzić brak pustego używając zanegowanego wzorca stałej null, jak pokazano poniżej:

if (inputVal is not null)
{
    // ...
}

To zaprzeczenie zapewnia, że inputVal nie jest null przed kontynuowaniem dalszych operacji.

Korzystając z wzorców deklaracji i typów w swoim kodzie C#, możesz zwiększyć czytelność, zredukować liczbę linii kodu i efektywniej wyrażać algorytmy. Te wzorce dostarczają zwięzły i wyrazisty sposób na obsługę logiki opartej na typach i poprawiają utrzymywalność bazy kodu.

Wzorzec stałej

Wzorce stałej służą do sprawdzenia, czy wynik wyrażenia pasuje do określonej wartości stałej. Rozważmy następujący przykład:

public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
    1 => 2.0m,
    2 => 10.0m,
    3 => 25.0m,
    4 => 60.0m,
    0 => 0.0m,
    _ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};

Tutaj wzorce stałe sprawdzają, czy visitorCount pasuje do któregokolwiek z określonych stałych wartości i zwracają odpowiadające ceny biletów.

W wzorcu stałej można używać różnych rodzajów stałych wyrażeń, takich jak:

  1. Całkowite lub zmiennoprzecinkowe literały numeryczne.
  2. Znaki.
  3. Literały znakowe.
  4. Wartości logiczne (true lub false).
  5. Wartości wyliczeniowe.
  6. Nazwa zadeklarowanego pola const lub lokalnego.
  7. null.

Wyrażenie typu Span<char> lub ReadOnlySpan<char> może pasować do stałych ciągów.

Aby sprawdzić null, wykorzystaj wzorzec stały w następujący sposób:

if (inputVal is null)
{
    return;
}

Tutaj wzorzec zapewnia, że inputVal jest null przed kontynuowaniem dalszych operacji.

Możesz również użyć zanegowanego wzorca stałej null, aby stwierdzić brak pustki:

if (inputVal is not null)
{
    // ...
}

Ten wzorzec weryfikuje, że inputVal nie jest null, pozwalając na bezpieczne wykonanie dalszych operacji.

Włączając wzorce stałej do swojego kodu C#, możesz efektywnie obsługiwać scenariusze, w których konieczne jest dopasowanie do określonych wartości stałych, poprawiając klarowność i utrzymywalność kodu.

Wzorce relacyjne

Wzorce relacyjne zapewniają sposób porównywania wyników wyrażeń ze stałymi. Rozważmy następujący przykład:

Console.WriteLine(Classify(20));  // output: Too high
Console.WriteLine(Classify(double.NaN));  // output: Unknown
Console.WriteLine(Classify(4));  // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -4.0 => "Too low",
    > 10.0 => "Too high",
    double.NaN => "Unknown",
    _ => "Acceptable",
};

Tutaj wzorce relacyjne porównują measurement względem określonych progów, aby określić jego klasyfikację.

Prawa strona wzorca relacyjnego musi być wyrażeniem stałym, które może być typu całkowitego, zmiennoprzecinkowego, char lub enum. Operatory <, >, <=, >= mogą być używane po lewej stronie.

Aby dopasować wynik wyrażenia do określonego zakresu, użyj koniunkcyjnego wzorca 'i', jak pokazano poniżej:

Console.WriteLine(GetCalendarSeason(new DateTime(2024, 3, 12)));  // output: spring
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 7, 12)));  // output: summer
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 2, 12)));  // output: winter

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    >= 3 and < 6 => "spring",
    >= 6 and < 9 => "summer",
    >= 9 and < 12 => "autumn",
    12 or (>= 1 and <3) => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};

Ten fragment opisuje, jak koniunkcyjny wzorzec 'i' jest używany do ustalenia pory kalendarzowej na podstawie miesiąca w konkretnych zakresach. Wzmiankuje również, że wzorce relacyjne zapewniają zwięzły i wyrazisty sposób na porównywanie wyników wyrażeń ze stałymi, poprawiając klarowność i utrzymywalność kodu.

Wzorzec odrzucenia

Wzorzec pominięcia, oznaczony przez _, służy do dopasowania dowolnego wyrażenia, w tym null. Oto przykład:

Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday));  // output: 5.0
Console.WriteLine(GetDiscountInPercent(null));  // output: 0.0
Console.WriteLine(GetDiscountInPercent((DayOfWeek)10));  // output: 0.0

static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch
{
    DayOfWeek.Monday => 0.5m,
    DayOfWeek.Tuesday => 12.5m,
    DayOfWeek.Wednesday => 7.5m,
    DayOfWeek.Thursday => 12.5m,
    DayOfWeek.Friday => 5.0m,
    DayOfWeek.Saturday => 2.5m,
    DayOfWeek.Sunday => 2.0m,
    _ => 0.0m,
};

W powyższym przykładzie wzorca odrzucenia obsługiwane są wszystkie możliwe wartości wejściowe. Obsługiwane są wszystkie dni tygodnia, a domyślna wartość jest zapewniana. W ten sposób obsługiwane są wszystkie możliwe wartości. Wzorzec pominięcia nie może być używany jako wzorzec w wyrażeniu is lub w instrukcji switch. W takich przypadkach wzorzec var może być używany z pominięciem, jak var _, do dopasowania dowolnego wyrażenia. Jednak wzorzec pominięcia jest dopuszczalny w wyrażeniu switch. Więcej informacji znajduje się w sekcji wzorca odrzucenia w notatce propozycji funkcji.

Wzorce logiczne

Wzorce logiczne w C# oferują potężne narzędzia do dopasowania wzorców, w tym negację, koniunkcję i alternatywę, co pozwala na bardziej elastyczne i wyraziste warunki dopasowania.

Zaprzeczenie (not wzorzec)

Wzorzec zaprzeczenia, reprezentowany przez not, pasuje do wyrażenia, kiedy wzorzec zaprzeczony nie pasuje do wyrażenia. Jest to szczególnie przydatne do sprawdzania, czy wyrażenie nie jest puste, jak pokazano poniżej:

if (input is not null)
{
    // ...
}

Tutaj blok kodu jest wykonywany, jeśli input nie jest null.

Konikcja (and wzorzec)

Wzorzec konikcji, używający słowa kluczowego and, pasuje do wyrażenia, gdy oba wzorce pasują do wyrażenia. To pozwala na łączenie wielu warunków, co ilustruje poniższy przykład:

Console.WriteLine(Classify(13));    // output: High
Console.WriteLine(Classify(-100));  // output: Too low
Console.WriteLine(Classify(5.7));   // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -40.0 => "Too low",
    >= -40.0 and < 0 => "Low",
    >= 0 and < 10.0 => "Acceptable",
    >= 10.0 and < 20.0 => "High",
    >= 20.0 => "Too high",
    double.NaN => "Unknown",
};

W tym przykładzie measurement jest klasyfikowany na podstawie zakresu jego wartości.

Alternatywa (or wzorzec)

Wzorzec alternatywy, używający słowa kluczowego or, pasuje do wyrażenia, kiedy którykolwiek wzorzec pasuje do wyrażenia. To pozwala na obsługę wielu możliwych warunków, jak pokazano poniżej:

Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19)));  // output: winter
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9)));  // output: autumn
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11)));  // output: spring

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    3 or 4 or 5 => "spring",
    6 or 7 or 8 => "summer",
    9 or 10 or 11 => "autumn",
    12 or 1 or 2 => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};

Tutaj pora kalendarzowa jest określana na podstawie miesiąca podanej daty.

Te łączniki wzorców mogą być wielokrotnie używane do tworzenia bardziej złożonych i precyzyjnych warunków dopasowania, zwiększając elastyczność i czytelność kodu.

Wzorzec właściwości

Wzorzec właściwości umożliwia dopasowywanie właściwości lub pól wyrażenia do zagnieżdżonych wzorców. Przykład tego można zobaczyć w poniższym fragmencie kodu:

static bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };

Tutaj wzorzec właściwości zapewnia, że podana data odpowiada jednemu z określonych dni konferencyjnych.

Możesz również połączyć sprawdzenie typu w czasie wykonania z deklaracją zmiennej w ramach wzorca właściwości, jak pokazano poniżej:

static string TakeFive(object input) => input switch
{
    string { Length: >= 5 } s => s.Substring(0, 5),
    string s => s,
    ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
    ICollection<char> symbols => new string(symbols.ToArray()),
    null => throw new ArgumentNullException(nameof(input)),
    _ => throw new ArgumentException("Unsupported input type."),
};

Tutaj wzorzec właściwości jest używany do obsługi ciągów znaków i kolekcji znaków, zapewniając właściwą obsługę na podstawie ich właściwości.

Wzorzec pozycyjny

W C# wzorzec pozycyjny pozwala na dekonstrukcję wyniku wyrażenia i dopasowanie wynikowych wartości do odpowiadających im zagnieżdżonych wzorców. Na przykład:

public readonly struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}

static string Classify(Point point) => point switch
{
    (0, 0) => "Origin",
    (1, 0) => "Positive X basis end",
    (0, 1) => "Positive Y basis end",
    _ => "Just a point",
};

W tym przykładzie wzorzec pozycyjny jest używany do klasyfikacji punktów na podstawie ich współrzędnych.

Ponadto możesz odnieść się do zagnieżdżonych właściwości lub pól w ramach wzorca właściwości, znanego jako rozszerzony wzorzec właściwości, wprowadzonego w C# 10:

static bool IsAnyEndOnXAxis(Segment segment) =>
    segment is { Start.Y: 0 } or { End.Y: 0 };

Ta funkcja zwiększa elastyczność wzorców właściwości poprzez umożliwienie bezpośredniego dostępu do zagnieżdżonych właściwości.

Te wzorce dostarczają potężnych mechanizmów do obsługi złożonych struktur danych i poprawy czytelności i wyrazistości kodu.

Wzorzec var

Wzorzec var pozwala na dopasowanie dowolnego typu. To może być szczególnie przydatne do uchwycenia wyników pośrednich w wyrażeniach logicznych lub gdy wymagane jest wiele sprawdzeń w ochronnikach case przełącznika.

Oto przykład ilustrujący użycie wzorca var w wyrażeniu logicznym:

static bool IsAcceptable(int id, int absLimit) =>
    SimulateDataFetch(id) is var results 
    && results.Min() >= -absLimit 
    && results.Max() <= absLimit;

static int [] SimulateDataFetch(int id)
{
    var rand = new Random();
    return Enumerable
               .Range(start: 0, count: 5)
               .Select(s => rand.Next(minValue: -10, maxValue: 11))
               .ToArray();
}

W tym przykładzie SimulateDataFetch zwraca tablicę liczb całkowitych, a wzorzec is var przechwytuje wynik w zmiennej results, umożliwiając późniejsze obliczenia na podstawie jej właściwości.

Ponadto wzorce var mogą być używane w wyrażeniach lub instrukcjach przełącznika dla zwięzłego i czytelnego kodu. Oto przykład użycia wzorca var w ochronnikach case przełącznika:

public record Point(int X, int Y);

static Point Transform(Point point) => point switch
{
    var (x, y) when x < y => new Point(-x, y),
    var (x, y) when x > y => new Point(x, -y),
    var (x, y) => new Point(x, y),
};

static void TestTransform()
{
    Console.WriteLine(Transform(new Point(1, 2)));  // output: Point { X = -1, Y = 2 }
    Console.WriteLine(Transform(new Point(5, 2)));  // output: Point { X = 5, Y = -2 }
}

W tym przykładzie wzorzec var (x, y) przechwytuje współrzędne punktu, umożliwiając różne transformacje na podstawie ich wartości.

W wzorcu var typ deklarowanej zmiennej jest wywnioskowany z typu wyrażenia w czasie kompilacji, które jest dopasowywane do wzorca.

Wzorzec var dostarcza wygodnego sposobu na obsługę różnych scenariuszy, w których specyficzny typ wyrażenia nie jest z góry znany, poprawiając klarowność i elastyczność kodu.

Przedstawiamy bibliotekę IronPDF

IronPDF Document Rendering to biblioteka od Iron Software specjalizująca się w generowaniu dokumentów PDF. Aby rozpocząć, pierwszym krokiem jest instalacja biblioteki z menedżera pakietów NuGet lub z menedżera pakietów Visual Studio.

# To install from the NuGet Package Manager Console
Install-Package IronPdf
SHELL

Poniższy obrazek pokazuje, jak zainstalować z Visual Studio Przewodnik instalacji.

C# Wyrażenia dopasowujące wzorce (Jak to działa dla programistów): Rysunek 1 - Instalacja IronPDF z menedżerem pakietów NuGet

W poniższym kodzie zobaczymy, jak wygenerować prosty dokument PDF:

using IronPdf;

namespace IronPatterns
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("-----------Iron Software-------------");
            var renderer = new ChromePdfRenderer(); // var pattern
            var content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!";

            // Declaration Pattern
            int? nullableX = 8;
            int y = 45;
            object boxedy = y;
            content += "<p>Declaration Pattern</p>";
            if (nullableX is int a && boxedy is int b)
            {
                Console.WriteLine(a + b); // output: 53
                content += $"<p>Output: {(a + b)}</p>";
            }

            // Relational patterns
            content += "<p>Relational patterns</p>";
            var season1 = GetCalendarSeason(new DateTime(2024, 2, 25));
            Console.WriteLine(season1);
            content += $"<p>2024, 2, 25: {season1}</p>";
            var season2 = GetCalendarSeason(new DateTime(2024, 5, 25));
            Console.WriteLine(season2);
            content += $"<p>2024, 5, 25: {season2}</p>";
            var season3 = GetCalendarSeason(new DateTime(2024, 7, 25));
            Console.WriteLine(season3);
            content += $"<p>2024, 7, 25: {season3}</p>";

            var pdf = renderer.RenderHtmlAsPdf(content);
            pdf.SaveAs("output.pdf"); // Saves our PdfDocument object as a PDF        
        }

        static string GetCalendarSeason(DateTime date) => date.Month switch
        {
            >= 3 and < 6 => "spring",
            >= 6 and < 9 => "summer",
            >= 9 and < 12 => "autumn",
            12 or (>= 1 and < 3) => "winter",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
        };
    }
}

Wynik

C# Wyrażenia dopasowujące wzorce (Jak to działa dla programistów): Rysunek 2

Szczegóły kodu

Tutaj używamy klasy ChromePdfRenderer w IronPDF, aby zapisać ciąg HTML do dokumentu PDF. Wynik jest zapisywany w "output.pdf".

Licencja Trial

IronPDF może być używany z licencją trial uzyskaną z Strony licencji IronPDF. Podaj identyfikator e-mail, aby wygenerować klucz licencyjny, który zostanie dostarczony na Twój adres e-mail.

"IronPdf.LicenseKey": "<Your Key>"

Umieść klucz licencyjny w pliku appsettings.json, jak pokazano powyżej.

Wnioski

Wyrażenia dopasowania wzorców w C# oferują potężny i elastyczny sposób pisania instrukcji warunkowych, sprawdzania typów oraz dekonstrukcji obiektów w sposób zwięzły i czytelny. Korzystając z dopasowania wzorców, deweloperzy mogą zwiększyć klarowność i utrzymywalność swojego kodu, minimalizując nadmiarowość i szablonowość. Niezależnie od tego, czy chodzi o sprawdzanie typów, instrukcje przełączające, czy dekonstrukcję, wyrażenia dopasowania wzorców zapewniają wszechstronny zestaw narzędzi do rozwiązywania szerokiego zakresu zadań programistycznych w C#.

Podsumowując, opanowanie wyrażeń dopasowania wzorców może znacznie poprawić Twoje umiejętności programowania w C#, umożliwiając pisanie czystszego, bardziej wyrazistego kodu, który jest łatwiejszy do zrozumienia i utrzymania. Omówiliśmy również możliwości generowania HTML do PDF za pomocą IronPDF, które można wykorzystać do generowania dokumentów PDF.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta