Introduction
- 다음 C# 식과 문은 패턴을 지원한다.
- 여기서는 다음 패턴을 설명한다.
- 속성 패턴 : 각 패턴에 대해 속성, 필드를 매칭
- 위치 패턴 : 식을 분해하고 패턴 매칭
속성 패턴
속성 패턴
은 중괄호 { }
를 이용하여 매칭할 속성을 지정한다.
public record Foo(int A, int B);
var foo = new Foo(1, 2);
Console.WriteLine(foo switch
{
{ A: < 0 } => "A < 0",
{ B: < 0 } => "B < 0",
{ A: > 0, B: > 0 } => "A > 0, B > 0",
_ => "Not recognized"
});
/* output:
A > 0, B > 0
*/
속성 패턴 - 중첩 패턴
public record Foo(Bar A, Bar B);
public record Bar(int C);
var foo = new Foo(new(1), new(2));
Console.WriteLine(foo switch
{
{ A: { C: < 0 }, B: { C: < 0 } } => "A.C < 0, B.C < 0",
{ A: { C: > 0 }, B: { C: < 0 } } => "A.C > 0, B.C < 0",
{ A: { C: > 0 }, B: { C: > 0 } } => "A.C > 0, B.C > 0",
_ => "Not recognized"
});
/* output:
A.C > 0, B.C > 0
*/
- 위 예제는 아래와 같이 표현할 수 있다. (C# 10)
var foo = new Foo(new(1), new(2));
Console.WriteLine(foo switch
{
{ A.C: < 0, B.C: < 0 } => "A.C < 0, B.C < 0",
{ A.C: > 0, B.C: < 0 } => "A.C > 0, B.C < 0",
{ A.C: > 0, B.C: > 0 } => "A.C > 0, B.C > 0",
_ => "Not recognized"
});
/* output:
A.C > 0, B.C > 0
*/
위치 패턴
위치 패턴
은 deconstructable 형식 (튜플, record, ...) 에 대해 식을 분해하고 패턴 매칭하는 기능을 제공한다.
위치 패턴
구현 시 변수 이름을 선택적으로 사용할 수 있다.
public record Foo(int A, int B);
var foo = new Foo(1, 2);
Console.WriteLine(foo switch
{
(A: < 0, _) => "A < 0",
(_, B: < 0) => "B < 0",
( > 0, > 0) => "A > 0, B > 0",
_ => "Not recognized"
});
/* output:
A > 0, B > 0
*/
위치 패턴 - 중첩 패턴
public record Foo(Bar A, Bar B);
public record Bar(int C, int D);
var foo = new Foo(new(-1, 2), new(3, 4));
Console.WriteLine(foo switch
{
(( > 0, _), ( > 0, _)) => "A.C > 0, B.C > 0",
((_, > 0), (_, > 0)) => "A.D > 0, B.D > 0",
_ => "Not recognized",
});
/* output:
A.D > 0, B.D > 0
*/
참조 자료