C# 12의 새로운 기능
C# 12에는 다음과 같은 새로운 기능이 포함되어 있습니다. 최신 Visual Studio 2022 버전 또는 .NET 8 SDK사용하여 이러한 기능을 사용해 볼 수 있습니다.
기본 생성자 - Visual Studio 2022 버전 17.6 미리 보기 2에 도입되었습니다.
컬렉션 식 - Visual Studio 2022 버전 17.7 미리 보기 5에 도입되었습니다.
인라인 배열 - Visual Studio 2022 버전 17.7 미리 보기 3에 도입되었습니다.
람다 식의 선택적 매개 변수 - Visual Studio 2022 버전 17.5 미리 보기 2에 도입되었습니다.
ref readonly
매개 변수 - Visual Studio 2022 버전 17.8 미리 보기 2에 도입되었습니다.어떠한 형식에도 별칭 지정 - Visual Studio 2022 버전 17.6 미리보기 3에 도입되었습니다.
실험적 특성 - Visual Studio 2022 버전 17.7 미리 보기 3에 도입되었습니다.
인터셉터 - 미리 보기 기능 Visual Studio 2022 버전 17.7 미리 보기 3에 도입되었습니다.
C# 12는 .NET 8지원됩니다. 자세한 내용은 C# 언어 버전 관리참조하세요.
.NET 다운로드 페이지최신 .NET 8 SDK를 다운로드할 수 있습니다. .NET 8 SDK를 포함하는 visual Studio 2022 다운로드할 수도 있습니다.
메모
이러한 기능에 대한 피드백에 관심이 있습니다. 이러한 새로운 기능에 문제가 있는 경우 새 문제를 dotnet/roslyn 리포지토리에 만드세요.
기본 생성자
이제 모든 class
및 struct
기본 생성자를 만들 수 있습니다. 주 생성자는 더 이상 record
형식으로 제한되지 않습니다. 기본 생성자 매개 변수는 클래스의 전체 본문에 대한 범위에 있습니다. 모든 기본 생성자 매개 변수가 확실히 할당되도록 하려면 명시적으로 선언된 모든 생성자는 this()
구문을 사용하여 기본 생성자를 호출해야 합니다. 주 생성자를 class
추가하면 컴파일러가 암시적 매개 변수 없는 생성자를 선언할 수 없습니다.
struct
암시적 매개변수가 없는 생성자는 기본 생성자의 매개변수도 포함하여 모든 필드를 0 비트 패턴으로 초기화합니다.
컴파일러는 record class
또는 record struct
형식의 record
형식에서만 기본 생성자 매개 변수에 대한 공용 속성을 생성합니다. 기록되지 않은 클래스 및 구조체는 항상 기본 생성자 매개 변수에 대해 이 동작을 원하지 않을 수 있습니다.
기본 생성자 탐색하는 자습서 및 인스턴스 생성자에 대한 문서에서 기본 생성자에 대해 자세히 알아볼 수 있습니다.
컬렉션 식
컬렉션 식은 공통 컬렉션 값을 만들기 위한 새로운 간결한 구문을 도입합니다. 스프레드 요소 ..e
사용하여 다른 컬렉션을 이러한 값에 인라인 처리할 수 있습니다.
외부 BCL 지원을 요구하지 않고 여러 컬렉션과 유사한 형식을 만들 수 있습니다. 이러한 형식은 다음과 같습니다.
- 배열 형식(예:
int[]
. - System.Span<T> 및 System.ReadOnlySpan<T>.
- 컬렉션 이니셜라이저를 지원하는 형식(예: System.Collections.Generic.List<T>.
다음 예제에서는 컬렉션 식의 사용을 보여 줍니다.
// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["one", "two", "three"];
// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];
스프레드 요소은 컬렉션 식 ..e
에 있는 모든 요소를 추가합니다. 인수는 컬렉션 형식이어야 합니다. 다음 예제에서는 스프레드 요소의 작동 방식을 보여 줍니다.
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
spread 요소는 열거형 식의 각 요소를 평가합니다. 각 요소는 출력 컬렉션에 포함됩니다.
요소 컬렉션이 필요한 모든 위치에서 컬렉션 식을 사용할 수 있습니다. 컬렉션의 초기 값을 지정하거나 컬렉션 형식을 사용하는 메서드에 인수로 전달될 수 있습니다. 컬렉션 식 또는 기능 사양대한 언어 참조 문서에서 컬렉션 식에 대해 자세히 알아볼 수 있습니다.
ref readonly
매개 변수
C#은 읽기 전용 참조를 전달하는 방법으로 in
매개 변수를 추가했습니다.
in
매개 변수는 변수와 값을 모두 허용하며 인수에 대한 주석 없이 사용할 수 있습니다.
ref readonly
매개 변수를 추가하면 ref
매개 변수 또는 in
매개 변수를 사용할 수 있는 API에 대한 명확성을 높일 수 있습니다.
-
in
도입되기 전에 만든 API는 인수가 수정되지 않더라도ref
사용할 수 있습니다. 이러한 API는ref readonly
로 업데이트할 수 있습니다. 호출자에게는ref
매개 변수가in
변경된 경우와 같이 호환성을 깨는 변경이 아닙니다. 예를 들어 System.Runtime.InteropServices.Marshal.QueryInterface. -
in
매개 변수를 사용하지만 논리적으로 변수가 필요한 API입니다. 값 식이 작동하지 않습니다. 예를 들어 System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - 변수가 필요하지만 해당 변수를 변경하지 않으므로
ref
사용하는 API입니다. 예를 들어 System.Runtime.CompilerServices.Unsafe.IsNullRef.
ref readonly
매개 변수에 대해 더 알고 싶으시다면, 언어 참조의 매개 변수 한정자 또는 참조 읽기 전용 매개 변수 기능 사양을 확인하세요.
기본 람다 매개 변수
이제 람다 식의 매개 변수에 대한 기본값을 정의할 수 있습니다. 구문 및 규칙은 모든 메서드 또는 로컬 함수에 인수에 대한 기본값을 추가하는 것과 같습니다.
람다 식 문서에서 람다 식의 기본 매개 변수에 대해 자세히 알아볼 수 있습니다.
모든 유형의 별칭
using
별칭 지시문을 사용하여 명명된 형식뿐만 아니라 모든 형식에 별칭을 지정할 수 있습니다. 즉, 튜플 형식, 배열 형식, 포인터 형식 또는 기타 안전하지 않은 형식에 대한 의미 체계 별칭을 만들 수 있습니다. 자세한 내용은 기능 사양참조하세요. 리팩터링 연습 예제는 .NET 블로그 참조 모든 형식의 별칭을 사용하여 코드 리팩터링 설명을 참조하세요.
인라인 배열
인라인 배열은 런타임 팀과 다른 라이브러리 작성자가 앱의 성능을 향상시키는 데 사용됩니다. 인라인 배열을 사용하면 개발자가 struct
형식으로 고정된 크기의 배열을 만들 수 있습니다. 인라인 버퍼가 있는 구조체는 안전하지 않은 고정 크기 버퍼와 유사한 성능 특성을 제공해야 합니다. 고유한 인라인 배열을 선언하지는 않지만 런타임 API에서 System.Span<T> 또는 System.ReadOnlySpan<T> 개체로 노출될 때 투명하게 사용합니다.
인라인 배열 다음 struct
비슷하게 선언됩니다.
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
다른 배열처럼 사용합니다.
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
차이점은 컴파일러가 인라인 배열에 대한 알려진 정보를 활용할 수 있다는 것입니다. 다른 배열과 마찬가지로 인라인 배열을 사용할 수 있습니다. 인라인 배열을 선언하는 방법에 대한 자세한 내용은 struct
형식에 대한 언어 참조를 참조하세요.
실험적 특성
형식, 메서드 또는 어셈블리를 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 표시하여 실험적 기능을 나타낼 수 있습니다. 메서드에 액세스하거나 ExperimentalAttribute주석이 추가된 형식에 액세스하면 컴파일러에서 경고를 발생합니다.
Experimental
특성으로 표시된 어셈블리에 포함된 모든 형식은 실험적입니다. 컴파일러 읽은일반 특성 또는 기능 사양대한 문서에서 자세히 확인할 수 있습니다.
인터셉터
경고
인터셉터는 C# 12를 사용하여 미리 보기 모드에서 사용할 수 있는 실험적 기능입니다. 이 기능은 향후 릴리스에서 호환성이 손상되거나 제거될 수 있습니다. 따라서 프로덕션 또는 릴리스된 애플리케이션에는 권장되지 않습니다.
인터셉터를 사용하려면 사용자 프로젝트에서 속성 <InterceptorsPreviewNamespaces>
지정해야 합니다. 인터셉터를 포함할 수 있는 네임스페이스 목록입니다.
예: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>
인터셉터 는 컴파일 시간에 인터셉트 가능한 메서드 호출을 해당 메서드의 호출로 선언적으로 대체할 수 있는 방법입니다. 이 대체는 인터셉터에서 가로채는 호출의 원본 위치를 선언하게 함으로써 발생합니다. 인터셉터는 소스 생성기와 같이 컴파일에 새 코드를 추가하여 기존 코드의 의미 체계를 변경하는 제한된 기능을 제공합니다.
기존 소스 컴파일에 코드를 추가하는 대신 인터셉터 소스 생성기의 일부로 사용하여 수정합니다. 원본 생성기는 인터셉터 메서드를 호출하여 절편 가능 메서드에 대한 호출을 대체합니다.
인터셉터를 실험하려는 경우 기능 사양을 읽어 자세히 알아볼 수 있습니다. 이 기능을 사용하는 경우 이 실험적 기능에 대한 기능 사양의 변경 내용을 최신 상태로 유지해야 합니다. 기능이 완료된 경우 이 사이트에 대한 추가 지침을 추가합니다.
참고 사항
.NET