반응형

계속 발전하는 C#, switch 문을 어떻게 사용할 수 있는지 기록해 둔다.

 

이전 형식

object obj = new Developer { FirstName = "Thomas", YearOfBirth = 1980 };

string favoriteTask;

switch (obj)
{
  case Developer dev when dev.YearOfBirth >= 1980 && dev.YearOfBirth <= 1989:
    // 1. This case is taken for the defined Developer object
    favoriteTask = $"{dev.FirstName} listens to heavy metal while coding";
    break;
  case Developer dev: 
    // 2. This case matches too, but it's defined after the first one that matches
    favoriteTask = $"{dev.FirstName} writes code";
    break;
  case Person _: 
    // 3. This case matches too for a Developer, as Person is a base class
    favoriteTask = "Eat and sleep";
    break;
  default:
    favoriteTask = "Do what objects do";
    break;
}

너무 복잡하고 코드 중복이 많다. 이런 코드를 사용하면 아재 소리 듣기 좋다.

 

8.0

string favoriteTask = obj switch
{
  Developer dev when dev.YearOfBirth >= 1980 && dev.YearOfBirth <= 1989
    => $"{dev.FirstName} listens to metal",
  Developer dev => $"{dev.FirstName} writes code",
  Manager _ => "Create meetings",
  _ => "Do what objects do",
};

_ 는 무명 변수이다. switch 문에서는 default와 같다.

오브젝트 멤버를 비교할 수 있다.

 

9.0

string favoriteTask = obj switch
{
  Developer dev when dev.YearOfBirth >= 1980 && dev.YearOfBirth <= 1989 
    => $"{dev.FirstName} listens to metal",
  _ => "Dance like no one is watching"
};

 

속성 패턴을 사용하면...

string favoriteTask = obj switch
{
  Developer { YearOfBirth: >= 1980 and <= 1989 and not 1984 } dev
    => $"{dev.FirstName} listens to heavy metal while coding",
  Developer dev => $"{dev.FirstName} writes code",
  Manager => "Create meetings",
  _ => "Do what objects do",
};

YearOfBirth가 중복 되는 것도 보기 싫어서 when 대신 속성 패턴을 사용했다.

string favoriteTask = dev switch
{
  { Manager: { YearOfBirth: 1980 } } => "Manager listens to heavy metal",
  not null => $"{dev.FirstName} writes code",
  _ => "Look into the void",
};

속성 패턴 중첩도 가능

값 형식은 아주 간단하게...

int yearOfBirth = 1980;
string favoriteTask = yearOfBirth switch
{
  1984 => "Read George Orwell's book", // Constant pattern
  >= 1980 and <= 1989 => "Listen to heavy metal", // Combined relational patterns
  > 1989 => "Write emails like everyone is watching", // Relational pattern
  _ => "Dance like no one is watching", // <- This comma here is optional
};

참 쉽죠?

출처: C# 9.0: Pattern Matching in Switch Expressions – Thomas Claudius Huber

반응형

관련글