7.0 · 버전 이력

C# 7.0 ~ 7.3

값의 모양을 보고 분기하는 패턴 매칭이 시작되었습니다.

2017 ~ 2018 .NET Core 2.x
한눈에

무엇이 더해졌나

C# 7.0은 2017년에 나왔고, 7.1부터 7.3까지 작은 판이 잇따랐습니다. 이 판에서 시작된 패턴 매칭은 뒤의 여러 판에 걸쳐 자라나 지금은 C#을 대표하는 문법이 되었습니다.

  • 패턴 매칭 — 값의 모양을 보고 분기합니다.
  • out 변수 — 받을 자리를 그 자리에서 선언합니다.
  • 지역 함수 — 메서드 안에 메서드를 둡니다.
  • 튜플 — 값 여럿을 이름 붙여 함께 돌려줍니다.
  • Span<T> · ref struct — 복사하지 않고 다룹니다(7.2).
out 변수

받을 자리를 미리 만들지 않아도 됩니다

TryParse 처럼 값을 돌려주면서 성공 여부도 알려 주는 메서드는 받을 변수를 미리 선언해 두어야 했습니다. 쓰지도 않을 줄이 앞에 하나 더 붙는 셈이었습니다.

C# 6 까지
int n;

if (int.TryParse(input, out n)) {
    Console.WriteLine(n);
}
C# 7 부터
if (int.TryParse(input, out int n)) {
    Console.WriteLine(n);
}

C# 1.4 연산자와 형변환 에서 TryParse 를 다룹니다.

지역 함수

쓰는 자리 옆에 두기

한 메서드 안에서만 쓰는 작은 계산도 클래스 수준의 메서드로 꺼내 두어야 했습니다. 밖에서 부를 일이 없는데 밖에 놓이니, 읽는 사람은 그것이 어디서 쓰이는지 찾아야 했습니다. 지역 함수는 쓰는 자리 안에 둡니다.

void Report(int[] scores) {
    Console.WriteLine($"평균 {Average()}점");

    // 이 메서드 안에서만 쓰입니다
    double Average() {
        int sum = 0;
        foreach (int s in scores) sum += s;
        return (double)sum / scores.Length;
    }
}

최상위 문 안에 클래스 없이 메서드를 곧바로 적을 수 있는 것도 이 문법 덕분입니다 — 그 자리에 놓인 메서드는 엄밀히 말하면 지역 함수입니다.

C# 1.8 메서드 기초 에서 자세히 다룹니다.

그 밖에

패턴 매칭과 튜플

is 뒤에 타입을 적고 그 자리에서 변수로 받는 것이 패턴 매칭의 시작이었습니다. 이후 C# 8.0의 switch 식, 9.0의 관계·논리 패턴으로 이어집니다.

if (value is int n && n > 0) {
    Console.WriteLine(n);       // 여기서는 int 로 씁니다
}

튜플은 값 여럿을 형식을 따로 만들지 않고 함께 돌려주는 길입니다. 이름을 붙일 수 있어 무엇이 무엇인지도 드러납니다.

(int min, int max) Range(int[] n) => (n.Min(), n.Max());

var r = Range(scores);
Console.WriteLine($"{r.min} ~ {r.max}");
배경
  • 이 판이 겨눈 것은 군더더기 줄을 없애는 것입니다.
  • 여기서 시작된 패턴 매칭은 여러 판에 걸쳐 자랐습니다.
  • 7.2의 Span<T> 는 성능이 중요한 자리를 위한 것으로, 3부에서 다룹니다.