Dopasowanie wzorcaPattern Matching

Wzorce testowania, czy wartość nie ma określonej kształti może wyodrębnić informacji z wartości, gdy ma ona odpowiedniego kształtu.Patterns test that a value has a certain shape, and can extract information from the value when it has the matching shape. Dopasowanie wzorca zapewnia bardziej zwięzły widok składni dla algorytmów używanych już dziś.Pattern matching provides more concise syntax for algorithms you already use today. Można już utworzyć algorytmami przy użyciu istniejących Składnia dopasowania do wzorca.You already create pattern matching algorithms using existing syntax. Piszesz if lub switch instrukcji, które testują wartości.You write if or switch statements that test values. Następnie gdy te wyrażenia są zgodne, wyodrębnić i korzystać z tej wartości.Then, when those statements match, you extract and use information from that value. Nowe elementy składni są rozszerzeniami do instrukcji, które znasz już: is i switch.The new syntax elements are extensions to statements you are already familiar with: is and switch. Te nowe rozszerzenia łączyć testowania wartość i wyodrębnianie informacji.These new extensions combine testing a value and extracting that information.

W tym temacie omówimy nowej składni, aby pokazać, jak umożliwia stosowanie kodu czytelne i zwięzłe.In this topic, we'll look at the new syntax to show you how it enables readable, concise code. Dopasowanie wzorca umożliwia idiomy, w którym dane i kodu są rozdzielone, w przeciwieństwie do projektów zorientowana obiektowo, gdzie danych i metod, które manipulować nimi są ściśle powiązane.Pattern matching enables idioms where data and the code are separated, unlike object oriented designs where data and the methods that manipulate them are tightly coupled.

Aby zilustrować te nowe idiomy, Użyjmy struktur, które reprezentują kształty geometryczne, przy użyciu instrukcji dopasowania do wzorca.To illustrate these new idioms, let's work with structures that represent geometric shapes using pattern matching statements. Znasz prawdopodobnie tworzenia hierarchii klas i tworzenie metod wirtualnych i przesłonięte metody do dostosowywania zachowania obiektu na podstawie typu środowiska uruchomieniowego obiektu.You are probably familiar with building class hierarchies and creating virtual methods and overridden methods to customize object behavior based on the runtime type of the object.

Techniki te nie są możliwe dla danych, które nie jest umieszczonymi w hierarchii klas.Those techniques aren't possible for data that isn't structured in a class hierarchy. Danych i metod są oddzielone, należy się inne narzędzia.When data and methods are separate, you need other tools. Nowy dopasowywania do wzorca konstrukcji Włącz oczyszczarki składni do badania danych i manipulowania przepływ sterowania w oparciu o dowolny warunek tych danych.The new pattern matching constructs enable cleaner syntax to examine data and manipulate control flow based on any condition of that data. Już zapisu if instrukcji i switch testu, wartość zmiennej.You already write if statements and switch that test a variable's value. Piszesz is instrukcji, które testują typ zmiennej.You write is statements that test a variable's type. Dopasowanie wzorca dodaje nowe możliwości do tych instrukcji.Pattern matching adds new capabilities to those statements.

W tym temacie będziesz tworzyć metodę, która oblicza obszaru różnych kształtów geometrycznych.In this topic, you'll build a method that computes the area of different geometric shapes. Jednak wykonasz bez konieczności uciekania się do technik zorientowana obiektowo i tworzenie hierarchii klas dla różnych kształtów.But, you'll do it without resorting to object oriented techniques and building a class hierarchy for the different shapes. Użyjesz dopasowywania do wzorca zamiast tego.You'll use pattern matching instead. Podczas wykonywania kroków w tym przykładzie, natomiast ten kod przy użyciu jak będzie mieć strukturę jako hierarchię obiektów.As you go through this sample, contrast this code with how it would be structured as an object hierarchy. Gdy danych należy zapytań i manipulowania nimi nie jest hierarchii klas, dopasowywania do wzorca umożliwia bardzo elegancki projekty.When the data you must query and manipulate is not a class hierarchy, pattern matching enables very elegant designs.

Zamiast począwszy od definicji interfejsu abstrakcyjne kształtu, a następnie dodawania innego kształtu określonych klas, Zacznijmy zamiast prostych danych tylko definicje dla każdego z kształtów geometrycznych:Rather than starting with an abstract shape definition and adding different specific shape classes, let's start instead with simple data only definitions for each of the geometric shapes:

public class Square
{
    public double Side { get; }

