다음을 통해 공유


C# 14의 새로운 기능

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

C# 14는 .NET 10에서 지원됩니다. 자세한 내용은 C# 언어 버전 관리참조하세요.

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

새 기능은 공개 미리 보기 릴리스에서 사용할 수 있는 경우 "C#의 새로운 기능" 페이지에 추가됩니다. roslyn 기능 상태 페이지작업 세트 섹션은 예정된 기능이 메인 브랜치에 병합될 때를 추적합니다. 이 문서는 .NET 10 미리 보기 1에 대해 마지막으로 업데이트되었습니다.

C# 14에 도입된 모든 호환성이 손상되는 변경 사항을 저희 문서에서 확인할 수 있습니다.

비고

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

확장 멤버

C# 14는 확장 멤버를 정의하는 새 구문을 추가합니다. 새 구문을 사용하면 확장 메서드 외에도 확장 속성을 선언할 수 있습니다. 형식의 인스턴스가 아닌 형식을 확장하는 확장 멤버를 선언할 수도 있습니다. 즉, 이러한 새 확장 멤버는 확장한 형식의 정적 멤버로 나타날 수 있습니다. 다음 코드 예제에서는 선언할 수 있는 다양한 종류의 확장 멤버의 예를 보여 줍니다.

public static class Enumerable
{
    // Extension block
    extension<TSource>(IEnumerable<TSource> source) // extension members for IEnumerable<TSource>
    {
        // Extension property:
        public bool IsEmpty => !source.Any();
        // Extension indexer:
        public TSource this[int index] => source.Skip(index).First();

        // Extension method:
        public IEnumerable<TSource> Where(Func<TSource, bool> predicate) { ... }
    }

    // extension block, with a receiver type only
    extension<TSource>(IEnumerable<TSource>) // static extension members for IEnumerable<Source>
    {
        // static extension method:
        public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second) { ... }

        // static extension property:
        public static IEnumerable<TSource> Identity => Enumerable.Empty<TSource>();
    }
}

예를 들어 IEnumerable<TSource>첫 번째 확장 블록의 멤버는 인스턴스 멤버sequence.IsEmpty인 것처럼 호출됩니다. 예를 들어 IEnumerable<TSource>두 번째 확장 블록의 멤버는 정적 멤버인 IEnumerable<int>.Identity것처럼 호출됩니다.

프로그래밍 가이드의 확장 멤버에 대한 문서, 키워드의 언어 참조 문서extension 및 새 확장 멤버 기능에 대한 기능 사양을 참조하여 자세한 내용을 알아볼 수 있습니다.

field 키워드

토큰 field 을 사용하면 명시적 지원 필드를 선언하지 않고 속성 접근자 본문을 작성할 수 있습니다. 토큰 field 은 컴파일러가 생성한 백킹 필드로 대체됩니다.

예를 들어 이전에는 속성을 string 설정하지 못하도록 null 하려면 지원 필드를 선언하고 두 접근자를 모두 구현해야 했습니다.

private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

이제 코드를 간소화하여 다음을 수행할 수 있습니다.

public string Message
{
    get;
    set => field = value ?? throw new ArgumentNullException(nameof(value));
}

필드 기반 속성의 하나 또는 두 접근자에 대해 본문을 선언할 수 있습니다.

형식에 이름이 field인 기호가 포함되어 있는 경우 코드 읽기가 혼란스럽거나 중대한 변경이 발생할 가능성이 있습니다. 키워드와 식별자 사이를 명확하게 구분하기 위해 @field 또는 this.field를 사용할 수 있습니다. 또는 현재 field 기호의 이름을 바꾸어 구분을 개선할 수 있습니다.

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

field 상황별 키워드는 미리 보기 기능으로 C# 13에 있습니다.

암시적 범위 변환

C# 14에서는 System.Span<T>System.ReadOnlySpan<T>에 대한 최상급 지원이 언어에 도입되었습니다. 이 지원에는 이러한 형식을 사용하여 보다 자연스러운 프로그래밍을 허용하는 새로운 암시적 변환이 포함됩니다.

