C# 13.0
쓰임이 잦던 자리들이 다듬어졌습니다.
무엇이 더해졌나
C# 13.0은 .NET 9와 함께 2024년 11월에 나왔습니다. 새로운 개념을 들이기보다, 이미 사용하던 자리에서 걸리던 것들을 하나씩 푼 판입니다.
- params 컬렉션 —
params가 배열 말고 다른 형식도 받습니다. - Lock 형식 — 잠금 전용 형식이 생겼습니다.
- 부분 속성 —
partial을 속성에도 사용합니다. - 이스케이프 문자 —
\e로 적습니다.
배열만 받던 자리가 열렸습니다
params 는 배열만 받았습니다. 그래서 부르는 쪽이 값을
몇 개 늘어놓으면 컴파일러가 매번 배열을 하나 만들어 넘겼습니다.
자주 부르는 자리에서는 그것이 그대로 할당으로 쌓입니다. 이제
ReadOnlySpan 이나 List 처럼
다른 형식으로도 받을 수 있습니다.
int Sum(params int[] values) { var total = 0; foreach (var v in values) total += v; return total; }
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 메모리와 성능 에서 만들지 않는 방법을 다룹니다.
잠금 전용 형식이 생겼습니다
잠글 대상으로 object 를 하나 만들어 두는 것이 관례였습니다.
형식이 object 라 무엇이든 잠글 대상이 될 수
있었고, 실수로 다른 곳에서도 참조되는 것을 잠그면 찾기 어려운 문제가 됐습니다.
이제 System.Threading.Lock 이 그 자리를 맡습니다.
private readonly object _gate = new(); lock (_gate) { _count++; }
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 이 어떻게 사용되는지 다룹니다.
- 이 판이 겨눈 것은 이미 사용하던 문법의 제약을 푸는 것입니다.
params와partial은 받을 수 있는 것을 늘렸습니다.Lock은 관례로 하던 일에 전용 형식을 주었습니다.