함수형 프로그래밍 언어에서 유래한 또 다른 개념이 C#과 VB 진영에 합류했는데, 바로 패턴 매칭(Pattern Matching)이라는 기능입니다. 언뜻 보기에 패턴 일치는 스위치/선택 문 블록처럼 작동하지만 그 기능은 훨씬 더 강력합니다.
참고: VB 버전 사양이 아직 완성되지 않았으므로 이러한 예제는 주로 C#의 패턴 일치 사양에서 가져온 것입니다.
is 또는 Matches 연산자
.NET의 패턴 일치는 주로 "is/Matches" 연산자를 통해 지원됩니다. 이 덜 친숙한 연산자는 클래스를 구성 요소 부분으로 나눕니다. 다음 예는 화요일 뉴스 보도에 언급된 데카르트 레코드 클래스 http://www.infoq.com/news/2014/08/Record-Class(레코드 클래스)를 기반으로 합니다.
public static bool operator is(Cartesian c, out double x, out double y) x = c.X; y = c.Y; return true; }
이 연산자는 정의 클래스에서만 사용하도록 제한되지 않습니다. 다음 예에서는 연산자를 다른 방식으로 정의하여 데카르트 객체를 분해하고 Polar 객체와 일치시킬 수 있도록 합니다.
public static class Polar { public static bool operator is( Cartesian c, out double R, out double Theta) { R = Math.Sqrt(c.X*c.X + c.Y*c.Y); Theta = Math.Atan2(c.Y, c.X); return c.X != 0 || c.Y != 0; } } var c = Cartesian(3, 4); if (c is Polar(var R, *)) Console.WriteLine(R);
유형 패턴
가장 간단한 패턴은 유형 변환을 수행하는 동시에 이를 변수에 할당하려고 시도하는 유형 패턴입니다. 다음은 그러한 패턴의 예입니다.
if (expr is Type v) { // code using v }
재귀 패턴
대부분의 패턴은 재귀 패턴으로 나타납니다. 즉, 더 간단한 패턴으로 구성되어 있다는 뜻입니다. 이 패턴의 예를 살펴보십시오.
var a = new Location(1, 2, 3); //x=1, y=2, z=3 if (a is Location(1, var y, *))
이 재귀 패턴에는 상수 패턴, var 패턴 및 와일드카드 패턴이 포함됩니다.
상수 모드
이 모드는 속성을 상수 값과 일치시킬 수 있습니다. 상수 일치는 object.Equals(left, right) 메소드를 사용하여 둘이 일치하는지 확인합니다.
Var 모드
Var 모드는 확실히 성공적으로 일치합니다. 이 모드에 해당하는 변수에는 is 연산자를 호출할 때 제공된 값이 할당되며 변수 유형은 정적 유형입니다. 이 표현으로 결정됩니다.
와일드카드 패턴
와일드카드 패턴은 기본적으로 var 표현식이지만 일치 결과에 신경 쓸 필요가 없습니다.
내부 구현
이 위치 클래스의 예를 계속 논의해 보겠습니다. 컴파일러는 컴파일 단계에서 다음 단계를 수행합니다.
$x, $ 변수 만들기 y 및 $z
Location.is(a, out $x, out $y, out $z) 메소드를 호출하고 반환 결과가 true인지 확인하세요
상수 모드: 개체 확인 . Equals($x, 1) 호출 결과
Var 모드: $y를 y에 할당
와일드카드 모드: $z 변수 무시
Case 문 블록 전환/선택
Switch 문 블록의 기능이 확장되어 패턴 매칭 기능을 사용할 수 있게 됩니다. 이것이 실제로 의미하는 바는 다음과 같이 명령문을 작성할 수 있다는 것입니다.
case null: case String s case Location(1, var y, *):
限制
在目前的规格草稿中,还没有对于范围检查的支持。这意味着你不能编写类似于“a is Location( > 0, 1 to 5, <= 10)”这样的代码。此外目前也不支持在一个列表或迭代器中进行元素匹配。