팁 (조언)
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 패턴이 새로운 경우 패턴 일치 개요 로 시작합니다. 전체 언어 규칙은 언어 참조의 관계형 패턴 및 논리 패턴을 참조하세요.
관계형 및 논리 패턴은 범위, 대안 및 제외를 설명합니다. 다음 메서드는 온도를 분류하기 위해 결합합니다.
static string ClassifyTemperature(int temperature) =>
temperature switch
{
< 0 => "Below freezing",
>= 18 and <= 24 => "Comfortable",
(>= 0 and < 10) or > 30 => "Far outside the comfortable range",
_ => "Cool or warm"
};
식 temperature 은 패턴 입력입니다. C#은 이를 한 번 평가하고 각 스위치 암은 결과 값을 테스트합니다. 무기는 다음 테스트를 보여 줍니다.
-
< 0는 하나의 경계를 테스트합니다. -
>= 18 and <= 24는 범위를 테스트합니다. -
(>= 0 and < 10) or > 30는 두 가지 대체 범위를 테스트합니다.
이 문서에서는 패턴과 명령적 조건을 모두 보여 주므로 각 폼을 학습하고 동일한 결정을 표현하는 방법을 비교할 수 있습니다. 단일 조건은 두 폼에서 비슷하게 보일 수 있습니다. 패턴은 결과 옆에 선택 항목을 유지하여 일련의 관련 분기를 더 쉽게 읽을 수 있도록 할 수 있습니다. 코드를 가장 쉽게 이해할 수 있는 양식을 선택합니다.
관계형 패턴과 값 비교
관계형 패턴은 패턴 입력을 >=, <, > 또는 <=를 사용하여 컴파일 시간 상수와 비교합니다.
컴파일 시간 상수는 프로그램을 컴파일하는 동안 컴파일러가 평가할 수 있는 값입니다. 숫자 및 문자 리터럴과 const 호환되는 숫자 또는 문자 형식의 변수가 대표적인 예입니다. 일반 변수, 속성, 메서드 호출 및 static readonly 필드는 컴파일 시간 상수가 아닙니다. 첫 번째 예제에서 >= 18와 <= 24는 둘 다 동일한 평가된 temperature 값을 테스트합니다.
동일한 관계형 기호는 일반 식이나 패턴에 나타날 수 있습니다. 다음 예제에서는 온도가 있는 두 폼을 모두 사용합니다.
static void ShowExpressionAndPattern(int temperature, int threshold)
{
bool belowThreshold = temperature < threshold;
bool belowFreezing = temperature is < 0;
string description = temperature switch
{
< 0 => "Freezing",
0 => "Freezing point",
> 0 => "Above freezing"
};
Console.WriteLine(
$"Below threshold: {belowThreshold}; " +
$"below freezing: {belowFreezing}; {description}");
}
temperature < threshold 는 관계형 식입니다. 두 피연산자를 모두 평가하고 bool를 생성합니다. 두 피연산자 중 어느 하나는 상수가 아닌 식일 수 있습니다.
temperature 에서 temperature is < 0패턴 입력 식입니다. C#은 이를 평가하고 관계형 패턴 < 0 은 결과 값을 테스트합니다. 스위치 arm < 0 => "Freezing"에서 switch 앞의 식이 입력을 제공하므로, 패턴에는 < 0만 포함됩니다.
식은 threshold를 변수 temperature와 비교할 수 있습니다. 관계형 패턴 피연산자는 컴파일 시간 상수여야 하므로 비교 값이 변수일 때 관계형 식을 사용합니다. 비교 값이 상수이면 두 폼이 모두 작동할 수 있습니다.
오른쪽 피연산자가 상수인 경우에는 주로 가독성을 기준으로 선택하세요. 관계형 식은 종종 하나의 직접 비교에 적합합니다. 관계형 패턴은 다른 패턴과 조합할 수 있으며, 여러 범위가 switch 결과로 매핑될 때 자연스럽게 사용할 수 있습니다.
조건과 논리 패턴 결합
논리 패턴은 패턴 연산and자 not, or를 사용하여 패턴을 결합하거나 부정합니다:
- 패턴은
and중첩된 패턴이 모두 일치할 때 일치합니다. -
or패턴은 두 중첩된 패턴 중 하나가 일치할 때 일치합니다. -
not패턴은 해당 중첩 패턴이 실패할 때 성공합니다.
여는 예제에서는 범위를 or 설명하고 대안을 설명하는 데 사용합니다and. 패턴은 not .에서 status is not Status.Complete와 같이 값을 제외할 수 있습니다. 다음 메서드는 해당 구문을 학습하고 동일한 테스트를 표현하는 방법을 비교할 수 있도록 두 폼을 모두 보여 줍니다.
static bool IsWeekendPattern(DayOfWeek day) =>
day is DayOfWeek.Saturday or DayOfWeek.Sunday;
static bool IsWeekendImperative(DayOfWeek day) =>
day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
패턴 형식은 or로 연결된 두 개의 상수 패턴을 사용합니다. 명령적 폼은 조건부 OR 연산 ||자에 의해 조인된 두 개의 같음 식을 사용합니다. 두 양식 모두 이 단일 조건에 대해 간결하고 명확합니다. 주변 코드에 가장 적합한 양식을 선택합니다. 패턴은 종종 여는 예제와 switch같이 몇 가지 관련 선택 항목을 명확하게 설명합니다.
패턴 연산자는 부울 식이 아니라 패턴을 구성합니다. 즉, and는 패턴 결합에, or는 패턴 대안에, not는 패턴 부정에 해당합니다. 부울 식에는 &&, || 및 !를 사용합니다. 여러 패턴 대안의 결과가 동일한 경우를 선택합니다 or . 허용되는 모든 값을 나열하는 것보다 제외된 패턴을 더 명확하게 표현할 때 선택합니다 not .
괄호를 사용하여 패턴 그룹화
괄호가 있는 패턴은 괄호를 사용하여 중첩 패턴이 그룹화되는 방식을 표시하거나 변경합니다. 바인딩은 괄호를 쓰지 않을 때의 암묵적 그룹화와 비슷하게, 연산자가 어떤 패턴 피연산자들을 함께 그룹화하는지를 결정합니다. C#은 다음 바인딩 순서를 지정합니다.
notandor
다음 테스트는 우선 순위 1~3 또는 특수 우선 순위 9를 허용합니다.
static bool IsAcceptedPriority(int priority) =>
priority is (>= 1 and <= 3) or 9;
컴파일러가 or를 and보다 먼저 그룹화합니다. 괄호를 사용하면 의도한 그룹화가 명시적으로 표시되고 1에서 3까지의 범위 또는 9의 두 가지 대안을 쉽게 볼 수 있습니다. 가독성을 위해 패턴이 혼합 andor되거나 복합 패턴에 적용될 때마다 not 괄호를 사용합니다. 괄호는 다음과 같이 not (>= 1 and <= 3)기본 그룹화도 변경할 수 있습니다.
중첩 패턴의 런타임 검사 순서는 지정되지 않으며 패턴 연산자는 단락 부울 규칙이 아닌 패턴 일치 규칙을 따릅니다. 결과가 확인 순서와 독립적이도록 중첩된 패턴을 작성합니다.
별도 조건에는 when 가드를 사용하세요
논리 패턴은 중첩된 패턴이 입력 값 자체를 설명할 때 가장 적합합니다.
when 가드는 case 레이블 또는 switch arm에 대한 추가 불리언 조건입니다. 또한 패턴 입력과 별개의 정보에 따라 결정되는 경우 가드를 사용합니다.
다음 경고는 온도와 별도의 isOutdoors 값에 따라 달라집니다.
static string GetHeatWarning(int temperature, bool isOutdoors) =>
temperature switch
{
> 35 when isOutdoors => "High heat outdoors",
> 35 => "High heat",
_ => "No heat warning"
};
관계형 패턴 > 35 은 입력을 temperature 설명합니다. 가드 when isOutdoors 는 별도의 값을 확인합니다. 조건에 패턴 구문으로는 명확히 표현하기 어려운 메서드 호출이나 부울 식이 필요할 때도 가드를 사용하는 것이 좋습니다.
특히 여러 스위치 암에서 입력의 허용된 셰이프 또는 값을 더 쉽게 볼 수 있도록 관계형 및 논리 패턴을 사용합니다. 직접적인 조건을 더 간단하게 나타낼 수 있을 때는 일반 부울 식을 사용합니다.
when 스위치 선택이 별도의 값에 따라 달라지거나 부울 식으로 더 잘 표현되는 조건에 따라 가드를 사용합니다.
참고하십시오
.NET