다음을 통해 공유


C# 13의 새로운 기능

C# 13에는 다음과 같은 새로운 기능이 포함되어 있습니다. 최신 Visual Studio 2022 버전 또는 .NET 9 SDK사용하여 이러한 기능을 사용해 볼 수 있습니다.

Visual Studio 17.12부터 C# 13에는 field 상황별 키워드가 미리 보기 기능으로 포함되어 있습니다.

C# 13은 .NET 9 지원됩니다. 자세한 내용은 C# 언어 버전 관리참조하세요.

.NET 다운로드 페이지최신 .NET 9 SDK를 다운로드할 수 있습니다. .NET 9 SDK를 포함하는 Visual Studio 2022 을 다운로드할 수도 있습니다.

새 기능은 공개 미리 보기 릴리스에서 사용할 수 있는 경우 "C#의 새로운 기능" 페이지에 추가됩니다. roslyn 기능 상태 페이지의 작업 집합은 예정된 기능이 주 분기에 병합될 때 추적할 있습니다.

C# 13에 도입된 호환성이 깨지는 변경 사항은 문서에서확인할 수 있습니다.

메모

이러한 기능에 대한 피드백에 관심이 있습니다. 이러한 새로운 기능에 문제가 있는 경우 새 문제를dotnet/roslyn 리포지토리에 만드세요.

params 컬렉션

params 한정자는 배열 형식으로 제한되지 않습니다. 이제 System.Span<T>, System.ReadOnlySpan<T>System.Collections.Generic.IEnumerable<T> 구현하고 Add 메서드를 포함하는 형식을 포함하여 인식된 컬렉션 형식에 params 사용할 수 있습니다. 구체적인 형식 외에도 인터페이스 System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.ICollection<T>System.Collections.Generic.IList<T> 사용할 수 있습니다.

인터페이스 형식을 사용하는 경우 컴파일러는 제공된 인수에 대한 스토리지를 합성합니다. params 컬렉션대한 기능 사양에서 자세히 알아볼 수 있습니다.

예를 들어 메서드 선언은 범위를 params 매개 변수로 선언할 수 있습니다.

public void Concat<T>(params ReadOnlySpan<T> items)
{
    for (int i = 0; i < items.Length; i++)
    {
        Console.Write(items[i]);
        Console.Write(" ");
    }
    Console.WriteLine();
}

새 잠금 개체

.NET 9 런타임에는 스레드 동기화를 위한 새 형식인 System.Threading.Lock 형식이 포함됩니다. 이 형식은 API를 통해 더 나은 스레드 동기화를 제공합니다. Lock.EnterScope() 메서드는 배타적 범위를 입력합니다. 반환된 ref struct는 배타적 범위를 종료하기 위한 Dispose() 패턴을 지원합니다.

C# lock 문은 잠금 대상이 Lock 객체인지 여부를 인식합니다. 이 경우 System.Threading.Monitor사용하는 기존 API 대신 업데이트된 API를 사용합니다. 또한 컴파일러는 Lock 개체를 다른 형식으로 변환하고 Monitor 기반 코드가 생성되는지도 인식합니다. 새 잠금 개체대한 기능 사양에서 자세히 확인할 수 있습니다.

이 기능을 사용하면 lock개체의 형식을 변경하여 새 라이브러리 형식의 이점을 얻을 수 있습니다. 다른 코드는 변경할 필요가 없습니다.

새 이스케이프 시퀀스

\e ESCAPE 문자인 유니코드 U+001B문자 리터럴 이스케이프 시퀀스로 사용할 수 있습니다. 이전에는 \u001b 또는 \x1b사용했습니다. 1b 다음 문자가 유효한 16진수인 경우 해당 문자가 이스케이프 시퀀스의 일부가 되었기 때문에 \x1b 사용하지 않는 것이 좋습니다.

메서드 그룹 자연 형식

이 기능은 메서드 그룹과 관련된 오버로드 해상도를 약간 최적화합니다. 메서드 그룹 은 이름이 같은 메서드와 모든 오버로드로 구성됩니다. 이전 동작은 컴파일러가 메서드 그룹에 대한 후보 메서드의 전체 집합을 생성하는 것이었습니다. 자연 형식이 필요한 경우 자연 형식은 후보 메서드의 전체 집합에서 결정되었습니다.

