선언, 상수 및 var 패턴

팁 (조언)

이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 이전에 C# 패턴을 사용하지 않은 경우 패턴 일치 개요 로 시작합니다. 전체 언어 규칙은 패턴 참조를 참조하세요.

패턴이 입력 식에 적용됩니다. C#은 식을 계산한 다음 패턴이 결과 값을 테스트하거나 캡처합니다. 선언, 상수 및 var 패턴은 다음과 같은 세 가지 실질적인 질문에 답변합니다.

  • 선언 패턴: 식이 호환되는 런타임 형식의 null이 아닌 값을 생성했나요? 그렇다면 해당 값에 대한 변수를 선언합니다.
  • 상수 패턴: 식에서 특정 상수 값을 하나 생성했나요?
  • var 패턴: 식에서 생성한 값은 무엇인가요? 먼저 형식 또는 값을 테스트하지 않고 캡처합니다.

선언 패턴을 사용하여 형식 테스트 및 캡처

선언 패턴은 형식 및 지정으로 구성됩니다. 이 형식은 테스트할 런타임 형식을 지정합니다. 지정은 일치하는 값을 받는 변수를 선언합니다.

다음 예제는 object를 받으므로, 이 식은 매우 다양한 유형을 생성할 수 있습니다. 선언 패턴을 사용하면 일치하는 분기가 별도의 형식 테스트 및 캐스트 없이 소수 자릿수를 사용할 수 있습니다.

static void PrintPrice(object value)
{
    if (value is decimal amount)
    {
        Console.WriteLine($"Price: {amount:C}");
    }
}

value is decimal amount의 경우:

  • value 은 입력 식입니다. C#은 먼저 평가합니다.
  • decimal 는 테스트된 형식입니다. 이 패턴은 평가된 값이 null이 아니고 해당 런타임 형식이 decimal와 호환되면 일치합니다.
  • amount 는 지정입니다. 패턴이 일치하면 10진수 값을 선언 amount 하고 할당합니다.

컴파일러는 코드에서 읽기 전에 지역 변수가 값을 받는지 여부를 추적합니다. 이 추적을 명확한 할당이라고 합니다. if 블록 내부에서는 패턴이 일치하는 경우에만 해당 블록이 실행되므로, 컴파일러는 amount가 할당되었다는 것을 알고 있습니다. 코드가 if 블록 밖에서 amount에 접근하려고 하면 컴파일러에서 오류를 발생시킵니다. value 값이 decimal 아니면 변수 amount 가 값에 할당되지 않습니다.

일치하는 분기에서 결과를 테스트된 형식으로 사용해야 하는 경우 선언 패턴을 선택합니다. 식을 반복하거나 별도의 캐스트를 작성하지 않도록 테스트, 변환 및 변수 선언을 결합합니다.

한 식이 몇 가지 유용한 형식을 생성할 수 있는 경우 선언 패턴을 사용할 수도 있습니다.

static string FormatSensorValue(object reading) =>
    reading switch
    {
        int count => $"Count: {count}",
        double temperature => $"Temperature: {temperature:F1}°C",
        string message => $"Message: {message}",
        _ => "Unsupported reading"
    };

결과에는 해당 형식의 형식 지정 동작이 필요하기 때문에 각 arm은 일치하는 형식의 변수를 선언합니다. 선언 패턴은 평가된 값이 null이 아니고 패턴에 허용되는 변환을 통해 테스트된 형식과 호환되는 런타임 형식이 이미 있는 경우에만 일치합니다. null 에는 일치하는 패턴에 대한 런타임 형식이 없습니다. 또한 패턴은 사용자 정의 변환 연산자를 실행하지 않습니다. 이 연산자는 값을 다른 형식으로 변환하는 요청이 아니라 형식 테스트 및 캡처입니다. 전체 호환성 규칙은 선언 및 형식 패턴을 참조하세요.

특정 값을 상수 패턴과 일치시키기

상수 패턴은 식이 숫자, 문자열, 부울, 열거형 멤버, 선언된 const 값 등의 특정 상수를 생성하는지 여부를 테스트합니다null.

여러 알려진 값이 각각 다른 결과를 생성하는 경우 상수 패턴은 스위치 식에 맞습니다.

static string GetCommandMessage(Command command) =>
    command switch
    {
        Command.Start => "Starting",
        Command.Stop => "Stopping",
        Command.Pause => "Pausing",
        _ => "Unknown command"
    };

Command 는 명명된 상수 집합을 정의하는 형식인 열거형입니다. Command.Start, Command.StopCommand.Pause 해당 열거형 멤버이므로 각 스위치 암은 상수 패턴을 사용하여 명명된 명령 값 하나를 테스트합니다.

명령에 여러 가지 개별 의미가 있을 수 있는 경우 이 양식을 선택합니다. 스위치 암은 값과 결과를 함께 유지합니다. 하나의 간단한 동등성 비교에는 if (command == Command.Start) 같은 if 문이 일반적으로 더 읽기 쉽습니다.

상수 패턴 일치는 사용자 정의 == 연산자가 아닌 기본 제공 언어 같음 규칙을 사용합니다. 자세한 같음 및 변환 규칙은 상수 패턴 참조를 참조하세요.

null 상수 패턴은 신뢰할 수 있는 null 검사에 유용합니다.

static bool HasText(string? text) => text is not null;

null 상태를 확인할 때 is null 또는 is not null을 선택하세요. 이러한 패턴은 식의 형식이 오버로드되는 경우에도 사용자 정의 같음 연산자를 ==호출하지 않습니다.

가드에 대해 var 패턴으로 결과를 캡처

var 패턴null를 포함한 모든 결과와 일치하며, 형식이 입력 식의 컴파일 타임 형식인 변수를 선언합니다. 다른 패턴이 이미 개체와 일치하는 동안 계산된 값을 캡처할 수 있습니다.

static string GetDeliveryMessage(object delivery) =>
    delivery switch
    {
        ExpressDelivery express
            when EstimateDays(express) is var days && days <= 2
                => $"Arrives in {days} day{(days == 1 ? "" : "s")}",
        ExpressDelivery => "Express delivery for your location takes more than two days",
        _ => "Standard delivery"
    };

static int EstimateDays(ExpressDelivery delivery) =>
    delivery.MilesAway <= 500 ? 1 :
    delivery.MilesAway <= 1_000 ? 2 : 3;

record ExpressDelivery(int MilesAway);

선언 패턴 ExpressDelivery express 은 먼저 배달 개체를 .로 express캡처합니다. 메서드 호출 EstimateDays(express)var 패턴의 입력 식입니다. C#은 해당 메서드 호출 var days 을 평가하고 형식 또는 값을 테스트하지 않고 결과 예상치 days 를 캡처합니다. 가드가 성공하면 1~2일이 될 수 있습니다. arm 결과에는 실제 일 수를 보고하려면 캡처된 값이 필요합니다.

일반 지역 변수는 switch-arm 패턴과 해당 when 가드 간에 선언할 수 없습니다. 결과에서 다시 호출 EstimateDays(express) 하면 계산이 반복됩니다. 코드가 이미 일치하고 가드와 결과 둘 다 계산된 중간 값이 필요한 경우 이 var 패턴 양식을 선택합니다.

캡처된 값이 필요하지 않은 경우 변수를 선언하는 대신 무시 패턴을 _ 사용합니다.

참고하십시오