C#13-문법-훑어보기
들어가기 앞서
C#12 버전을 사용하다가 13 버전이 최근 업데이트가 된 것을 알았습니다.
그 중에 몇개만 예제 코드를 중심으로 기록합니다.
params 컬렉션
기존 C#에서 params는 배열에만 사용할 수 있었습니다. 하지만 C#13 에서는 다음과 같은 타입들로 확장되었습니다
Span
그 외 컬렉션 인터페이스들
기존방식
1
2
3
4
5
6
7
public void OldMethod(params int[] numbers)
{
foreach(var num in numbers)
{
Console.WriteLine(num);
}
}
새로운 방식
1
2
3
4
5
6
7
public void NewMethod(params ReadOnlySpan<int> numbers)
{
for(int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}
}
params를 쓸 때 이제 더 나은 코드 퀄리티를 유지할 수 있을 것 같습니다.
field 키워드
field 키워드는 속성의 백킹 필드에 직접 접근할 수 있게 해주는 새로운 컨텍스트 키워드입니다.
기존 방식
1
2
3
4
5
6
7
8
9
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value.Trim(); }
}
}
새로운 방식
1
2
3
4
5
6
7
8
public class Person
{
public string Name
{
get => field;
set => field = value.Trim();
}
}
field 키워드의 경우 C#13 에서도 미리보기 기능으로 사용하실 수 있습니다. syntax sugar 키워드 느낌이네요.
오버로드 확인 우선 순위
이 기능은 라이브러리 작성자들이 메서드 오버로드의 우선순위를 명시적으로 지정할 수 있게 해줍니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DataProcessor
{
[OverloadResolutionPriority(2)]
public void Process(Span<byte> data)
{
// 최신 고성능 구현
}
[OverloadResolutionPriority(1)]
public void Process(Memory<byte> data)
{
// 중간 성능 구현
}
[OverloadResolutionPriority(0)]
public void Process(byte[] data)
{
// 레거시 구현
}
}
기존 코드에 영향을 주지 않으면서 점진적 업그레이드가 가능한 마이그레이션에 유용할 것 같습니다.
새로운 잠금 개체
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ResourceManager
{
private readonly Lock _resourceLock = new();
private readonly Dictionary<string, Resource> _resources = new();
public async Task<Resource> GetResourceAsync(string key)
{
using (var scope = _resourceLock.EnterScope())
{
if (_resources.TryGetValue(key, out var resource))
return resource;
resource = await LoadResourceAsync(key);
_resources[key] = resource;
return resource;
}
}
}
적절하게 사용하면 더 나은 동시성 제어를 구현할 수 있을 것 같습니다.
새로운 이스케이프 시퀀스 \e
ESCAPE 문자(U+001B)를 위한 새로운 이스케이프 시퀀스 \e
가 도입되었습니다.
기존 방식
1
2
3
4
5
// 유니코드 사용
string oldWay1 = "\u001b";
// 16진수 사용
string oldWay2 = "\x1b"; // 주의: 위험할 수 있음
새로운 방식
1
string newWay = "\e"; // 더 명확하고 안전함
모호함과 잠재적 리스크를 줄여주는 것으로 보입니다.
암시적 인덱스 액세스
객체 이니셜라이저에서 “from the end” 연산자 ^를 사용할 수 있게 되었습니다.
기존 방식
1
2
3
4
5
6
var array = new int[5];
array[4] = 10;
array[3] = 20;
array[2] = 30;
array[1] = 40;
array[0] = 50;
새로운 방식
1
2
3
4
5
6
7
8
var array = new int[5]
{
[^1] = 10, // 마지막 요소
[^2] = 20, // 뒤에서 두 번째
[^3] = 30, // 뒤에서 세 번째
[^4] = 40, // 뒤에서 네 번째
[^5] = 50 // 첫 번째 요소
};
배열이나 컬렉션의 끝에서부터 요소에 접근하는 것이 더 편해질 것 같습니다.
이외에도 여러 변경 사항이 있으니 궁금하신 분들은 마이크로소프트 공식 홈페이지를 참조하시기 바랍니다 :D