팁 (조언)
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 패턴이 새로운 경우 패턴 일치 개요 로 시작합니다. 완전한 호환성 규칙은 언어 참조의 선언 및 형식 패턴을 참조하세요.
입력 식에 형식 패턴 이 적용됩니다. C#은 식을 계산한 다음 결과 값이 null이 아니고 런타임 형식이 지정된 형식과 호환되는지 테스트합니다. 형식 패턴은 형식 테스트가 성공했는지 여부만 보고합니다. 변수를 선언하지 않습니다.
예/아니요 형식의 질문하기
배달 시스템에서 IRouteStop 는 경로 계획에서 허용하는 대상에 대한 기능 계약입니다.
CanRoute는 평가 중인 대상이 해당 기능을 지원하는지 확인하고, 그 불리언 결과에 따라 대상이 경로 계획 워크플로에 진입할지를 결정합니다. 워크플로에는 예or-no 답변만 필요하고 경로 중지 멤버를 읽지 않으므로 캡처된 변수가 없는 형식 패턴이 적합합니다.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
입력 식은 destination이고, IRouteStop은 테스트 중인 형식입니다. 대답이 예 또는 아니요일 때 형식 패턴을 선택합니다. 일치하는 분기가 주소를 읽거나 다른 멤버 IRouteStop를 통해 호출해야 하는 경우 분기가 해당 형식의 변수를 갖도록 선언 패턴을 대신 선택합니다.
메모
또한 destination is IRouteStop _이 표시될 수 있습니다. 이 구문은 변수가 유지되지 않음을 _ 의미하는 선언 패턴입니다. 두 양식이 모두 유효할 때 동일한 형식 테스트를 수행하지만 destination is IRouteStop 테스트 전용 의도를 더 직접적으로 나타냅니다.
클래스 및 인터페이스 일치
배달 시스템에서 IRouteStop 경로 계획 대상에 대한 기능 계약을 정의하지만 RouteStop 일반적인 경로 중지 데이터 및 구현을 제공하는 기본 클래스입니다.
ExpressRouteStop 는 .에서 RouteStop파생된 특수 클래스입니다. 이 예제에서는 하나의 평가된 값을 테스트하여 출력이 호환되는 세 가지 형식을 모두 보여 줄 수 있도록 합니다. 각 테스트에는 부울 결과만 필요하므로 캡처된 변수가 필요하지 않습니다.
interface IRouteStop { }
abstract class RouteStop(string street) : IRouteStop
{
public string Street { get; } = street;
public string GetDisplayName() => Street;
}
sealed class ExpressRouteStop(string street) : RouteStop(street)
{
}
static void ShowCompatibility()
{
object destination = new ExpressRouteStop("8 Oak Avenue");
Console.WriteLine($"Exact class: {destination is ExpressRouteStop}");
Console.WriteLine($"Base class: {destination is RouteStop}");
Console.WriteLine($"Interface: {destination is IRouteStop}");
}
평가된 값은 ExpressRouteStop입니다. 출력은 그것이 정확한 클래스, 해당 RouteStop 기본 클래스, 그리고 RouteStop가 구현하는 IRouteStop 인터페이스와 일치함을 보여 줍니다.
자세한 호환성 규칙 및 에지 사례는 형식 패턴 참조를 참조하세요.
여러 형식 라우팅
지원 시스템에서 SupportRequest 는 다음과 같은 PasswordResetRequestBillingQuestion특수한 요청 클래스의 기본 클래스입니다.
스위치 암은 패턴이 일치할 때 반환할 결과와 패턴을 페어링합니다. 각 암은 처리 큐의 이름을 반환하고, 최종 암은 평가된 다른 값에 대한 대체 큐를 제공합니다. 선택한 큐는 평가된 값의 런타임 형식에만 따라 달라지므로 요청 멤버를 읽지 않으므로 형식 패턴이 적합합니다.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
각 arm은 형식 질문에 대답하고 해당 요청을 처리하는 큐를 반환합니다. arm에서 요청 멤버를 읽어야 하는 경우 선언 패턴을 사용하여 변수에서 일치하는 값을 캡처합니다.
스위치 암은 위에서 아래로 간주됩니다. 특수 클래스를 기본 클래스 앞에 배치합니다. 그렇지 않으면 기본 클래스 분기가 특수화된 클래스의 모든 인스턴스와 매치될 수 있으므로, 뒤의 분기는 도달할 수 없게 됩니다.
선택 사항: 형식 매개 변수를 테스트된 형식으로 사용
이 선택적 예제는 제네릭 형식 및 메서드를 기반으로 합니다. 형식 매개 변수 (예: TRequest 호출자가 제공하는 형식의 자리 표시자)입니다. 들어오는 요청 일괄 처리에는 여러 요청 유형이 포함될 수 있으며 호출자는 요청이 기밀 처리가 필요한지 여부를 테스트하기 위해 제공합니다 ConfidentialRequest . 부울 결과는 전체 일괄 처리에 대한 기밀 처리를 선택하고 표시되는 상태 메시지를 생성합니다. 형식 매개 변수가 있는 형식 패턴은 일치하는 요청의 존재만 중요하므로 일치하는 개체를 유지할 필요가 없으므로 적합합니다.
static void ShowConfidentialBatchHandling()
{
object[] incomingRequests = [new BillingQuestion(), new ConfidentialRequest()];
bool requiresConfidentialHandling =
ContainsRequestOfType<ConfidentialRequest>(incomingRequests);
Console.WriteLine(requiresConfidentialHandling
? "Send the entire batch to confidential handling."
: "Send the batch to standard handling.");
}
static bool ContainsRequestOfType<TRequest>(IEnumerable<object> requests)
{
foreach (object request in requests)
{
if (request is TRequest)
{
return true;
}
}
return false;
}
호출자에게 일치하는 요청 자체가 필요한 경우 일치하는 항목을 반환하는 검색 또는 필터 작업이 더 적합합니다.
참고하십시오
.NET