기본형)
int flag = 3;
switch (flag)
{
case 1: DoFunc1(); break;
case 2: DoFunc2(); break;
default: DoFunc3(); break;
}
C# 7.0, switch문의 패턴 매칭
switch case 문이 패턴 매칭 식을 흡수한다, 원래 switch 문의 조건식에는 값 형식의 식들만 들어갈 수 있었지만 클래스 인스턴스도 들어갈 수 있고 case 문에는 패턴 매칭식을 넣을 수가 있다.
using System;
public class Program
{
public static void Main()
{
object data = 5;
// object data = "STRING";
// object data = 3.141592;
// object data = DateTime.Now;
switch (data)
{
case 5:
Console.WriteLine($"data is int: {data}");
break;
case "STRING":
Console.WriteLine($"data is string: {data}");
break;
case 3.141592:
Console.WriteLine($"data is double: {data}");
break;
case DateTime:
Console.WriteLine($"data is DateTime: {data}");
break;
default:
Console.WriteLine("No Match");
break;
}
}
}
object data 부분들의 주석을 순차대로 지우면
data is int: 5
data is string: STRING
data is double: 3.141592
data is DateTime: 05/05/2021 11:12:56
다음과 같이 써도 유효하다
case int: // ...
case string: // ...
case double: // ...
case DateTime: // ...
또한 변수명을 정의 할 수 있다
case int i: // ...
case string s: // ...
case double f: // ...
case DateTime dt: // ...
제네릭과 비슷하게 when을 사용할 수 있다
using System;
public class Program
{
public static void Main()
{
object data = 5;
switch (data)
{
case int i when i > 10: // data가 int 타입이고 10보다 큰 경우
Console.WriteLine($"data is int: {data} > 10");
break;
case int i when i <= 10: // data가 int 타입이고 10 이하인 경우
Console.WriteLine($"data is int: {data} <= 10");
break;
}
}
}
// data is int: 5 <= 10
이렇게 자료형과 변수를 넣고 when을 통해 조건식을 추가로 걸어주면, 해당하는 조건식이 참인 경우에 case가 실행된다.
object val1 = 5;
object val2 = "6";
switch (val1)
{
case var _ when val1.ToString() + val2 == "56":
Console.WriteLine("first case");
break;
case var _ when val1 as int? == 6 && val2 as string == "6":
Console.WriteLine("second case");
break;
}
// first case
C# 8.0, switch expression
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(GetDay());
}
public static string GetDay()
{
switch (DateTime.Now.DayOfWeek)
{
case DayOfWeek.Monday:
return "Monday";
case DayOfWeek.Tuesday:
return "Tuesday";
case DayOfWeek.Wednesday:
return "Wednesday";
case DayOfWeek.Thursday:
return "Thursday";
case DayOfWeek.Friday:
return "Friday";
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
return "Weekend";
}
}
}
위 코드를 아래와 같이 변경할 수가 있다
public static string GetDay()
{
return DateTime.Now.DayOfWeek switch
{
DayOfWeek.Monday => "Monday",
DayOfWeek.Tuesday => "Tuesday",
DayOfWeek.Wednesday => "Wednesday",
DayOfWeek.Thursday => "Thursday",
DayOfWeek.Friday => "Friday",
DayOfWeek.Saturday or DayOfWeek.Sunday =>"Weekend",
};
}
default는 _로 처리가 가능하다
public static string GetDay() => DateTime.Now.DayOfWeek switch
{
DayOfWeek.Monday => "Monday",
DayOfWeek.Tuesday => "Tuesday",
DayOfWeek.Wednesday => "Wednesday",
DayOfWeek.Thursday => "Thursday",
DayOfWeek.Friday => "Friday",
_ =>"Weekend",
};
조건식 적용
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(Greet(13));
}
public static string Greet(int hour) => hour switch
{
<= 12 => "Good morning",
>= 13 and <= 18 => "Good evening",
> 18 and <= 24 => "Good night"
/*
(hour <= 12) => "Good morning",
(hour >= 13 and hour <= 18) => "Good evening",
(hour > 18 and hour <= 24) => "Good night"
*/
};
}
// Good Evening
MS에서는 이걸 관계 패턴 매칭 (Relational Pattern Matching)이라 부른다
// Source: Microsoft
string WaterState(int tempInFahrenheit) => tempInFahrenheit switch
{
(> 32) and (< 212) => "liquid",
< 32 => "solid",
> 212 => "gas",
32 => "solid/liquid transition",
212 => "liquid / gas transition",
};
C# 9.0 튜플
public class Order
{
public Order(int items, decimal cost)
{
(Items, Cost) = (items, cost)
}
public int Items { get; set; }
public decimal Cost { get; set; }
}
Order 타입을 받는 메서드가 있다
public double CalculateDiscount(Order order) => order switch
{
(Items: > 10, Cost: > 1000.00m) => 0.10,
(Items: > 5, Cost: > 500.00m) => 0.05,
Order { Cost: > 250.00m } => 0.02,
null => throw new ArgumentNullException(nameof(order),
"Can't calculate discount on null order"),
var o => 0,
};
'프로그래밍 언어 > C#' 카테고리의 다른 글
[C#] 7.0 튜플 (Tuple) (0) | 2025.02.09 |
---|---|
[C#] default와 new() 제약 조건 사용하기 (0) | 2024.12.16 |
[C#] Attribute : Obsolete - 더 이상 사용하지 않거나 그럴 예정인 코드에 대해서 (0) | 2024.12.16 |
[C#] IsNullOrEmpty와 IsNullOrWhiteSpace의 차이점 (0) | 2024.11.10 |
[C#] 포인터 관련 unsafe fixed 키워드 (0) | 2024.05.23 |