DEV Community

Mariem Moalla
Mariem Moalla

Posted on

All you need to know about switch expression and Modern Pattern Matching

The switch statement has been part of C# since day one.

But over time, it has evolved into a powerful tool for pattern matching.

In this article, we'll look at how the switch statement has changed, and see why the modern switch is more useful.

The Traditional switch

  • The classic switch has been around since C# 1.0 .

  • It only worked on constants (int, char, enums, strings).

  • Each case needed a break (or return).

Example:

public string GetColor(Color c) { switch (c) { case Color.Red: case Color.Blue: case Color.Yellow: return "Primary Colors"; default: return "Other"; } } 
Enter fullscreen mode Exit fullscreen mode

Modern switch with Pattern Matching

Starting with C# 7.0, the switch statement gained pattern matching. Later releases expanded it:

  • Type patterns, constant patterns, when clauses.

  • Switch expressions + property/tuple patterns.

  • Relational (>, <, >=, <=) and logical (and, or, not) patterns.

Type patterns

Example:

object value = 42; string result = value switch { int n => $"Integer: {n}", string s => $"String: {s}", null => "Null value", _ => "Unknown type" }; 
Enter fullscreen mode Exit fullscreen mode

Relational Patterns:

This switch expression is used to compare an expression result with a constant, as the following example shows:

int score = 85; string grade = score switch { >= 90 => "A", >= 80 => "B", >= 70 => "C", >= 60 => "D", _ => "F" }; In a relational pattern we can use the relational operators <, >, <=, or >=. 
Enter fullscreen mode Exit fullscreen mode

Positional pattern:

Can be used to deconstruct a result and match it vales as the following example:

(int x, int y) point = (5, -3); string position = point switch { (0, 0) => "Origin", ( > 0, > 0) => "Quadrant I", ( < 0, > 0) => "Quadrant II", ( < 0, < 0) => "Quadrant III", ( > 0, < 0) => "Quadrant IV", _ => "On axis" }; 
Enter fullscreen mode Exit fullscreen mode

There still exists many other patterns present in the documentation, each can be served and used in a specific situation, more specific than the general cases we encounter.

Top comments (0)