C# 13의 새로운 기능
C# 13에는 다음과 같은 새로운 기능이 포함되어 있습니다. 최신 Visual Studio 2022 버전 또는 .NET 9 SDK사용하여 이러한 기능을 사용해 볼 수 있습니다.
-
params
수집품 -
새
lock
형식 및의미 체계. -
새 이스케이프 시퀀스 -
\e
. - 메서드 그룹의 자연 유형 개선
- 개체 이니셜라이저에서의 암시적 인덱서 액세스
-
반복기 및 비동기 메서드에서
ref
로컬 및unsafe
컨텍스트 사용 -
ref struct
형식을 사용하도록 설정하여 인터페이스구현합니다. - 제네릭의 형식 매개 변수에 대한 인수로 ref 구조체 형식을 허용합니다.
-
부분 속성 및 인덱서 이제
partial
형식에서 허용됩니다. - 오버로드 확인 우선 순위 라이브러리 작성자는 하나의 오버로드를 다른 오버로드보다 더 나은 것으로 지정할 수 있습니다.
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
메서드의 ref
및 unsafe
이 기능과 다음 두 기능을 사용하면 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 return
및 yield 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
리포지토리의 기능 문제에 추가합니다.
참고 자료
.NET