Post

C#13-문법-훑어보기

C#13-문법-훑어보기

들어가기 앞서

C#12 버전을 사용하다가 13 버전이 최근 업데이트가 된 것을 알았습니다.

그 중에 몇개만 예제 코드를 중심으로 기록합니다.

params 컬렉션

기존 C#에서 params는 배열에만 사용할 수 있었습니다. 하지만 C#13 에서는 다음과 같은 타입들로 확장되었습니다

Span ReadOnlySpan IEnumerable

그 외 컬렉션 인터페이스들

기존방식

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

This post is licensed under CC BY 4.0 by the author.