C\#9.0 새로운 특성의 패턴 일치 간소화 실현

4957 단어 C#9.0패턴 매 칭
MS Build 2020 대회 에서 C\#언어 개발 프로젝트 매니저 Mads Torgersen 은 C\#9.0 이.NET 5 에 따라 올해 11 월 에 정식으로 발 표 될 것 이 라 고 발표 한 것 을 기억한다.현재.NET 5 는 프 리 뷰 5 단계 에 이 르 렀 고 C\#9.0 도 이미 규 모 를 갖 추고 있다.설 레 는 마음 을 참 지 못 하고'C\#.NET 주 워 넣 기'시리즈 업 데 이 트 를 며칠 중단 하고 제 가 알 고 있 는 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]

좋은 웹페이지 즐겨찾기