C# 14에는 다음과 같은 새로운 기능이 포함되어 있습니다. 최신 Visual Studio 2026 버전 또는 .NET 10 SDK를 사용하여 이러한 기능을 사용해 볼 수 있습니다.
- 확장 멤버
- 널 조건부 할당
-
nameof는 바인딩되지 않은 제네릭 형식을 지원합니다. -
Span<T>및ReadOnlySpan<T>에 대한 더 많은 암시적 변환 - 단순 람다 매개 변수의 한정자
-
field백업된 속성 -
partial이벤트 및 생성자 - 사용자 정의 복합 할당 연산자
- 파일 기반 앱에 대한 새 전처리기 지시문
C# 14는 최신 C# 릴리스입니다. C# 14는 .NET 10에서 지원됩니다. 자세한 내용은 C# 언어 버전 관리참조하세요.
.NET 다운로드 페이지에서 최신 .NET 10 SDK를 다운로드할 수 있습니다. .NET 10 SDK를 포함하는 Visual Studio 2026을 다운로드할 수도 있습니다.
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 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>();
// static user defined operator:
public static IEnumerable<TSource> operator + (IEnumerable<TSource> left, IEnumerable<TSource> right) => left.Concat(right);
}
}
예를 들어 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 기호의 이름을 바꾸어 구분을 개선할 수 있습니다.
암시적 범위 변환
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(). 하나의 부분 형식 선언만 기본 생성자 구문을 포함할 수 있습니다.
부분 이벤트의 구현 선언에는 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