팁 (조언)
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 패턴이 새로운 경우 패턴 일치 개요 로 시작합니다. 전체 언어 규칙은 언어 참조 의 속성 패턴 및 위치 패턴을 참조하세요.
속성 및 위치 패턴은 모두 값의 일부를 테스트합니다. 차이점은 이러한 부분을 식별하는 방법입니다.
- 속성 패턴은 테스트할 속성 또는 필드의 이름을 지정합니다.
- 위치 패턴은 해당 순서로 값을 식별합니다.
분해는 정렬된 구성 요소 값 집합을 노출합니다. 튜플에는 이미 요소 순서가 있습니다. 튜플 분해를 참조하세요. 다른 형식의 경우 메서드는 Deconstruct 노출되는 구성 요소 값과 해당 순서를 정의합니다.
이름과 위치 비교
다음 속성 패턴은 온도 값이 섭씨인 날씨 판독값의 두 명명된 속성을 테스트합니다.
static bool IsHotAndHumid(WeatherReading reading) =>
reading is { TemperatureC: > 30, HumidityPercent: > 70 };
sealed record WeatherReading(int TemperatureC, int HumidityPercent);
다음 위치 패턴은 신호 값 뒤에 오는 부울 값을 테스트합니다.
static string GetCrossingInstruction(
PedestrianSignal signal, bool crossingIsClear) =>
(signal, crossingIsClear) switch
{
(PedestrianSignal.Walk, true) => "Cross now",
(PedestrianSignal.Walk, false) => "Wait for the crossing to clear",
_ => "Wait for the walk signal"
};
enum PedestrianSignal
{
Stop,
Walk
}
속성 패턴은 입력을 TemperatureC 및 HumidityPercent라는 이름으로 식별합니다. 교차 코드는 별도의 signalcrossingIsClear 값에서 튜플을 만듭니다. 그런 다음 튜플 패턴은 해당 값을 순서에 따라 식별합니다. crossingIsClear가 첫 번째이고 signal가 두 번째입니다. 새로 만든 이 튜플에는 두 개의 값만 있고 순서는 교차 결정에서 명확한 의미를 가지므로 위치 패턴이 매우 적합합니다.
멤버 이름이 테스트를 설명하는 데 도움이 되는 경우 속성 패턴을 선택합니다. 속성 패턴은 일반적으로 클래스, 구조체 및 레코드에 대해 더 명확합니다. 순서가 이미 값에 명백한 의미를 부여하는 경우 위치 패턴을 선택합니다. 위치 패턴은 여러 관련 값을 고정된 순서로 한 값으로 결합하는 튜플에서 가장 유용합니다.
재귀 패턴에서 중첩 입력 추적
속성 및 위치 패턴은 재귀 패턴입니다. 선택한 각 속성, 필드 또는 위치에 다른 패턴을 적용합니다. 선택한 값은 중첩된 패턴에 대한 입력이 됩니다.
reading 에서 IsHotAndHumid식은 속성 패턴에 대한 입력입니다. C#은 일치하기 전에 해당 식을 평가합니다. 패턴은 결과 개체에서 다음 두 값을 가져옵니다.
- 관계형 패턴
> 30은 .의TemperatureC값을 테스트합니다. - 관계형 패턴
> 70은 .의HumidityPercent값을 테스트합니다.
외부 형식 테스트는 선택 사항이며 재귀 패턴 절은 비어 있을 수 있습니다. 예를 들어 빈 속성 패턴 { } 은 null이 아닌 평가된 값과 일치합니다.
속성 및 위치 패턴은 null이 아닌 평가 값만 일치합니다. 입력 도메인의 일부인 경우 null null이 아닌 값을 먼저 확인하는 재귀 패턴을 선택합니다.
static string DescribeNullableInput(object? value)
{
if (value is not { } nonNullValue)
{
return "No value";
}
return nonNullValue switch
{
DateTime => "Date",
string => "Text",
_ => "Another type"
};
}
입력 식은 .입니다 value. C#은 이를 평가하며, { } 속성 패턴은 결과 값이 null이 아닌지 검사한 후 이를 nonNullValue에 할당합니다. 다음 스위치 식은 여러 가능한 런타임 형식을 테스트할 수 있습니다. 메서드는 값을 캡처하지 않고 각 형식을 식별하기만 하기 때문에 해당 DateTime 패턴과 string 형식 패턴에는 지정이 없습니다.
재귀 패턴 절에 중첩 패턴이 포함된 경우 선택한 각 속성, 필드 또는 위치는 중첩 패턴에 대한 입력이 됩니다.
입력 식이 다른 형식을 생성할 수 있는 경우 중괄호 앞에 형식 테스트를 추가할 수 있습니다. 멤버 경로를 사용하여 중첩된 속성을 테스트할 수도 있습니다.
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
value 은 입력 식입니다. C#은 먼저 이를 평가하고 결과 값이 .인지 DateTime여부를 테스트합니다. 그러면 Date 속성 값이 DayOfWeek 멤버 액세스의 입력이 됩니다. 마지막으로 DayOfWeek 값은 두 개의 상수를 테스트하는 논리 패턴의 입력값이 됩니다. 외부 값에 지정된 형식이 있고 멤버 경로를 따라 필요한 모든 개체가 null이 아닌 경우 일치가 성공합니다.
패턴과 분기 문 비교
이전 DescribeDate 메서드는 네 가지 결과를 패턴으로 표현합니다.
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
다음 메서드는 일련의 명령적 분기 문을 사용하여 동일한 결과를 생성합니다.
static string DescribeDateWithBranches(object? value)
{
if (value is DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
return "Weekend date";
}
return "Weekday date";
}
if (value is null)
{
return "No date";
}
return "Not a date";
}
패턴 기반 버전은 여러 분기가 값의 형식과 모양을 테스트할 때 가능한 결과를 함께 유지합니다. 명령적 버전은 각 테스트 및 반환 단계를 명시적으로 만듭니다. 한 조건의 경우 두 폼이 비슷하게 보일 수 있습니다. 관련 분기 수가 증가함에 따라 패턴은 대안을 더 쉽게 비교할 수 있도록 할 수 있습니다.
참고하십시오
.NET