C\#9.0 새로운 특성의 패턴 일치 간소화 실현
패턴 매 칭(Pattern Matching)은 C\#7.0 에 도 입 된 것 으로 switch 문 구 를 강화 하여 복잡 한 조건 매 칭 을 지원 할 수 있 습 니 다.다음은 패턴 이 일치 하 는 일반적인 용법 을 예시 로 보 여 드 리 겠 습 니 다.
만약 에 지금 우리 가 각종 차량 이 특정한 고속도로 에서 통행 료 를 계산 하려 면 다음 과 같은 네 가지 차량 이 있 는데 각각 다음 과 같은 네 가지 유형 으로 정의 하고 각 유형 에서 통행 료 계산 과 관련 된 속성 을 정의 했다.
public class Car
{
public int Passengers { get; set; }
}
public class DeliveryTruck
{
public int GrossWeightClass { get; set; }
}
public class Taxi
{
public int Fares { get; set; }
}
public class Bus
{
public int Capacity { get; set; }
public int Riders { get; set; }
}
다음은 패턴 이 일치 하 는 방식 으로 통행 료 를 계산 하 는 방법 을 실현 한다.
public decimal CalculateToll(object vehicle) =>
vehicle switch
{
Car { Passengers: 0} => 2.00m + 0.50m,
Car { Passengers: 1} => 2.0m,
Car { Passengers: 2} => 2.0m - 0.50m,
Car c => 2.00m - 1.0m,
Taxi t => t.Fares switch
{
0 => 3.50m + 1.00m,
1 => 3.50m,
2 => 3.50m - 0.50m,
_ => 3.50m - 1.00m
},
Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m,
Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m,
Bus b => 5.00m,
DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
DeliveryTruck _ => 10.00m,
{ } => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))
};
코드 는 마지막 참조 링크 에서 유래 합 니 다.위의 코드 를 읽 기 가 힘 들 면 링크 의 첫 번 째 링크 를 먼저 읽 고 패턴 일치 에 대한 상세 한 소 개 를 할 수 있 습 니 다.
이 업무 논 리 를 실현 하려 면 C\#7.0 이전에 if/else 로 이 루어 져 야 합 니 다.패턴 이 일치 하면 서 많이 편리 해 졌 고 사용 이 유연 하 며 코드 구조 도 아름 다 워 졌 다.
나 에 게 패턴 매 칭 은 아주 좋 은 특성 이다!하지만 아직 부족 합 니 다.C\#9.0 은 패턴 에 맞 는 쓰기 방법 을 더욱 간소화 하 였 습 니 다!
위의 코드 를 예 로 들 면 패턴 매 칭 은 세 가지 로 나 눌 수 있다.간단 한 모델,관계 모델 과 논리 모델 이다.다음은 C\#9.0 대 세 가지 모델 의 간소화 에 대해 말씀 드 리 겠 습 니 다.
단순 모드
위의 Calculate Toll 방법 예제 코드 를 예 로 들 면 간단 한 모드 는 다음 과 같 습 니 다.
vehicle switch
{
...
Car c => 2.00m - 1.0m
}
우 리 는 사실 위의 변수 c 성명 이 사용 되 지 않 았 음 을 발견 할 수 있 습 니 다.현재 C\#9.0 에서 그것 을 생략 할 수 있 습 니 다.
vehicle switch
{
...
Car => 2.00m - 1.0m
}
관계 모드위의 Calculate Toll 방법 예제 코드 를 예 로 들 면 관계 모델 은 비교(크기)관 계 를 통 해 일치 합 니 다.해당 하 는 코드 세 션 은 다음 과 같 습 니 다.
DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
DeliveryTruck _ => 10.00m,
현재 C\#9.0 은 간략하게 쓸 수 있다.
DeliveryTruck t when t.GrossWeightClass switch
{
> 5000 => 10.00m + 5.00m,
< 3000 => 10.00m - 2.00m,
_ => 10.00m,
}
논리 모드C\#9.0 에서 논리 연산 자 and,or 와 not 를 통 해 모드 를 조합 할 수 있 습 니 다.다음은 예제 입 니 다.
DeliveryTruck t when t.GrossWeightClass switch
{
< 3000 => 10.00m - 2.00m,
>= 3000 and <= 5000 => 10.00m,
> 5000 => 10.00m + 5.00m,
}
not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))
또한,not 키 워드 는 if 조건 판단 의 논리 비(!)를 대체 할 수 있 습 니 다.예 를 들 면:
//
if (!(e is Customer)) { ... }
// ( )
if (e is not Customer) { ... }
C\#9.0 에는 또 다른 유용 한 새로운 기능 이 많 습 니 다.다음 글 은 계속 공유 하 겠 습 니 다.글 을 짧게 쓰 는 것 은 제 가 게 으 름 을 피 우 는 것 이 아니 라 한꺼번에 읽 을 수 있 도록 하기 위해 서 입 니 다.여러분 들 이 자잘 한 시간 에 읽 을 수 있 도록 하기 위해 서 입 니 다.글 이 너무 길 어서'소장 하고 보지 않 는'시리즈 가 되 지 않도록 하 겠 습 니 다.참고:
https://bit.ly/2MNc0DJ
https://bit.ly/2UzEIwu
C\#9.0 의 새로운 특성 에 대한 패턴 매 칭 간소화 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#9.0 패턴 매 칭 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
저자:왕 량
출처:http://cnblogs.com/willick
연락:[email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C\#9.0 새로운 특성의 매개 변 수 를 간단히 말 합 니 다.이 종 류 는 null,빈 문자열,빈 집합 검 사 를 포함 하여 세 가지 흔히 볼 수 있 는 비 공 검 사 를 포함 합 니 다.사용 예시: 이러한 비공 식 검사 에서 흔히 볼 수 있 는 C\#9.0 은 이에 대해 간...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.