팁 (조언)
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 프로그래밍을 처음 접하는 경우 먼저 시작 자습서로 시작 하세요. 숙련된 C# 개발자는 전체 구문 및 규칙에 대한 패턴 참조 를 사용할 수 있습니다.
다른 언어에서 오시겠습니까? C# 패턴은 Java 패턴 일치 및 Python match 사례와 유사한 역할을 합니다. C#은 switch 식, switch 문 및 is 식에서 패턴을 사용합니다.
패턴 일치는 식에 패턴을 적용하는 것입니다. 패턴은 입력 식을 테스트하는 조건입니다. 패턴 입력은 해당 식입니다. C#은 입력 식을 평가합니다. 결과는 평가된 값입니다. 패턴은 해당 값에 특정 형식이 있는지, 특정 값과 같은지 또는 특정 도형이 있는지 테스트합니다. 패턴이 일치하면 코드는 더 구체적인 형식 또는 개체에서 추출된 값과 같이 테스트에서 학습한 정보를 사용할 수 있습니다.
다음 세 가지 컨텍스트에서 패턴을 사용할 수 있습니다.
- 연산자
is의 오른쪽에 있습니다. -
case문의 레이블에 있습니다switch. -
switch식의 한 분기에서.
패턴은 각 분기가 처리하는 데이터를 설명하기 때문에 비교 문 시퀀스보다 더 명확합니다. 예를 들어 다음 메서드는 식을 사용하여 switch 배달 메시지를 선택합니다.
static string GetDeliveryMessage(Delivery? delivery) =>
delivery switch
{
null => "No delivery was scheduled.",
ExpressDelivery express => $"Express package {express.TrackingCode}",
StandardDelivery { Days: <= 2 } => "Standard delivery arriving soon",
_ => "Standard delivery"
};
재귀 패턴에는 고유한 입력 식이 있습니다.
StandardDelivery { Days: <= 2 }에서는 외부 패턴이 delivery 식을 받습니다. 재귀 <= 2 패턴은 일치하는 Days 개체에서 StandardDelivery 속성 식을 받습니다.
앞 switch 의 식은 입력 식입니다. 중괄호 안의 각 줄은 스위치 암입니다. 패턴은 => 앞에 나타나고, 결과는 그 뒤에 나타납니다. C#은 입력 식을 계산한 다음, 패턴이 일치하고 선택적 when 가드 true가 있는 첫 번째 암을 텍스트 순서로 선택합니다. 선택적 when 가드는 패턴 후에 작성된 추가 부울 조건입니다. 앞의 예제에서는 다음과 같은 패턴을 보여 줍니다.
-
null는 상수 패턴입니다.delivery식이null로 평가되는지 테스트합니다. -
ExpressDelivery express는 두 부분으로 구성된 선언 패턴 입니다.ExpressDelivery는 형식 테스트 부분입니다. 평가된 값이 런타임 형식과 호환ExpressDelivery되는 null이 아닌 개체인지 여부를 테스트합니다.express는 변수 지정입니다. 이름이 지정된express변수를 선언하고 일치하는ExpressDelivery개체를 할당합니다. -
StandardDelivery { Days: <= 2 }는 형식 테스트로 시작합니다.StandardDelivery는 평가된 값이 해당 형식의 null이 아닌 개체인지 여부를 테스트합니다. 중괄호에는 속성 패턴이 포함됩니다.Days는 검사할 속성의 이름을 지정하므로Days속성 식이 재귀 패턴의 입력이 됩니다.<= 2부분은 평가된 값이 이하인지 테스트하는2입니다. -
_(밑줄)은 무시 패턴입니다. 를 포함하여null평가된 모든 값과 일치합니다. 이전 분기들에서 이미null, 특급 배송, 그리고 2일 이내에 도착하는 일반 배송을 처리하므로, 이 마지막 분기는 남아 있는 모든 값을 처리합니다.
경비병이 없는 when 팔은 보호되지 않습니다. 첫 번째 예제의 모든 팔은 보호되지 않습니다. 이전의 보호되지 않은 팔이 이후 팔이 일치시킬 수 있는 평가된 모든 값과 일치하면 이후 팔이 하위 항목이 됩니다.
포섭된 패턴은 일치할 수 있는 모든 입력값이 이미 앞선 switch arm에서 매칭된 패턴을 의미합니다. 일치시킬 수 없으므로 컴파일러에서 오류를 보고합니다. 무시 암(_)은 모든 입력 식과 일치하므로 마지막에 와야 합니다. 보호된 팔은 가드가 될 false수 있기 때문에 패턴에 따라 나중의 팔을 하위화하지 않습니다.
switch 식은 해당 분기에서 가능한 모든 입력 식을 처리하는 경우 완전한 식입니다. 첫 번째 예제는 마지막 폐기 분기가 앞선 분기들에서 일치하지 않는 모든 경우를 처리하므로 망라적입니다. 컴파일러는 arm이 처리하지 않는 잠재적인 입력 값을 감지할 때 경고합니다. 컴파일러는 패턴의 모든 조합에 대한 완전성을 증명할 수는 없지만 이 진단을 통해 올바른 패턴 일치 코드를 작성할 수 있습니다. 자세한 일치, 소급 및 완전성 규칙은 패턴 참조를 참조하세요.
is를 사용하여 하나의 조건을 테스트합니다.
하나의 부울 테스트가 필요할 때는 is 연산자를 사용합니다. 다음 코드는 식을 평가하고 delivery 선언 패턴을 ExpressDelivery express적용합니다. 평가된 값이 null이 아니고 해당 런타임 형식이 ExpressDelivery와 호환되면 형식 부분이 일치합니다. 패턴이 일치하면 변수 지정이 다음을 선언합니다.express
static void PrintTrackingCode(Delivery delivery)
{
if (delivery is ExpressDelivery express)
{
Console.WriteLine($"Track express package {express.TrackingCode}");
}
}
컴파일러는 코드에서 읽기 전에 지역 변수가 할당되었는지 여부를 추적합니다. 이 추적을 명확한 할당이라고 합니다.
if 블록 내부에서는 패턴이 일치하는 개체를 true에 할당한 경우에만 조건이 express일 수 있습니다. 따라서 컴파일러는 그 지점에서 express가 확실히 할당되었다는 것을 알고 있습니다. 코드는 해당 TrackingCode 속성을 안전하게 사용할 수 있습니다. 별도의 캐스트가 필요하지 않습니다. 형식 테스트만 필요하고 변수를 선언할 필요가 없는 경우 다음과 같은 delivery is ExpressDelivery형식 패턴을 사용합니다.
null 검사를 위해 is null 또는 is not null를 사용합니다. 이러한 패턴은 사용자 정의 == 또는 != 연산자를 호출하지 않습니다.
static void PrintPackageStatus(Delivery? delivery)
{
if (delivery is null)
{
Console.WriteLine("No package is available.");
}
else
{
Console.WriteLine("A package is ready to track.");
}
}
더 많은 null 안전 지침은 nullable 참조 형식을 참조하세요.
구문 또는 식을 선택하세요
패턴은 다음 두 switch가지 형식으로 작동합니다.
- 각 일치 사례에서 하나 이상의 문을 실행해야 하는 경우
switch문을 사용합니다. - 각 일치 항목이 값을 생성해야 하는 경우
switch식을 사용합니다.
다음 switch 문은 전달 상태 업데이트를 알립니다. 특급 배송 분기는 메시지 두 개를 기록하므로 구문이 자연스럽게 들어맞습니다.
static void PrintDeliveryUpdate(Delivery? delivery)
{
switch (delivery)
{
case null:
Console.WriteLine("No delivery was scheduled.");
break;
case ExpressDelivery express:
Console.WriteLine($"Express delivery {express.TrackingCode} is ready.");
Console.WriteLine("Notify the priority desk.");
break;
case StandardDelivery standard:
Console.WriteLine($"Standard delivery arrives in {standard.Days} days.");
break;
default:
Console.WriteLine("Another delivery type is scheduled.");
break;
}
}
각 case는 delivery 식에 패턴을 적용합니다. 일치하는 섹션은 스위치를 종료하기 전에 break 임의의 개수의 문을 실행할 수 있습니다. 이 섹션에서는 default 이전 사례가 일치하지 않는 모든 항목을 처리합니다.
다음 스위치 식은 if / else if 하나의 결과를 할당하는 체인을 대체합니다.
static string GetStatusMessage(StandardDelivery delivery) =>
delivery.Days switch
{
0 => "Delivered today",
1 => "Arriving tomorrow",
<= 3 => "Arriving soon",
_ => "In transit"
};
스위치 식은 모든 팔의 목적이 동일하기 때문에 간결합니다. 반환된 값을 생성합니다. 분기가 작업을 수행할 때 switch 문을 사용하고 분기가 하나의 결과를 계산할 때 switch 식을 사용합니다.
패턴 범주
C#에는 일반적인 종류의 데이터 테스트에 대한 패턴이 포함됩니다.
| 패턴 범주 | 테스트하는 내용 |
|---|---|
선언, 상수 및 var 패턴 |
런타임 형식, 특정 상수 값 또는 캡처하려는 모든 값 |
| 형식 패턴 | 변수를 선언하지 않은 런타임 형식 |
| 속성 및 위치 패턴 | 속성, 필드 또는 분해된 값 |
| 관계형 및 논리적 패턴 | 비교 및 조합(예: and, 및) ornot |
| 목록 패턴 | 목록 또는 배열의 값 및 모양 |
| 버리기 패턴 및 버린 항목 | 나머지 값 또는 코드에서 의도적으로 무시하는 값 |
표에 링크된 기본 사항 문서에서는 이 섹션에 현재 문서화된 범주를 중점적으로 다룹니다. 모든 패턴 범주에 대한 전체 구문 및 예제는 패턴 참조를 참조하세요.
참고하십시오
.NET