13.0 · 버전 이력

C# 13.0

쓰임이 잦던 자리들이 다듬어졌습니다.

2024.11 .NET 9
한눈에

무엇이 더해졌나

C# 13.0은 .NET 9와 함께 2024년 11월에 나왔습니다. 새로운 개념을 들이기보다, 이미 사용하던 자리에서 걸리던 것들을 하나씩 푼 판입니다.

  • params 컬렉션params 가 배열 말고 다른 형식도 받습니다.
  • Lock 형식 — 잠금 전용 형식이 생겼습니다.
  • 부분 속성partial 을 속성에도 사용합니다.
  • 이스케이프 문자\e 로 적습니다.
params 컬렉션

배열만 받던 자리가 열렸습니다

params 는 배열만 받았습니다. 그래서 부르는 쪽이 값을 몇 개 늘어놓으면 컴파일러가 매번 배열을 하나 만들어 넘겼습니다. 자주 부르는 자리에서는 그것이 그대로 할당으로 쌓입니다. 이제 ReadOnlySpan 이나 List 처럼 다른 형식으로도 받을 수 있습니다.

C# 12 까지
int Sum(params int[] values) {
    var total = 0;
    foreach (var v in values) total += v;
    return total;
}
C# 13 부터
int Sum(params ReadOnlySpan<int> values) {
    var total = 0;
    foreach (var v in values) total += v;
    return total;
}

부르는 쪽은 달라지지 않습니다. Sum(1, 2, 3) 그대로입니다. 다만 ReadOnlySpan 으로 받으면 그 값들이 스택에 놓여 배열을 만들지 않습니다.

C# 4.8 메모리와 성능 에서 만들지 않는 방법을 다룹니다.

Lock 형식

잠금 전용 형식이 생겼습니다

잠글 대상으로 object 를 하나 만들어 두는 것이 관례였습니다. 형식이 object무엇이든 잠글 대상이 될 수 있었고, 실수로 다른 곳에서도 참조되는 것을 잠그면 찾기 어려운 문제가 됐습니다. 이제 System.Threading.Lock 이 그 자리를 맡습니다.

C# 12 까지
private readonly object _gate = new();

lock (_gate) {
    _count++;
}
C# 13 부터
private readonly Lock _gate = new();

lock (_gate) {
    _count++;
}

적는 모양은 같지만 하는 일이 다릅니다. 대상이 Lock 이면 컴파일러가 Monitor 대신 Lock.EnterScope() 를 부릅니다. 잠금 전용으로 만들어진 것이라 더 빠르고, 잠글 수 없는 것을 잠그는 실수를 형식이 막습니다.

C# 4.2 멀티스레딩 기초 에서 무엇을 왜 잠그는지 다룹니다.

그 밖에

부분 속성과 이스케이프 문자

partial 은 메서드에만 사용할 수 있었습니다. 그래서 소스 생성기가 만들어 주는 것이 속성이면 그 방법을 사용하지 못했습니다. 이제 속성도 선언과 구현을 나눌 수 있습니다.

// 사람이 적는 쪽 — 선언만 둡니다
public partial class Config {
    public partial string Path { get; }
}

// 생성기가 만드는 쪽 — 구현을 채웁니다
public partial class Config {
    public partial string Path => "/tmp";
}

터미널 색을 바꾸는 등에 사용하는 이스케이프 문자(ESC)는 \u001b 로 적어야 했습니다. 이제 \e 로 적습니다.

Console.WriteLine("\e[31m빨강\e[0m");   // C# 12 까지는 "\u001b[31m…"

C# 4.7 소스 생성기 에서 partial 이 어떻게 사용되는지 다룹니다.

배경
  • 이 판이 겨눈 것은 이미 사용하던 문법의 제약을 푸는 것입니다.
  • paramspartial받을 수 있는 것을 늘렸습니다.
  • Lock 은 관례로 하던 일에 전용 형식을 주었습니다.