새 동작은 각 범위에서 후보 메서드 집합을 정리하여 적용할 수 없는 후보 메서드를 제거하는 것입니다. 일반적으로 제거된 메서드는 잘못된 특성이 있는 제네릭 메서드이거나 충족되지 않는 제약 조건입니다. 후보 메서드를 찾을 수 없는 경우에만 프로세스가 다음 외부 범위로 계속 진행됩니다. 이 프로세스는 오버로드 확인에 대한 일반 알고리즘을 더 밀접하게 따릅니다. 지정된 범위에서 찾은 모든 후보 메서드가 일치하지 않으면 메서드 그룹에 자연 형식이 없습니다.

제안 사양변경 내용에 대한 세부 정보를 읽을 수 있습니다.

암시적 인덱스 액세스

이제 개체 이니셜라이저 식에서 암시적 "from the end" 인덱스 연산자인 ^가 허용됩니다. 예를 들어 이제 다음 코드와 같이 개체 이니셜라이저에서 배열을 초기화할 수 있습니다.

public class TimerRemaining
{
    public int[] buffer { get; set; } = new int[10];
}

var countdown = new TimerRemaining()
{
    buffer =
    {
        [^1] = 0,
        [^2] = 1,
        [^3] = 2,
        [^4] = 3,
        [^5] = 4,
        [^6] = 5,
        [^7] = 6,
        [^8] = 7,
        [^9] = 8,
        [^10] = 9
    }
};

TimerRemaining 클래스에는 길이가 10으로 초기화된 buffer 배열이 포함됩니다. 앞의 예제에서는 "from the end" 인덱스 연산자(^)를 사용하여 이 배열에 값을 할당하여 9에서 0으로 계산되는 배열을 효과적으로 만듭니다.

C# 13 이전 버전에서는 개체 이니셜라이저에서 ^ 연산자를 사용할 수 없습니다. 앞에서 요소를 인덱싱해야 합니다.

반복기 및 async 메서드의 refunsafe

이 기능과 다음 두 기능을 사용하면 ref struct 형식에서 새 구문을 사용할 수 있습니다. 고유한 ref struct 형식을 작성하지 않는 한 이러한 형식을 사용하지 않습니다. 더 많은 기능을 얻게 되면 System.Span<T>System.ReadOnlySpan<T>의 간접적인 이점을 볼 가능성이 더 큽니다.

C# 13 이전에는 반복기 메서드(yield return사용하는 메서드) 및 async 메서드가 로컬 ref 변수를 선언할 수 없으며 unsafe 컨텍스트를 가질 수도 없었습니다.

C# 13에서 async 메서드는 ref 지역 변수 또는 ref struct 형식의 지역 변수를 선언할 수 있습니다. 그러나 이러한 변수는 await 경계를 넘어 액세스할 수 없습니다. 둘 다 yield return 경계를 넘어 액세스할 수 없습니다.

이 완화된 제한을 사용하면 컴파일러가 더 많은 위치에서 ref 지역 변수 및 ref struct 형식을 안전하게 사용할 수 있습니다. 이러한 메서드에서 System.ReadOnlySpan<T> 같은 형식을 안전하게 사용할 수 있습니다. 컴파일러는 안전 규칙을 위반하는지 알려줍니다.

동일한 방식으로 C# 13은 반복기 메서드에서 unsafe 컨텍스트를 허용합니다. 그러나 모든 yield returnyield break 문은 안전한 컨텍스트에 있어야 합니다.

allows ref struct

C# 13 이전에는 ref struct 형식을 제네릭 형식 또는 메서드의 형식 인수로 선언할 수 없었습니다. 이제 제네릭 타입 선언에 비제약 조건 allows ref struct를 추가할 수 있습니다. 이 제약 조건 방지는 해당 형식 매개 변수에 제공된 형식 인수가 ref struct 형식일 수 있음을 선언합니다. 컴파일러는 해당 형식 매개 변수의 모든 인스턴스에 ref 안전 규칙을 적용합니다.

예를 들어 다음 코드와 같이 제네릭 형식을 선언할 수 있습니다.

public class C<T> where T : allows ref struct
{
    // Use T as a ref struct:
    public void M(scoped T p)
    {
        // The parameter p must follow ref safety rules
    }
}

이렇게 하면 System.Span<T>System.ReadOnlySpan<T> 같은 형식을 제네릭 알고리즘과 함께 사용할 수 있습니다(해당하는 경우). where 대한 업데이트 및 제네릭 제약 조건대한 프로그래밍 가이드 문서에서 자세히 알아볼 수 있습니다.

ref struct 인터페이스

