반응형
계속 발전하는 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
반응형