Span<T>ReadOnlySpan<T>는 C# 및 런타임에서 여러 가지 주요 방법으로 사용됩니다. 그들의 도입은 안전을 위협하지 않고 성능을 향상시킵니다. C# 14는 ReadOnlySpan<T>, Span<T>, 및 T[] 사이의 관계를 인식하고, 일부 변환을 지원합니다. 범위 형식은 확장 메서드 수신기일 수 있고, 다른 변환으로 구성되며, 제네릭 형식 유추 시나리오에 도움이 될 수 있습니다.

언어 참조 섹션의 기본 제공 형식 에 대한 문서에서 암시적 범위 변환 목록을 찾을 수 있습니다. 첫 번째 클래스 범위 유형에 대한 기능 사양을 읽어 자세한 내용을 알아볼 수 있습니다.

비제약 제네릭 형식 및 nameof

C# 14부터 nameof의 인수로 바인딩되지 않은 제네릭 형식을 사용할 수 있습니다. 예를 들어 nameof(List<>)List로 계산됩니다. 이전 버전의 C#에서는 닫힌 제네릭 형식(예: List<int>)만 이름을 반환 List 하는 데 사용할 수 있습니다.

한정자를 사용하여 간단한 람다 매개 변수

매개 변수 형식을 지정하지 않고 , , scoped, refin또는 out 람다 식 매개 변수와 같은 ref readonly매개 변수 한정자를 추가할 수 있습니다.

delegate bool TryParse<T>(string text, out T result);
// ...
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);

이전에는 매개 변수 선언에 매개 변수 형식이 포함된 경우에만 한정자를 추가할 수 있었습니다. 앞의 선언에는 모든 매개 변수에 대한 형식이 필요합니다.

TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);

params 한정자는 여전히 명시적으로 형식화된 매개 변수 목록이 필요합니다.

C# 언어 참조의 람다 식 에 대한 문서에서 이러한 변경 내용에 대해 자세히 확인할 수 있습니다.

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

이제 인스턴스 생성자이벤트를부분 멤버로 선언할 수 있습니다.

부분 생성자 및 부분 이벤트에는 정확히 하나의 정의 선언 과 하나의 구현 선언이 포함되어야 합니다.

부분 생성자의 구현 선언만 생성자 이니셜라이저 this() 를 포함할 수 있습니다. 또는 base(). 하나의 부분 형식 선언만 기본 생성자 구문을 포함할 수 있습니다.

부분 이벤트의 구현 선언에는 addremove 접근자가 포함되어야 합니다. 정의 선언은 필드와 유사한 이벤트를 선언합니다.

사용자 정의 복합 할당

사용자 정의 복합 할당에 대한 기능 사양에서 자세히 알아볼 수 있습니다.

Null 조건부 할당

?.?[] null 조건부 멤버 액세스 연산자를 이제 할당 또는 복합 할당의 왼쪽에서 사용할 수 있습니다.

C# 14 이전에는 속성에 할당하기 전에 변수를 null로 확인해야 했습니다.

if (customer is not null)
{
    customer.Order = GetCurrentOrder();
}

연산자를 사용하여 이전 코드를 간소화할 수 있습니다.?.

customer?.Order = GetCurrentOrder();

연산자의 = 오른쪽은 왼쪽이 null이 아닌 경우에만 평가됩니다. customer가 null인 경우, GetCurrentOrder를 호출하지 않습니다.

할당 외에도 복합 할당 연산자(+=-=및 기타)와 함께 null 조건부 멤버 액세스 연산자를 사용할 수 있습니다. 그러나 증가 및 감소 ++--허용되지 않습니다.

조건부 멤버 액세스null 조건부 할당에 대한 기능 사양에 대한 언어 참조 문서에서 자세히 알아볼 수 있습니다.

참고하십시오