다음을 통해 공유


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 parameters - 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 struct 형식 record class 에서만 기본 생성자 매개 변수에 record 대한 공용 속성을 생성합니다. 기록되지 않은 클래스 및 구조체는 항상 기본 생성자 매개 변수에 대해 이 동작을 원하지 않을 수 있습니다.

기본 생성자를 탐색하기 위한 자습서 및 인스턴스 생성자에 대한 문서에서 기본 생성자에 대해 자세히 알아볼 수 있습니다.

컬렉션 식

컬렉션 식은 공통 컬렉션 값을 만들기 위한 새 terse 구문을 도입합니다. 스프레드 연산 ..자를 사용하여 다른 컬렉션을 이러한 값에 인라인 처리할 수 있습니다.

외부 BCL 지원을 요구하지 않고 여러 컬렉션과 유사한 형식을 만들 수 있습니다. 그 유형은 다음과 같습니다.

다음 예제에서는 컬렉션 식의 사용을 보여 줍니다.

// 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];

컬렉션 식의 spread 연산..자는 해당 인수를 해당 컬렉션의 요소로 바꿉니다. 인수는 컬렉션 형식이어야 합니다. 다음 예제에서는 스프레드 연산자의 작동 방식을 보여 줍니다.

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 추가하면 매개 변수 또는 in 매개 변수를 사용할 ref 수 있는 API의 명확성을 높일 수 있습니다.

  • 도입되기 전에 in 만든 API는 인수가 수정되지 않은 경우에도 사용할 ref 수 있습니다. 이러한 API는 .로 ref readonly업데이트할 수 있습니다. 매개 변수가 .로 변경in된 경우 ref 와 마찬가지로 호출자에 대한 호환성이 손상되는 변경은 아닙니다. 예제는 System.Runtime.InteropServices.Marshal.QueryInterface입니다.
  • 매개 변수를 사용하지만 논리적으로 in 변수가 필요한 API입니다. 값 식이 작동하지 않습니다. 예제는 System.ReadOnlySpan<T>.ReadOnlySpan<T>(T)입니다.
  • 변수가 필요하지만 해당 변수를 변경하지 않기 때문에 사용하는 ref API입니다. 예제는 System.Runtime.CompilerServices.Unsafe.IsNullRef입니다.

매개 변수에 대한 ref readonly 자세한 내용은 언어 참조의 매개 변수 한정자 또는 참조 읽기 전용 매개 변수 기능 사양에 대한 문서를 참조하세요.

기본 람다 매개 변수

이제 람다 식의 매개 변수에 대한 기본값을 정의할 수 있습니다. 구문 및 규칙은 모든 메서드 또는 로컬 함수에 인수에 대한 기본값을 추가하는 것과 같습니다.

람다 식에 대한 아티클에서 람다 식의 기본 매개 변수에 대해 자세히 알아볼 수 있습니다.

모든 형식의 별칭

별칭 지시문을 사용하여 명명된 using 형식뿐만 아니라 모든 형식의 별칭을 지정할 수 있습니다. 즉, 튜플 형식, 배열 형식, 포인터 형식 또는 기타 안전하지 않은 형식에 대한 의미 체계 별칭을 만들 수 있습니다. 자세한 내용은 기능 사양을 참조하세요.

인라인 배열

인라인 배열은 런타임 팀과 다른 라이브러리 작성자가 앱의 성능을 향상시키는 데 사용됩니다. 인라인 배열을 사용하면 개발자가 형식에서 고정 크기의 배열을 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 표시된 어셈블리에 포함된 모든 형식은 실험적입니다. 컴파일러에서 읽은 일반 특성 또는 기능 사양에 대한 문서에서 자세히 읽을 수 있습니다.

인터셉터

Warning

인터셉터는 C# 12를 사용하여 미리 보기 모드에서 사용할 수 있는 실험적 기능입니다. 이 기능은 향후 릴리스에서 호환성이 손상되거나 제거될 수 있습니다. 따라서 프로덕션 또는 릴리스된 애플리케이션에는 권장되지 않습니다.

인터셉터를 사용하려면 사용자 프로젝트에서 속성을 <InterceptorsPreviewNamespaces>지정해야 합니다. 인터셉터를 포함할 수 있는 네임스페이스 목록입니다.

예: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

인터셉터(interceptor)는 컴파일 시간에 자체 호출을 사용하여 인터셉트 가능한 메서드에 대한 호출을 선언적으로 대체할 수 있는 메서드입니다. 이 대체는 인터셉터에서 가로채는 호출의 원본 위치를 선언하게 함으로써 발생합니다. 인터셉터는 소스 생성기와 같이 컴파일에 새 코드를 추가하여 기존 코드의 의미 체계를 변경하는 제한된 기능을 제공합니다.

기존 소스 컴파일에 코드를 추가하는 대신 소스 생성기의 일부로 인터셉터를 사용하여 수정합니다. 원본 생성기는 인터셉터 메서드를 호출하여 절편 가능 메서드에 대한 호출을 대체합니다.

인터셉터를 실험하려는 경우 기능 사양을 읽어 자세히 알아볼 수 있습니다. 이 기능을 사용하는 경우 이 실험적 기능에 대한 기능 사양의 변경 내용을 최신 상태로 유지해야 합니다. 기능이 완료된 경우 이 사이트에 대한 추가 지침을 추가합니다.

참고 항목