Positional patterns help you check the shape and values inside objects easily, like matching pieces in a puzzle.
Positional patterns in C Sharp (C#)
obj is TypeName(var1, var2, ...)
This checks if obj is of type TypeName and extracts parts into var1, var2, etc.
The type must have a Deconstruct method or be a record with positional parameters.
point is a Point and extracts x and y values.point is Point(var x, var y)
person is a Person and extracts name and age.person is Person(var name, var age)
obj is a Point with x equal to 0 and extracts y.obj is Point(0, var y)This program creates a Point with X=0 and Y=5. It uses a positional pattern to check if X is 0 and extracts Y. Then it prints the result.
using System; record Point(int X, int Y); class Program { static void Main() { Point p = new(0, 5); if (p is Point(0, var y)) { Console.WriteLine($"X is zero and Y is {y}"); } else { Console.WriteLine("Point does not match pattern."); } } }
Positional patterns require the type to have a Deconstruct method or be a record with positional parameters.
You can mix constants and variables in the pattern to check specific values.
Positional patterns let you match and extract parts of an object easily.
They work well with records and types that have Deconstruct methods.
You can check values and get variables in one simple expression.
Practice
What is the main purpose of positional patterns in C#?
record Point(int X, int Y);
Using case Point(var x, var y): inside a switch statement helps to:
Solution
Step 1: Understand positional pattern usage
Positional patterns allow matching an object and extracting its parts in one step, likecase Point(var x, var y):.Step 2: Identify what the pattern does with Point
It extracts the X and Y values from the Point object into variables x and y for use inside the case block.Final Answer:
Extract values of X and Y from a Point object easily -> Option AQuick Check:
Positional pattern extracts values [OK]
- Thinking positional patterns create or modify objects
- Confusing Deconstruct method call with pattern matching
- Assuming positional patterns only check types without extracting
Which of the following is the correct syntax for using a positional pattern with a record Person(string Name, int Age) inside a switch expression?
switch(person) {
case ???:
// code
break;
}Solution
Step 1: Recall positional pattern syntax
Positional patterns use parentheses with variables:Type(var1, var2).Step 2: Match syntax to options
Person(var name, var age) uses parentheses and variables correctly:Person(var name, var age). Others use invalid syntax for positional patterns.Final Answer:
Person(var name, var age) -> Option AQuick Check:
Positional pattern syntax uses parentheses [OK]
- Using square brackets or curly braces instead of parentheses
- Trying to use named arguments syntax inside patterns
- Omitting var keyword or variable names
What is the output of the following code?
record Point(int X, int Y);
var p = new Point(3, 4);
switch (p)
{
case Point(0, 0):
Console.WriteLine("Origin");
break;
case Point(var x, var y) when x == y:
Console.WriteLine("On diagonal");
break;
case Point(var x, var y):
Console.WriteLine($"Point at ({x}, {y})");
break;
}Solution
Step 1: Check first case Point(0, 0)
p is (3,4), so it does not match (0,0).Step 2: Check second case with condition x == y
x=3, y=4, so x != y; condition fails.Step 3: Third case matches any Point and prints coordinates
It matches and prints "Point at (3, 4)".Final Answer:
Point at (3, 4) -> Option BQuick Check:
Pattern matches last case with output [OK]
- Assuming (3,4) matches (0,0)
- Ignoring the when condition in second case
- Thinking no case matches and no output
Identify the error in this code snippet using positional patterns:
record Rectangle(int Width, int Height);
var rect = new Rectangle(5, 10);
switch(rect)
{
case Rectangle(var w, var h):
Console.WriteLine($"Width: {w}, Height: {h}");
break;
case Rectangle(w, h):
Console.WriteLine("Invalid pattern");
break;
}Solution
Step 1: Review positional pattern variable declaration
Variables in positional patterns must be declared withvaror a type.Step 2: Identify error in second case
Second case usesRectangle(w, h)withoutvar, which is invalid syntax.Final Answer:
Second case uses variables without var keyword, causing a syntax error -> Option CQuick Check:
Variables need var keyword in patterns [OK]
- Omitting var keyword for variables in patterns
- Thinking records can't be used in switch
- Confusing named arguments with pattern variables
Given the record Person(string Name, int Age), write a switch expression using positional patterns that returns:
- "Child" if Age < 13
- "Teen" if Age is between 13 and 19 inclusive
- "Adult" otherwise
Which of the following switch expressions correctly implements this?
Solution
Step 1: Check age ranges and conditions
Child: age < 13, Teen: 13 ≤ age ≤ 19, Adult: otherwise.Step 2: Analyze each option's conditions
person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; correctly usesage < 13for Child,age >= 13 && age <= 19for Teen, and default Adult case. person switch { Person(_, var age) when age < 13 => "Child", Person(_, var age) when age > 13 && age <= 19 => "Teen", Person(_, _) => "Adult" }; misses age=13 (falls to Adult) because Teen condition uses > 13. person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age > 13 && age < 19 => "Teen", _ => "Adult" }; excludes age == 13 and 19 for Teen. person switch { Person(var name, var age) when age <= 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; overlaps Child and Teen at age 13.Step 3: Confirm the correct implementation
person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; matches all conditions correctly and clearly.Final Answer:
Option D code correctly implements the age groups -> Option DQuick Check:
Check age ranges carefully in when clauses [OK]
- Overlapping or missing age boundaries
- Using _ wildcard instead of variables when needed
- Incorrect logical operators in conditions
Ready to prove it?
Pass the test and this pattern moves unknown
