분해 식 - 튜플 또는 다른 사용자 정의 형식에서 필드 속성 추출

분해 식은 개체 인스턴스에서 데이터 필드를 추출할 있습니다. 각 불연속 데이터 요소는 다음 예제와 같이 고유 변수에 기록됩니다.

var tuple = (X: 1, Y: 2);
var (x, y) = tuple;

Console.WriteLine(x); // output: 1
Console.WriteLine(y); // output: 2

앞의 코드 조각은 X두 개의 정수 값이 있는 Y 만듭니다. 두 번째 문은 튜플 분해하고 튜플 요소를 별도의 변수 및 y에 저장합니다x.

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

튜플 분해

모든 튜플 형식은 분해 식을 지원합니다. 튜플 분해는 모든 튜플의 요소를 추출합니다. 튜플 요소 중 일부만 원하는 경우 다음 예제와 같이 사용되지 않는 튜플 멤버에 대해 무시 를 사용합니다.

var tuple2 = (X: 0, Y: 1, Label: "The origin");
var (x2, _, _) = tuple2;

앞의 예제에서는 Ylabel 멤버가 삭제됩니다. 동일한 분해 식에서 여러 삭제를 지정할 수 있습니다. 튜플의 모든 멤버에 대해 무시 항목을 사용할 수 있습니다. 다음 예제는 유용하지는 않지만 합법적입니다.

var (_, _, _) = tuple2;

레코드 분해

기본 생성자가 있는 레코드 형식은 위치 매개 변수에 대한 분해를 지원합니다. 컴파일러는 주 생성자의 위치 매개 변수에서 합성된 속성을 추출하는 Deconstruct 메서드를 합성합니다. 컴파일러 합성 Deconstruct 메서드는 레코드 형식의 속성으로 선언된 속성을 추출하지 않습니다.

다음 코드에 표시된 recordSquareFeetAddress라는 두 위치 속성을, 그리고 다른 속성인 RealtorNotes을 선언합니다.

public record House(int SquareFeet, string Address)
{
    public required string RealtorNotes { get; set; }
}

House 개체를 분해하면 다음 예제와 같이 모든 위치 속성과 위치 속성만 분해됩니다.

var house = new House(1000, "123 Coder St.")
{
    RealtorNotes = """
    This is a great starter home, with a separate room that's a great home office setup.
    """
};

var (squareFeet, address) = house;
Console.WriteLine(squareFeet); // output: 1000
Console.WriteLine(address); // output: 123 Coder St.
Console.WriteLine(house.RealtorNotes);

이 동작을 사용하여 컴파일러 합성 Deconstruct 메서드의 일부인 레코드 형식의 속성을 지정할 수 있습니다.

Deconstruct 메서드 선언

선언한 클래스, 구조체 또는 인터페이스에 분해 지원을 추가할 수 있습니다. 형식에서 하나 이상의 Deconstruct 메서드를 선언하거나 해당 형식에서 확장으로 선언합니다. 분해 표현식은 메서드 void Deconstruct(out var p1, ..., out var pn)을 호출합니다. Deconstruct 메서드는 인스턴스 메서드 또는 확장 메서드일 수 있습니다. Deconstruct 메서드의 각 매개 변수 형식은 분해 식에서 해당 인수의 형식과 일치해야 합니다. 분해 식은 각 인수의 값을 out 메서드의 해당 Deconstruct 매개 변수 값에 할당합니다. 여러 Deconstruct 메서드가 분해 식과 일치하는 경우 컴파일러는 모호성에 대한 오류를 보고합니다.

다음 코드는 두 가지 Point3D 메서드가 있는 Deconstruct 구조체를 선언합니다.

public struct Point3D
{
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }

    public void Deconstruct(out int x, out int y, out int z)
    {
        x = X;
        y = Y;
        z = Z;
    }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

첫 번째 메서드는 세 축 값(X, YZ)을 모두 추출하는 분해 식을 지원합니다. 두 번째 메서드는 평면 값인 XY분해만 지원합니다. 첫 번째 메서드는 아리티 3입니다. 두 번째 메서드는 아리티가 2입니다.

이전 섹션에서는 기본 생성자를 사용하는 Deconstruct 형식에 대한 컴파일러 합성 record 메서드에 대해 설명했습니다. 레코드 형식에서 더 많은 Deconstruct 메서드를 선언할 수 있습니다. 이러한 메서드는 다른 속성을 추가하거나, 기본 속성 중 일부를 제거하거나, 둘 다 제거할 수 있습니다. 컴파일러 합성 서명과 일치하는 Deconstruct 선언할 수도 있습니다. 이러한 Deconstruct 메서드를 선언하는 경우 컴파일러는 메서드를 합성하지 않습니다.

컴파일러가 분해 식에 대한 하나의 고유한 Deconstruct 메서드를 결정할 수 있는 한 여러 Deconstruct 메서드가 허용됩니다. 일반적으로 동일한 형식의 여러 Deconstruct 메서드에는 매개 변수 수가 다릅니다. 매개 변수 형식에 따라 다른 여러 Deconstruct 메서드를 만들 수도 있습니다. 그러나 대부분의 경우 Deconstruct 메서드가 너무 많을 경우 모호성 오류 및 잘못된 결과가 발생할 수 있습니다.

C# 언어 사양

자세한 내용은 C# 표준분해 섹션을 참조하세요.

참고