I know developers that use the pattern matching feature every chance they get. They love the flexibility it provides. I never saw the utility because you can accomplish its effect with traditional programming constructs. That means if..then..else statements. The documentation explains it is so much more:

  • Null checks
  • Type tests
  • Compare discrete values
  • Relational patterns
  • Multiple inputs
  • List patterns

I am supposed to leveling up so I began using switch expressions which Microsoft calls comparing discrete values. I am making the effort but it has been slow. At least I see the utility of the switch expression.

Null checks

I have never used the is operator to check for null. The example provided is something I would probably never actually do in real life. I just don't see the utility of the words is not over the symbol != in that statement. That may make me old fashioned and I would agree. Also, I said I would probably never. One thing that is certain is to never say never.

string? message = "This is not the null string";

if (message is not null)
{
    Console.WriteLine(message);
}

Type tests

This is what I would call the traditional usage of the is operator. I have used this generously in the past. If the need arises I can see me continuing with that code.

The only addition is the support for the declaration pattern. This is a newer and well deserved language feature. It saves me from creating another variable in the scope, having to initialize it, and then use it.

object greeting = "Hello, World!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: hello, world!
}

Compare discrete values

This is the switch expression that I have been learning recently. When I encounter the need for a switch statement I am starting to think about how to use a switch expression. I think it will begin to starting naturally soon.

I think the addition of the pattern is good because it reduces the amount of code you need to write. Whenever I was using the switch statement before it was to either do something or return something based upon a value.

This language feature handles that and with less code.

public State PerformOperation(Operation command) =>
   command switch
   {
       Operation.SystemTest => RunDiagnostics(),
       Operation.Start => StartSystem(),
       Operation.Stop => StopSystem(),
       Operation.Reset => ResetToReady(),
       _ => throw new ArgumentException("Invalid enum value for command", nameof(command)),
   };
  • More in Part 2 about relational, multiple, and list patterns.
  • You can refer the Microsoft docs on pattern matching.