Property, positional patterns
Peponi │ 1/8/2025 │ 4m
C#
SyntaxKeywordPattern{}()
Property, positional patterns
1/8/2025
4m
Peponi
C#
SyntaxKeywordPattern{}()
1. Introduction
다음 C# 식과 문은 패턴을 지원한다.
여기서는 다음 패턴을 설명한다.
- 속성 패턴 : 각 패턴에 대해 속성, 필드를 매칭
- 위치 패턴 : 식을 분해하고 패턴 매칭
2. 속성 패턴
속성 패턴은 중괄호 { }
를 이용하여 매칭할 속성을 지정한다.
public record Foo(int A, int B);
private static void Main(string[] args)
{
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
*/
2.1. 속성 패턴 - 중첩 패턴
속성 패턴은 중첩된 형식에 접근 가능하다.
public record Foo(Bar A, Bar B);
public record Bar(int C);
private static void Main(string[] args)
{
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)
private static void Main(string[] args)
{
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
*/
3. 위치 패턴
위치 패턴은 deconstructable 형식 (튜플, record, ...) 에 대해 식을 분해하고 패턴 매칭하는 기능을 제공하며 구현 시 변수를 선택적으로 사용할 수 있다.
public record Foo(int A, int B);
private static void Main(string[] args)
{
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
*/
3.1. 위치 패턴 - 중첩 패턴
위치 패턴은 중첩된 형식에 접근 가능하다.
public record Foo(Bar A, Bar B);
public record Bar(int C, int D);
private static void Main(string[] args)
{
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
*/