* 선언 패턴
주어진 식이 특정 형식과 일치하는지 평가
1. 식과 주어진 형식과 일치하는지 테스트
2. 테스트가 성공하면 식을 주어진 형식으로 변환
예시
object foo = 23;
if(foo is int)
{
Console.WriteLine(foo);
}
foo is int가 true가 반환되는 경우 bar 변수가 if 블록에서 생성 false인 경우 생성되지 않음.
* 형식 패턴
형식 패턴은 선언 패턴과 비슷하지만, 변수 생성 없이 형식 일치 여부만 테스트.(C# 9.0에서 적용)
object foo = 23;
if(foo is int)
{
Console.WriteLine(foo);
}
선언 형식 예제와 다 똑같지만 패턴 매칭이 적용되어 변수를 추가적으로 생성하지 않음.
* 상수 패턴
상수 패턴은 식이 특정 상수와 일치하는 검사
정수 리터럴과 문자열 리터럴뿐 아니라 null과 enum 등 모든 상수와 매칭할 수 있다.
var GetCountryCode = (string nation) => nation switch
{
"KR" => 82,
"US" => 1,
"UK" => 44,
_ => throw new ArgumentException("Not supported Code")
};
Console.WriteLine(GetCountryCode("KR"));
Console.WriteLine(GetCountryCode("US"));
Console.WriteLine(GetCountryCode("UK"));
* 프로퍼티 패턴
프로퍼티 패턴 매칭은 식의 속성이나 필드가 패턴과 일치하는지 검사. 기본 데이터 형식이 아닌 경우에 유용하게 사용가능
class Car {
public string Model {get; set;}
public DateTime ProducedAt { get; set;}
}
static string GetNickname(Car car)
{
var GenerateMessage = (Car car, string nickname) => $"{car.Model} produced in {car.ProducedAt.Year} is {nickname}";
if(car is Car {Model:"Mustang", ProducedAt.Year:1967})
return GenerateMessage(car, "Fastback");
else if(car is Car {Model:"Mustang", ProducedAt.Year:1976})
return GenerateMessage(car, "Cobra II");
else
return GenerateMessage(car, "UnKnown");
}
static void Main(string[] args)
{
Console.WriteLine(
GetNickname(
new Car() {Model = "Mustang", ProducedAt = new DateTime(1967, 11, 23)}));
Console.WriteLine(
GetNickname(
new Car() {Model = "Mustang", ProducedAt = new DateTime(1976, 6, 7)}));
Console.WriteLine(
GetNickname(
new Car() {Model = "Mustang", ProducedAt = new DateTime(2099, 12, 25)}));
}
* 관계 패턴
관계 패턴 매칭은 >,>=,==,!=,<,<= 와 같은 관계 연산자를 이용하여 입력받은 식을 상수와 비교
* 논리 패턴
패턴과 패턴을 논리 연산자(and, or, not)을 조합해서 하나의 논리 패턴으로 만듬.
* 괄호 패턴
괄호 패턴은 소괄호 ()로 감싼다. 보통 논리 패턴으로 여러 패턴을 조합할때 사용
* 위치 패턴
위치 패턴은 식의 결과를 분해하고, 분해된 값들이 내장된 복수의 패턴과 일치하는지 검사.
분해된 값들과 내장된 패턴의 개수, 순서가 일치해야 한다는 점에 주의
Tuple<string, int> itemPrice = new Tuple<string, int>("espresso", 3000);
if(itemPrice is ("espresso", < 5000))
{
Console.WriteLine("The coffee is affordable.");
}
이 예제에서 ("espresso") 와 (<5000) 으로 이루어진 위치 패턴으로 매칭되어 있다.
* var 패턴
var 패턴은 null을 포함한 모든 식의 패턴 매칭을 성공시키고, 그 결과를 변수에 할당
* 무시 패턴
무시패턴도 var 패턴처럼 모든 식과 패턴 일치 검사를 성공시킨다. 하지만 is에서는 사용불가 switch식에만 사용가능
switch의 default 케이스와 비슷한 용도로 사용가능. 무시패턴은 _ 기호를 사용한다.
* 목록 패턴
목록패턴은 배열이나 리스트가 패턴의 시퀀스가 일치하는지 검사.
'C#' 카테고리의 다른 글
C# static 한정자 (1) | 2023.07.19 |
---|---|
[이것이 C#이다. 3판] Chapter 05 코드의 흐름 제어하 연습문제 (0) | 2023.07.19 |
[이것이 C#이다. 3판] Chapter 04 데이터를 가공하는 연산 연습문제 (0) | 2023.07.17 |
[이것이 C#이다. 3판] Chapter 03 데이터 보관하기 연습문제 (0) | 2023.07.16 |
[C#-winform] 사각형 사이즈 늘리기 + 자유자재로 움직이기 (0) | 2023.07.06 |