8.0 · 버전 이력

C# 8.0

값이 없을 수 있다는 것을 타입에 적게 되었습니다.

2019.9 .NET Core 3.0
한눈에

무엇이 더해졌나

C# 8.0은 .NET Core 3.0과 함께 2019년 9월에 나왔습니다. 이 판의 가장 큰 것은 값이 없을 수 있다는 사실을 타입에 적게 된 것이고, 그 밖에도 경우를 나누고 자리를 세는 방법이 여럿 더해졌습니다.

  • nullable 참조 형식 — 비어 있을 수 있는지를 타입에 적습니다.
  • switch 식 — 값을 고르는 일을 식 하나로 적습니다.
  • 인덱스와 범위^1, 1..3
  • using 선언 — 다 쓴 것을 닫는 일을 맡깁니다.
  • 비동기 스트림 — 하나씩 도착하는 것을 기다리며 탐색합니다.
switch 식

고르는 일을 식으로

switch 문은 경우마다 break 를 적어야 했고, 값을 고르는 것이 목적일 때도 담을 변수를 미리 만들어 두어야 했습니다. 식으로 적으면 고른 값이 그대로 나옵니다.

C# 7 까지
string msg;

switch (grade) {
    case "A":
        msg = "훌륭합니다";
        break;
    default:
        msg = "좋습니다";
        break;
}
C# 8 부터
string msg = grade switch {
    "A" => "훌륭합니다",
    _ => "좋습니다"
};

_ 는 "그 밖의 모든 것" 입니다. 모든 경우를 덮어야 하며, 어느 것에도 걸리지 않는 값이 들어오면 실행 중에 예외가 납니다.

C# 1.5 조건문 에서 자세히 다룹니다.

인덱스와 범위

끝에서 세고, 잘라 내기

마지막 것을 꺼내려면 개수에서 1을 빼는 계산을 늘 손으로 해야 했습니다. ^ 를 붙이면 끝에서부터 셉니다. 두 점으로는 일부만 잘라 냅니다.

C# 7 까지
var last = n[n.Length - 1];

var part = new int[2];
Array.Copy(n, 1, part, 0, 2);
C# 8 부터
var last = n[^1];

var part = n[1..3];

범위의 뒤쪽 번호는 포함되지 않습니다. 1..3 은 1번과 2번, 두 개입니다.

C# 1.7 배열과 컬렉션 기초 에서 자세히 다룹니다.

그 밖에

nullable 참조 형식과 using 선언

그때까지 string 은 언제나 비어 있을 수 있었고, 그것을 모르고 쓰다 실행 중에 멈추는 일이 가장 흔한 사고였습니다. C# 8.0부터는 비어 있을 수 있는지를 타입에 적고, 적어 둔 것과 다르게 쓰면 컴파일러가 미리 알려 줍니다.

string name = null;    // 경고 — 비어 있을 수 없다고 적었습니다
string? nick = null;    // 괜찮습니다 — 비어 있을 수 있다고 적었습니다

그리고 다 쓴 것을 닫는 일도 맡길 수 있게 되었습니다. using 을 변수 앞에 붙여 두면 그 자리를 벗어날 때 알아서 닫히므로, finally 에 닫는 코드를 손수 적지 않아도 됩니다.

using var file = File.OpenText("a.txt");
// 이 자리를 벗어날 때 알아서 닫힙니다
배경
  • 이 판이 겨눈 것은 실행하기 전에 알 수 있게 하는 것입니다.
  • 가장 흔하던 사고(비어 있는 것을 건드리기)를 타입에 적어 미리 잡습니다.
  • switch 식과 범위는 손으로 하던 셈을 문법이 대신하게 했습니다.