Favicon

Property, positional patterns

Peponi1/8/20254m

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
*/

4. 참조 자료