C# 14에는 다음과 같은 새로운 기능이 포함되어 있습니다. 최신 Visual Studio 2022 버전 또는 .NET 10 SDK를 사용하여 이러한 기능을 사용해 볼 수 있습니다.
- 확장 멤버
- 널 조건부 할당
-
nameof
는 바인딩되지 않은 제네릭 형식을 지원합니다. -
Span<T>
및ReadOnlySpan<T>
에 대한 더 많은 암시적 변환 - 단순 람다 매개 변수의 한정자
-
field
백업된 속성 -
partial
이벤트 및 생성자 - 사용자 정의 복합 할당 연산자
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
, ref
in
또는 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()
. 하나의 부분 형식 선언만 기본 생성자 구문을 포함할 수 있습니다.
부분 이벤트의 구현 선언에는 add
및 remove
접근자가 포함되어야 합니다. 정의 선언은 필드와 유사한 이벤트를 선언합니다.
사용자 정의 복합 할당
사용자 정의 복합 할당에 대한 기능 사양에서 자세히 알아볼 수 있습니다.
Null 조건부 할당
?.
및 ?[]
null 조건부 멤버 액세스 연산자를 이제 할당 또는 복합 할당의 왼쪽에서 사용할 수 있습니다.
C# 14 이전에는 속성에 할당하기 전에 변수를 null로 확인해야 했습니다.
if (customer is not null)
{
customer.Order = GetCurrentOrder();
}
연산자를 사용하여 이전 코드를 간소화할 수 있습니다.?.
customer?.Order = GetCurrentOrder();
연산자의 =
오른쪽은 왼쪽이 null이 아닌 경우에만 평가됩니다.
customer
가 null인 경우, GetCurrentOrder
를 호출하지 않습니다.
할당 외에도 복합 할당 연산자(+=
-=
및 기타)와 함께 null 조건부 멤버 액세스 연산자를 사용할 수 있습니다. 그러나 증가 및 감소 ++
는 --
허용되지 않습니다.
조건부 멤버 액세스 및 null 조건부 할당에 대한 기능 사양에 대한 언어 참조 문서에서 자세히 알아볼 수 있습니다.
참고하십시오
.NET