Tip
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 패턴이 새로운 경우 패턴 일치 개요 로 시작합니다.
분해는 값의 개별 부분(해당 구성 요소)을 단일 작업에서 각각의 변수에 할당합니다. 튜플의 구성 요소는 위치로 구분되는 요소입니다. 다른 형식은 Deconstruct 메서드를 정의하여 구성 요소를 노출할 수 있습니다. 해당 속성을 생성자와 유사한 매개 변수로 선언하는 위치 레코드는 Deconstruct 메서드가 자동으로 생성됩니다.
튜플 분해
메서드가 도시 데이터가 포함된 튜플을 반환한다고 가정합니다. 각 구성 요소를 한 번에 하나씩 읽을 수 있습니다.
var cityData = QueryCityData("New York City");
var city = cityData.City;
var population = cityData.Population;
var area = cityData.Area;
디컨스트럭션은 이러한 구성 요소를 한 번에 할당합니다.
(string city, int population, double area) = QueryCityData("New York City");
C#에서 변수 형식을 추론하게 할 수도 있습니다.
var (city, population, area) = QueryCityData("New York City");
분해는 기존 변수, 새로 선언된 변수 및 무시 항목을 하나의 할당에 혼합할 수 있습니다.
(city, var population, _) = QueryCityData("New York City");
코드를 가장 쉽게 읽을 수 있는 형식을 선택합니다.
var를 괄호 앞에 하나만 두는 형식은 종종 가장 명확한 유추 형식입니다. 괄호 안에서 명시적 형식과 var를 함께 혼합할 수도 있지만 해당 양식은 일반적으로 훑어보기 더 어렵습니다. 일부 값만 필요한 경우 위치를 생략하는 대신 디스카드를 사용합니다.
discards를 사용하여 불필요한 값을 무시
생성된 모든 값은 대입의 왼쪽에 있는 위치와 일치해야 합니다. 하나 이상의 위치가 필요하지 않은 경우 _를 버림값으로 사용합니다:
var (_, _, population1960, _, population2010) = QueryPopulationDataForYears(
"New York City", 1960, 2010);
여기서 튜플은 도시 이름, 2년 및 인구 값 2개를 반환합니다. 분해는 계산에서 해당 모집단 값만 사용하기 때문에 모집단 값만 유지합니다.
사용자 정의 형식 분해
클래스, 구조체 또는 인터페이스는 Deconstruct 메서드를 선언하여 분해를 지원할 수 있습니다. 각 구성 요소는 out 매개 변수가 되며, 이로 인해 메서드는 값을 반환하지 않고도 호출자의 변수에 값을 다시 할당할 수 있습니다. 모든 구성 요소가 매개 변수를 out 통해 반환되므로 메서드 자체는 다음을 반환합니다 void.
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
그런 다음, 인스턴스를 직접 분해할 수 있습니다.
var (firstName, middleName, lastName) = passenger;
형식은 서로 다른 매개 변수 수—메서드가 선언하는 Deconstruct 매개 변수의 수—를 가진 여러 out 오버로드를 제공할 수 있으므로 호출자는 검색할 구성 요소 수를 선택할 수 있습니다.
public void Deconstruct(out string firstName, out string lastName)
{
firstName = FirstName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string lastName, out string city, out string state)
{
firstName = FirstName;
lastName = LastName;
city = City;
state = State;
}
out 매개 변수가 같은 두 오버로드는 모호합니다. 컴파일러는 모호한 호출에 대해 오류를 보고하므로 매개 변수 형식뿐만 아니라 인수 개수로도 오버로드를 구분합니다.
폐기는 사용자 정의 분해 작업에도 작동합니다. 일반적인 폐기에 대한 자세한 내용은 폐기 및 폐기 패턴을 참조하세요:
var (firstName, _, city, _) = passenger;
레코드 해체
위치 record 또는 record struct는 생성자와 유사하게 해당 속성을 형식 선언 자체의 매개 변수로 선언합니다. 컴파일러는 이러한 위치 매개 변수와 일치하는 매개 변수가 있는 out 메서드Deconstruct를 생성합니다.
var (city, highTempC, lowTempC) = forecast;
생성된 분해에는 위치 매개 변수만 참여합니다. 레코드의 다른 위치에서 선언하는 추가 속성은 자동으로 추가되지 않습니다.
소유하지 않은 형식을 분해
형식을 수정할 수 없는 경우에도 Deconstruct(즉, 해당 형식의 멤버인 것처럼 소유하지 않은 형식에 메서드를 추가하는 정적 메서드)를 작성하여 분해를 지원할 수 있습니다. 메서드를 추가한 후 모든 Uri 값은 분해 구문을 사용할 수 있습니다.
static class UriExtensions
{
public static void Deconstruct(this Uri uri, out string scheme, out string host, out int port)
{
scheme = uri.Scheme;
host = uri.Host;
port = uri.Port;
}
}
동일한 모호성 규칙이 여기에 적용됩니다. 동일한 매개변수 개수(arity)를 가진 두 개의 확장 Deconstruct 메서드는 모호합니다. 인스턴스 Deconstruct 메서드와 동일한 매개변수 개수(arity)의 확장 메서드 간에도 모호성이 발생할 수 있습니다. 두 경우 모두 컴파일러는 모호한 호출에 대한 오류를 보고합니다.
시스템 유형에 대한 기본 제공 구조 분해
일부 시스템 형식은 사용자 고유의 형식에 사용하는 것과 동일한 메커니즘을 사용하여 이미 Deconstruct 메서드를 정의합니다. 예를 들어 System.Collections.Generic.KeyValuePair<TKey,TValue>는 분해를 지원하며, 이를 통해 사전 반복을 간결하게 할 수 있습니다.
foreach (var (repo, commitCount) in repoCommitCounts)
{
Console.WriteLine($"{repo} had {commitCount:N0} commits in this snapshot.");
}
분해 및 패턴 일치
Deconstruct 메서드는 해당 형식에 대한 위치 패턴도 사용하도록 설정합니다. 위치 패턴은 분해와 동일한 괄호로 묶인 구문을 사용하여 한 단계에서 값을 테스트하고 분해합니다. person is ("Alice", 30)는 분해된 구성 요소가 해당 값과 같은 Person와 일치합니다. 이는 person is { Name: "Alice", Age: 30 }와 같이 이름이 지정된 속성을 직접 테스트하는 속성 패턴과는 다릅니다. 멤버 이름이 테스트를 설명하기 때문에 일반적으로 개체 셰이프에 대한 속성 패턴이 더 명확합니다. 위치 패턴은 튜플이나 기타 작은 순서 있는 값의 경우처럼 순서가 이미 의미를 전달하는 경우 가장 강력합니다.
또한, 다음을 참조하세요.
.NET