    public Square(double side)
    {
        Side = side;
    }
}
public class Circle
{
    public double Radius { get; }

    public Circle(double radius)
    {
        Radius = radius;
    }
}
public struct Rectangle
{
    public double Length { get; }
    public double Height { get; }

    public Rectangle(double length, double height)
    {
        Length = length;
        Height = height;
    }
}
public class Triangle
{
    public double Base { get; }
    public double Height { get; }

    public Triangle(double @base, double height)
    {
        Base = @base;
        Height = height;
    }
}

Z tych struktur Napiszmy metodę, która oblicza obszaru niektóre kształtu.From these structures, let's write a method that computes the area of some shape.

is Wpisz wyrażenie wzorcaThe is type pattern expression

Przed C# 7.0, będziesz potrzebować w celu przetestowania każdego typu w szeregu if i is instrukcji:Before C# 7.0, you'd need to test each type in a series of if and is statements:

public static double ComputeArea(object shape)
{
    if (shape is Square)
    {
        var s = (Square)shape;
        return s.Side * s.Side;
    } 
    else if (shape is Circle)
    {
        var c = (Circle)shape;
        return c.Radius * c.Radius * Math.PI;
    }
    // elided
    throw new ArgumentException(
        message: "shape is not a recognized shape",
        paramName: nameof(shape));
}

Powyższy kod to wyrażenie klasycznego wpisz wzór: testujesz zmiennej do określenia jej typ i wykonywania różnych akcji, na podstawie tego typu.That code above is a classic expression of the type pattern: You're testing a variable to determine its type and taking a different action based on that type.

Ten kod staje się prostszy przy użyciu rozszerzeń is wyrażenie można przypisać zmiennej Jeśli test zakończy się pomyślnie:This code becomes simpler using extensions to the is expression to assign a variable if the test succeeds:

public static double ComputeAreaModernIs(object shape)
{
    if (shape is Square s)
        return s.Side * s.Side;
    else if (shape is Circle c)
        return c.Radius * c.Radius * Math.PI;
    else if (shape is Rectangle r)
        return r.Height * r.Length;
    // elided
    throw new ArgumentException(
        message: "shape is not a recognized shape",
        paramName: nameof(shape));
}

W tej wersji zaktualizowano is wyrażenie sprawdza zmienną i przypisuje go do nowej zmiennej odpowiedniego typu.In this updated version, the is expression both tests the variable and assigns it to a new variable of the proper type. Ponadto Zwróć uwagę, że ta wersja zawiera Rectangle typ, który jest struct.Also, notice that this version includes the Rectangle type, which is a struct. Nowy is wyrażenie współpracuje z typów wartości, a także typy odwołań.The new is expression works with value types as well as reference types.

Język reguł w wyrażeniach dopasowania wzorca pomóc w uniknięciu niewłaściwie wyniki wyrażenia dopasowania.Language rules for pattern matching expressions help you avoid misusing the results of a match expression. W przykładzie powyżej zmiennych s, c, i r znajdują się tylko w zakresie i zdecydowanie przypisana, gdy wyrażenia dopasowania wzorca odpowiednich true wyników.In the example above, the variables s, c, and r are only in scope and definitely assigned when the respective pattern match expressions have true results. Jeśli spróbujesz użyć jednej zmiennej w innej lokalizacji, kod generuje błędy kompilatora.If you try to use either variable in another location, your code generates compiler errors.

Przeanalizujmy oba te zasady szczegółowo, począwszy od zakresu.Let's examine both of those rules in detail, beginning with scope. Zmienna c znajduje się w zakresie tylko w else gałęzi pierwszego if instrukcji.The variable c is in scope only in the else branch of the first if statement. Zmienna s znajduje się w zasięgu w metodzie ComputeAreaModernIs.The variable s is in scope in the method ComputeAreaModernIs. To dlatego, że każda gałąź if instrukcji ustanawia oddzielny zakres zmiennych.That's because each branch of an if statement establishes a separate scope for variables. Jednak if instrukcji, sama nie jest.However, the if statement itself does not. Oznacza to, że zmienne zadeklarowane w if instrukcji znajdują się w tym samym zakresie co if — instrukcja (metoda w tym przypadku.) To zachowanie nie jest specyficzna dla dopasowywania do wzorca, ale jest zdefiniowany zachowanie dla zmiennej zakresów i if i else instrukcji.That means variables declared in the if statement are in the same scope as the if statement (the method in this case.) This behavior is not specific to pattern matching, but is the defined behavior for variable scopes and if and else statements.