C# 13 이전에는 ref struct 형식이 인터페이스를 구현할 수 없었습니다. C# 13부터는 가능합니다. ref struct 형식이 인터페이스를 구현한다고 선언할 수 있습니다. 그러나 ref 안전 규칙을 보장하기 위해 ref struct 형식을 인터페이스 형식으로 변환할 수 없습니다. 그 변환은 권투 변환이며, 심판의 안전을 위반 할 수 있습니다. 명시적 인터페이스 메서드 선언은 ref struct에서 allows ref struct형식 매개 변수를 사용하여서만 액세스할 수 있습니다. 또한 ref struct 형식은 기본 구현을 사용하는 메서드를 포함하여 인터페이스에 선언된 모든 메서드를 구현해야 합니다.

ref struct 형식 업데이트 및 allows ref struct 제네릭 제약 조건 추가에 대해 자세히 알아봅니다.

더 많은 부분적으로 포함된 멤버

C# 13에서 partial 속성 및 partial 인덱서를 선언할 수 있습니다. 부분 속성 및 인덱서는 일반적으로 partial 메서드와 동일한 규칙을 따릅니다. 선언 선언을 선언하는 하나와 선언 구현하는하나를 만듭니다. 두 선언의 서명이 일치해야 합니다. 한 가지 제한 사항은 , 자동 속성 선언을 사용할 수 없고, 부분 속성을 구현할 수 없다는 것입니다. 본문을 선언하지 않는 속성은 에 대한 선언로 간주됩니다.

public partial class C
{
    // Declaring declaration
    public partial string Name { get; set; }
}

public partial class C
{
    // implementation declaration:
    private string _name;
    public partial string Name
    {
        get => _name;
        set => _name = value;
    }
}

부분 멤버에 관한 문서에서 자세히 알아볼 수 있습니다.

오버로드 확인 우선 순위

C# 13에서 컴파일러는 OverloadResolutionPriorityAttribute를 사용하여 특정 오버로드를 다른 것보다 우선시하도록 인식합니다. 라이브러리 작성자는 이 특성을 사용하여 기존 오버로드보다 새롭고 더 나은 오버로드를 선호하도록 할 수 있습니다. 예를 들어 성능이 더 좋은 새 오버로드를 추가할 수 있습니다. 라이브러리를 사용하는 기존 코드를 중단하지 않고 사용자가 다시 컴파일할 때 새 버전으로 업데이트하려고 합니다. 오버로드 확인 우선 순위 사용하여 컴파일러에 기본 설정해야 하는 오버로드를 알릴 수 있습니다. 우선 순위가 가장 높은 오버로드가 선호됩니다.

이 기능은 라이브러리 작성자가 새 오버로드를 추가할 때 모호성을 방지하기 위한 것입니다. 라이브러리 작성자는 혼동을 피하기 위해 이 특성에 주의해야 합니다.

field 키워드

field 상황별 키워드는 미리 보기 기능으로 C# 13에 있습니다. 토큰 field은 속성 접근자의 컴파일러가 합성한 지원 필드에 액세스합니다. 이를 통해 형식 선언에서 명시적 지원 필드를 선언하지 않고 접근자 본문을 작성할 수 있습니다. 필드 기반 속성의 하나 또는 두 접근자에 대해 본문을 선언할 수 있습니다.

field 기능은 미리 보기 기능으로 릴리스됩니다. 우리는 그것을 사용하여 당신의 경험에서 배우고 싶습니다. field라는 이름의 필드가 포함된 형식 내에서 호환성에 문제가 발생하거나 코드를 읽을 때 혼동이 발생할 수 있습니다. @field 또는 this.field 사용하여 field 키워드와 식별자 간에 명확하게 구분할 수 있습니다.

중요하다

field 키워드는 C# 13의 미리 보기 기능입니다. field 컨텍스트 키워드를 사용하려면 .NET 9를 사용하고 프로젝트 파일에서 preview<LangVersion> 요소를 설정해야 합니다.

field필드가 있는 클래스에서 field 키워드 기능을 사용하는 데 주의해야 합니다. 새 field 키워드는 속성 접근자의 범위에서 field 필드를 숨깁니다. field 변수의 이름을 변경하거나 @ 토큰을 사용하여 field 식별자를 @field참조할 수 있습니다. 기능 사양을 읽어보면 field 키워드에 대해 자세히 알 수 있습니다.

이 기능을 사용해 보고 피드백이 있는 경우 csharplang 리포지토리의 기능 문제에 추가합니다.

참고 자료