
C# 10은 Visual Studio 2022 및 .NET 6과 함께 2021년 11월에 릴리스되었습니다. 더 쉽고 편리하게 작업할 수 있는 몇 가지 새로운 기능이 추가되었습니다. 다음은 가장 유용한 몇 가지 추가 사항과 이러한 추가 기능이 워크플로를 향상시키는 방법입니다.
파일 범위 네임스페이스
가장 간단하지만 아마도 가장 중요한 변경 사항 중 하나부터 시작하겠습니다. 이제 새로운 구문 옵션을 통해 전체 파일에 네임스페이스를 적용할 수 있습니다. namespace 예어. 파일 내부의 나머지 코드는 들여쓰기되지 않은 경우에도 자동으로 네임스페이스가 지정됩니다. namespace 블록. 이것은 PHP의 네임스페이스 선언과 유사하게 작동합니다.
C# 9에서 클래스의 네임스페이스를 지정하려면 다음 코드가 필요했습니다.
namespace Demo { public class Example { } }
C# 10에서는 다음을 대신 사용할 수 있습니다.
namespace Demo; public class Example { }
이렇게 하면 들여쓰기 수준을 제거하여 편집기에서 수평 공간을 절약할 수 있습니다. 파일에 여러 클래스가 포함되어야 하는 경우 열 0부터 시작하여 모두 작성할 수 있습니다. namespace 선언은 전체 파일에 적용됩니다.
글로벌 사용
일부 네임스페이스는 프로젝트 전체에서 매우 광범위하게 사용됩니다. 그러나 여전히 각 파일에 수동으로 포함해야 합니다. using 성명.
C# 10은 이를 지원하도록 변경합니다. global using 변종. 이렇게 하면 프로젝트의 모든 파일에서 참조된 네임스페이스에 액세스할 수 있습니다.
global using System;
컴파일에 포함될 모든 파일에 전역 사용을 추가할 수 있습니다. 그들은 표준의 모든 기능을 지원합니다 using 를 포함한 진술 static 키워드 및 별칭 지정 =.
전역 사용을 채택하면 작성하는 줄 수를 줄일 수 있지만 이름 충돌 가능성이 거의 없는 일반적으로 참조되는 네임스페이스를 위해 남겨두는 것이 가장 좋습니다. 에 의존한다는 점을 주의하십시오. global using 새로운 기여자가 어떻게 네임스페이스 리소스가 포함되었는지 즉시 깨닫지 못할 수 있으므로 코드가 더 불투명해질 수 있습니다.
전역 사용의 동반 기능은 암시적 사용입니다. 이것은 자동으로 생성 global using 프로젝트 유형에 적합한 문. 이 기능은 .NET 6 프로젝트 템플릿에서 기본적으로 켜져 있습니다. 로 비활성화할 수 있습니다. ImplicitUsings 당신의 설정 .csproj 파일.
개선된 구조
Structs는 클래스와 더 긴밀한 동등성을 가져오는 몇 가지 개선 사항을 받았습니다. 여기에는 매개변수가 없는 생성자, 필드 이니셜라이저, with 표현식 및 레코드 구조 생성 옵션:
public record Point(int X, int Y);
이 예제는 “위치” 레코드 구조체를 생성합니다. X 그리고 Y 생성자 매개변수는 암시적 공개 멤버가 됩니다. 기존 구문을 사용하여 수동으로 멤버를 정의할 수도 있습니다.
public record struct Point { public int X { get; init; } public int Y { get; init; } }
레코드 구조체는 사용자 지정 동작을 클래스 메서드로 연결하지 않고 일부 데이터를 캡슐화해야 하는 시나리오에서 사용해야 합니다. 레코드 구조체는 다음과 같은 통합된 값 평등 검사 및 기능을 제공합니다. ToString(). 를 통해 변경 가능하거나 변경 불가능할 수 있습니다. readonly 예어.
람다 식 개선 사항
C# 10은 형식과 구문을 다루는 람다 식에 대한 몇 가지 개선 사항을 추가합니다. 목표는 람다를 일반 메서드 및 로컬 함수와 더 유사하게 만드는 것입니다. 이제 하나를 정의하는 것이 더 친숙한 경험이 될 것입니다.
“내츄럴” 유형의 개념이 도입되었습니다. 이를 통해 컴파일러는 수동으로 대리자 또는 식으로 변환하지 않고도 람다의 형식을 유추할 수 있습니다. 이렇게 하면 변수에 람다를 할당할 때 더 읽기 쉬운 코드가 생성됩니다.
// C# 9 Func<string, int> toInt = (string s) => int.Parse(s); // C# 10 var toInt = (string s) => int.Parse(s)
컴파일러는 다음 유형을 유추합니다. toInt 같이 Func<string, int> Visual Studio에서 코드를 볼 때 표시됩니다. 추론은 다음을 사용할 것입니다. Func, Action, 또는 합성 대리자.
자연 유형은 람다 식이 이미 완전히 입력된 경우에만 작동합니다. 매개변수 유형을 생략하면 컴파일러에서 호환되는 유형 정의를 만들 수 없습니다.
관련 변경 사항은 명시적 반환 유형에 대한 지원입니다. 일반 함수와 마찬가지로 반환 유형은 람다의 매개변수 목록보다 먼저 옵니다.
var toInt = int (string s) => int.Parse(s)
마지막으로, 람다는 이제 메서드 및 함수와 같은 방식으로 속성을 사용할 수 있습니다. 반환 유형 및 매개 변수 목록 앞의 람다 식 시작 부분에 위치합니다. 속성을 사용하여 추가 메타데이터를 람다에 연결하여 더 나은 내성 및 코드 분석을 용이하게 할 수 있습니다.
var toInt = [DemoAttribute()] int (string s) => int.Parse(s)
다재다능한 분해 과제
분해 할당은 이제 새 변수를 초기화하고 같은 줄에 있는 기존 변수에 값을 할당할 수 있습니다. 이전에는 이러한 작업에 대해 별도의 분해를 사용해야 했습니다.
C# 9에서는 다음과 같은 코드가 생성되었습니다.
int x = 0; int y = 0; (x, y) = point; (int z) = point;
반면 C# 10에서는 다음을 수행할 수 있습니다.
int x = 0; int y = 0; (x, y, int z) = point;
지금 x, y, 그리고 z 모두 단일 분해 할당을 사용하여 값으로 초기화되어 코드의 반복을 줄입니다.
기타 변경 사항
문자열 보간이 개선되었으며 이제 상수 문자열에서도 작동합니다. 보간 중에 자리 표시자 구멍을 채우는 데 사용되는 모든 문자열이 그 자체가 상수 값인지 확인해야 합니다. 보다 광범위하게, 보간 프로세스에 대한 최적화는 전용 핸들러를 사용하여 메모리 사용을 줄이고 성능을 향상시킬 수 있습니다.
속성 패턴은 중첩 속성에 대한 읽기 쉬운 액세스를 제공하기 위해 단순화되었습니다. 이제 여러 계층의 괄호 대신 점 구문을 사용하여 중첩 속성 값에 액세스할 수 있습니다.
// C# 9 { Train: {ArrivalTime: "10:00"} } // C# 10 { Train.ArrivalTime: "10:00" }
다른 곳에서는 컴파일러 최적화를 통해 확정 할당 및 null-state 검사 동안 오탐을 줄이는 이점을 얻을 수 있습니다. 컴파일 시간에 가짜 경고를 유발하는 여러 C# 9 문제가 해결되어 실제로 중요한 문제를 디버그하는 데 도움이 되는 보다 정확한 검사가 가능해졌습니다. 문제는 부울 상수에 대한 null 병합 표현식 및 변수 비교 사용과 연결되었습니다.
결론
C# 10에는 개발을 보다 간단하게 만드는 데 도움이 되는 몇 가지 새로운 기능이 추가되었습니다. 그러나 다음을 포함한 많은 다른 새로운 기능 field 키워드 및 필수 속성이 다음 주요 릴리스로 다시 푸시되었습니다. 인터페이스에 대한 일반 속성 및 정적 추상 멤버는 10으로 만들었지만 미리보기 태그는 여전히 첨부되어 있습니다.
Visual Studio 2022를 다운로드하여 지금 C# 10 사용을 시작할 수 있습니다. 이 언어는 Windows, Mac 및 Linux에서 작동하는 독립 실행형 .NET 6 SDK의 일부로도 사용할 수 있습니다.