Zmienne c i s są przypisane, kiedy odpowiednie if instrukcje są spełnione z powodu zdecydowanie przypisany podczas true mechanizm.The variables c and s are assigned when the respective if statements are true because of the definitely assigned when true mechanism.

Porada

Przykłady w tym temacie Użyj zalecanych konstrukcji, którego dopasowania do wzorca is wyrażenie zdecydowanie przypisuje zmiennej dopasowania w true gałęzi if instrukcji.The samples in this topic use the recommended construct where a pattern match is expression definitely assigns the match variable in the true branch of the if statement. Logika może odtworzyć mówiąc if (!(shape is Square s)) , a zmienna s mogłoby być zdecydowanie przypisywany tylko w false gałęzi.You could reverse the logic by saying if (!(shape is Square s)) and the variable s would be definitely assigned only in the false branch. Gdy ta operacja jest nieprawidłowa C#, nie zaleca się ponieważ jest bardziej skomplikowane wykonać logikę.While this is valid C#, it is not recommended because it is more confusing to follow the logic.

Te reguły oznacza, że masz mało prawdopodobne, aby przypadkowo dostęp wynik wyrażenia dopasowania wzorca, gdy ten wzorzec nie zostało spełnione.These rules mean that you are unlikely to accidentally access the result of a pattern match expression when that pattern was not met.

Za pomocą dopasowywania do wzorca switch instrukcjiUsing pattern matching switch statements

Gdy czasie, może być konieczne obsługuje inne typy kształtów.As time goes on, you may need to support other shape types. Wraz z rozwojem liczbę warunków, które testujesz znajdziesz w tym za pomocą is wyrażeniach dopasowania do wzorca może stać się zbyt skomplikowana.As the number of conditions you are testing grows, you'll find that using the is pattern matching expressions can become cumbersome. Oprócz wymagające if instrukcji dla każdego typu, którego chcesz sprawdzić, is wyrażenia są ograniczone do testowania, jeśli wartość wejściowa pasuje do jednego typu.In addition to requiring if statements on each type you want to check, the is expressions are limited to testing if the input matches a single type. W tym przypadku będzie zauważysz, że switch wyrażenia dopasowania wzorca, staje się lepszym rozwiązaniem.In this case, you'll find that the switch pattern matching expressions becomes a better choice.

Tradycyjne switch instrukcja została wyrażenia wzorca: ono obsługiwane wzór stałej.The traditional switch statement was a pattern expression: it supported the constant pattern. Można porównać zmienną dowolną stałą używane w case instrukcji:You could compare a variable to any constant used in a case statement:

public static string GenerateMessage(params string[] parts)
{
    switch (parts.Length)
    {
        case 0:
            return "No elements to the input";
        case 1:
            return $"One element: {parts[0]}";
        case 2:
            return $"Two elements: {parts[0]}, {parts[1]}";
        default:
            return $"Many elements. Too many to write";
    }
}

Z wzorcem jedynym obsługiwanym przez switch instrukcja została wzór stałej.The only pattern supported by the switch statement was the constant pattern. Dodatkowo została ograniczona do liczbowych typów i string typu.It was further limited to numeric types and the string type. Te ograniczenia zostały usunięte, a teraz możesz zapisać switch instrukcji przy użyciu wzorca typu:Those restrictions have been removed, and you can now write a switch statement using the type pattern:

public static double ComputeAreaModernSwitch(object shape)
{
    switch (shape)
    {
        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        case Rectangle r:
            return r.Height * r.Length;
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}

Dopasowanie wzorca switch instrukcja używa dobrze znanej składni dla deweloperów, którzy korzystali z tradycyjnych stylu C switch instrukcji.The pattern matching switch statement uses familiar syntax to developers who have used the traditional C-style switch statement. Każdy case jest obliczane i wykonywany jest kod, pod warunkiem, że zmienna wejściowa pasuje.Each case is evaluated and the code beneath the condition that matches the input variable is executed. Wykonywanie kodu nie może "przechodzić" od jednego wyrażenia case dalej; Składnia case instrukcja wymaga każdy case kończyć break, return, lub goto.Code execution cannot "fall through" from one case expression to the next; the syntax of the case statement requires that each case end with a break, return, or goto.

Uwaga

goto Instrukcji, aby przejść do innej etykiety są prawidłowe tylko dla wzór stałej (instrukcja switch klasycznego).The goto statements to jump to another label are valid only for the constant pattern (the classic switch statement).

Istnieją istotne nowe zasady switch instrukcji.There are important new rules governing the switch statement. Ograniczenia dotyczące typu zmiennej w switch wyrażenia zostały usunięte.The restrictions on the type of the variable in the switch expression have been removed. Dowolny typ, taki jak object w tym przykładzie, może być używany.Any type, such as object in this example, may be used. Wyrażenia case nie są już ograniczona do wartości stałych.The case expressions are no longer limited to constant values. Usunięcie tego ograniczenia oznacza, że zmiana kolejności switch sekcje mogą zmienić zachowanie programu.Removing that limitation means that reordering switch sections may change a program's behavior.

Gdy ograniczony do wartości stałych, ma więcej niż jeden case etykieta może być zgodna z wartością switch wyrażenia.When limited to constant values, no more than one case label could match the value of the switch expression. Połączenie z regułą, co switch sekcji nie należy przechodzić do następnej sekcji, a a następnie, który switch sekcje mogą być nieco inaczej rozmieszczone w dowolnej kolejności bez wywierania wpływu na zachowanie.Combine that with the rule that every switch section must not fall through to the next section, and it followed that the switch sections could be rearranged in any order without affecting behavior. Obecnie z bardziej powszechny switch wyrażeń, kolejność, w każdej sekcji dla Ciebie ważne.Now, with more generalized switch expressions, the order of each section matters. switch Wyrażenia są obliczane w kolejności tekstową.The switch expressions are evaluated in textual order. Wykonanie przenoszone jest do pierwszego switch etykietę, która odpowiada switch wyrażenia.Execution transfers to the first switch label that matches the switch expression.
Należy pamiętać, że default przypadku tylko zostaną wykonane, jeśli pasuje inne etykiety wielkości liter.Note that the default case will only be executed if no other case labels match. default Przypadek jest oceniany ostatnio, niezależnie od ich kolejność tekstową.The default case is evaluated last, regardless of its textual order. W przypadku nie default wielkość liter i żaden z innych case instrukcje są zgodne, wykonywanie jest kontynuowane po instrukcja po słowie switch instrukcji.If there is no default case, and none of the other case statements match, execution continues at the statement following the switch statement. Żaden z case etykiety Kod jest wykonywany.None of the case labels code is executed.

when klauzule case wyrażeńwhen clauses in case expressions

Możesz wprowadzić specjalne przypadki te kształty, które mają obszaru 0 za pomocą when klauzuli w case etykiety.You can make special cases for those shapes that have 0 area by using a when clause on the case label. Kwadratu o długości boku 0 lub koła o promieniu 0 ma obszar 0.A square with a side length of 0, or a circle with a radius of 0 has a 0 area. Określasz, przy użyciu warunku when klauzuli w case etykiety:You specify that condition using a when clause on the case label:

public static double ComputeArea_Version3(object shape)
{
    switch (shape)
    {
        case Square s when s.Side == 0:
        case Circle c when c.Radius == 0:
            return 0;

        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}

Ta zmiana pokazuje kilka ważnych punktów o nowej składni.This change demonstrates a few important points about the new syntax. Po pierwsze, wiele case etykiety mogą być stosowane do jednej switch sekcji.First, multiple case labels can be applied to one switch section. Blok instrukcji jest wykonywana po jest dowolny z tych etykiet true.The statement block is executed when any of those labels is true. W tym wypadku Jeśli switch wyrażenie jest okrąg lub pole z obszaru 0, metoda zwraca wartość stała 0.In this instance, if the switch expression is either a circle or a square with 0 area, the method returns the constant 0.

W tym przykładzie przedstawiono dwie różne zmienne w dwóch case etykiet w pierwszym switch bloku.This example introduces two different variables in the two case labels for the first switch block. Należy zauważyć, że instrukcje w tym switch bloku nie należy używać zmiennych albo c (dla okręgu) lub s (w przypadku kwadrat).Notice that the statements in this switch block do not use either the variables c (for the circle) or s (for the square). Żadna z tych zmiennych jest zdecydowanie przypisana w tym switch bloku.Neither of those variables is definitely assigned in this switch block. Jeśli jeden z tych przypadków są zgodne, wyraźnie zmiennych zostały przypisane.If either of these cases match, clearly one of the variables has been assigned. Jednak nie jest możliwe Poinformuj który ma przypisane w czasie kompilacji, ponieważ w obu przypadkach może być zgodny w czasie wykonywania.However, it is impossible to tell which has been assigned at compile-time, because either case could match at runtime. Z tego powodu większości przypadków Jeśli używanych jest wiele case etykiety dla tego samego bloku, nie będzie wprowadzenie nowej zmiennej w case instrukcji lub możesz tylko używać zmiennej w when klauzuli.For that reason, most times when you use multiple case labels for the same block, you won't introduce a new variable in the case statement, or you will only use the variable in the when clause.

O dodaniu te kształty z obszaru 0 Dodajmy kilka większą liczbę typów kształtu: prostokąt i trójkąta:Having added those shapes with 0 area, let's add a couple more shape types: a rectangle and a triangle:

public static double ComputeArea_Version4(object shape)
{
    switch (shape)
    {
        case Square s when s.Side == 0:
        case Circle c when c.Radius == 0:
        case Triangle t when t.Base == 0 || t.Height == 0:
        case Rectangle r when r.Length == 0 || r.Height == 0:
            return 0;

        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        case Triangle t:
            return t.Base * t.Height / 2;
        case Rectangle r:
            return r.Length * r.Height;
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}

Dodaje ten zestaw zmian case etykiet w przypadku wymiaru degeneracji i etykiet oraz bloków dla każdego nowe kształty.This set of changes adds case labels for the degenerate case, and labels and blocks for each of the new shapes.

Na koniec możesz dodać null przypadek, aby upewnić się, argument nie jest null:Finally, you can add a null case to ensure the argument is not null:

public static double ComputeArea_Version5(object shape)
{
    switch (shape)
    {
        case Square s when s.Side == 0:
        case Circle c when c.Radius == 0:
        case Triangle t when t.Base == 0 || t.Height == 0:
        case Rectangle r when r.Length == 0 || r.Height == 0:
            return 0;

        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        case Triangle t:
            return t.Base * t.Height / 2;
        case Rectangle r:
            return r.Length * r.Height;
        case null:
            throw new ArgumentNullException(paramName: nameof(shape), message: "Shape must not be null");
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}

Specjalnego zachowania w przypadku null wzorzec jest interesująca ponieważ stała null we wzorcu nie ma typu, ale mogą być konwertowane na dowolnym typem referencyjnym lub typ dopuszczający wartość null.The special behavior for the null pattern is interesting because the constant null in the pattern does not have a type but can be converted to any reference type or nullable type. Zamiast przekonwertować null do dowolnego typu, języka definiuje, które null wartości nie będą zgodne wpisz wzór, niezależnie od typu zmiennej w czasie kompilacji.Rather than convert a null to any type, the language defines that a null value will not match any type pattern, regardless of the compile-time type of the variable. To zachowanie sprawia, że nowe switch na podstawie typu wzorzec zgodny z is instrukcji: is instrukcji zawsze zwracają false gdy wartość sprawdzany jest null.This behavior makes the new switch based type pattern consistent with the is statement: is statements always return false when the value being checked is null. Również jest prostsza: po sprawdzeniu typ, nie potrzebujesz dodatkowe sprawdzanie wartości null.It's also simpler: once you have checked the type, you don't need an additional null check. Widać, że z faktu, że nie istnieją żadne null sprawdza, czy w żadnym przypadku bloków powyższe przykłady: nie są konieczne, ponieważ pasujących do wzorca typu gwarantuje wartości innej niż null.You can see that from the fact that there are no null checks in any of the case blocks of the samples above: they are not necessary, since matching the type pattern guarantees a non-null value.

var deklaracje w case wyrażeńvar declarations in case expressions

Wprowadzenie var jako jedno z wyrażeń dopasowanie wprowadza nowe reguły do dopasowania do wzorca.The introduction of var as one of the match expressions introduces new rules to the pattern match.

Pierwsza reguła jest to, że var znajduje się za deklaracją typ reguły wnioskowania: typ jest wnioskowany być typu statycznego wyrażenia switch.The first rule is that the var declaration follows the normal type inference rules: The type is inferred to be the static type of the switch expression. Od tej zasady zawsze zgodny typ.From that rule, the type always matches.

Druga reguła jest to, że var deklaracja nie ma sprawdzanie wartości null, który zawiera inne typu wzorzec wyrażenia.The second rule is that a var declaration does not have the null check that other type pattern expressions include. Oznacza to, zmienna może mieć wartości null i sprawdzanie wartości null jest to konieczne w takiej sytuacji.That means the variable may be null, and a null check is necessary in that case.

Te dwie reguły oznaczają, że w wielu przypadkach var deklaracji w case wyrażenie jest zgodne z warunkami tej samej jako default wyrażenia.Those two rules mean that in many instances, a var declaration in a case expression matches the same conditions as a default expression. Ponieważ każdy przypadek, inny niż domyślny jest preferowana względem default przypadku default przypadek nigdy nie zostanie wykonana.Because any non-default case is preferred to the default case, the default case will never execute.

Uwaga

Kompilator nie emituje ostrzeżenia w przypadkach, gdzie default przypadek został zapisany, ale nigdy nie zostanie wykonana.The compiler does not emit a warning in those cases where a default case has been written but will never execute. Jest to zgodne z bieżącą switch zachowanie instrukcji, gdzie zostały wymienione wszystkich możliwych przypadków.This is consistent with current switch statement behavior where all possible cases have been listed.

Trzecia reguła wprowadza używa gdzie var przypadków mogą być przydatne.The third rule introduces uses where a var case may be useful. Wyobraź sobie robią dopasowania do wzorca, w którym dane wejściowe to ciąg i wyszukiwanie wartości znane polecenie.Imagine that you are doing a pattern match where the input is a string and you are searching for known command values. Można napisać mniej więcej tak:You might write something like:

static object CreateShape(string shapeDescription)
{
    switch (shapeDescription)
    {
        case "circle":
            return new Circle(2);

        case "square":
            return new Square(4);
        
        case "large-circle":
            return new Circle(12);

        case var o when (o?.Trim().Length ?? 0) == 0:
            // white space
            return null;
        default:
            return "invalid shape description";
    }            
}

var Zamierzone, Zapisz dopasowania null, ciągiem pustym ani dowolny ciąg, który zawiera tylko znak odstępu.The var case matches null, the empty string, or any string that contains only white space. Należy zauważyć, że w poprzednim kodzie użyto ?. operatora, aby upewnić się, że nie zostanie przypadkowo zgłoszony NullReferenceException.Notice that the preceding code uses the ?. operator to ensure that it does not accidentally throw a NullReferenceException. default Przypadek obsługuje inne wartości ciągu, które nie są zrozumiałe analizatora tego polecenia.The default case handles any other string values that are not understood by this command parser.

Jest jednym z przykładów których warto wziąć pod uwagę var zamierzone, Zapisz wyrażenie, które różni się od default wyrażenia.This is one example where you may want to consider a var case expression that is distinct from a default expression.

WnioskiConclusions

Konstrukcje dopasowywania do wzorca umożliwiają łatwe zarządzanie przepływ sterowania między różne zmienne i typy, które nie są powiązane przez hierarchię dziedziczenia.Pattern Matching constructs enable you to easily manage control flow among different variables and types that are not related by an inheritance hierarchy. Można też sterować logikę w celu użycia dowolny warunek, który można przetestować na zmiennej.You can also control logic to use any condition you test on the variable. Umożliwia on wzorce i idiomy, które będziesz potrzebować więcej często, jak tworzyć więcej aplikacji rozproszonych, w którym dane i metody manipulujące te dane są oddzielone.It enables patterns and idioms that you'll need more often as you build more distributed applications, where data and the methods that manipulate that data are separate. Można zauważyć, strukturach kształtu, używane w tym przykładzie nie zawierają żadnych metod właściwości tylko do odczytu.You'll notice that the shape structs used in this sample do not contain any methods, just read-only properties. Dopasowywanie wzorca działa z dowolnego typu danych.Pattern Matching works with any data type. Pisanie wyrażeń, które zbadać obiektu i decyzje dotyczące kontroli przepływu na podstawie tych warunków.You write expressions that examine the object, and make control flow decisions based on those conditions.

Porównać kod z tego przykładu z projekt, który z tworzenia hierarchii klas dla abstrakcyjną Shape i określonych pochodne kształty o zapewniali własną implementację metody wirtualnej do obliczenia.Compare the code from this sample with the design that would follow from creating a class hierarchy for an abstract Shape and specific derived shapes each with their own implementation of a virtual method to calculate the area. Często okazuje wzorzec dopasowania wyrażenia może być bardzo przydatne narzędzie podczas pracy z danymi i chcesz oddzielić dotyczy magazynu danych od wątpliwości zachowanie.You'll often find that pattern matching expressions can be a very useful tool when you are working with data and want to separate the data storage concerns from the behavior concerns.