.NET 7에서 새롭게 추가된 C# 11 버전의 일부 기능을 소개 합니다.
- Required Members
- List Patterns
- Generic Attributes
Required Members
클래스 내부 속성들중 필수 속성을 지정할 수 있습니다.
Required 키워드를 속성으로 사용하면 객체 생성시 해당 속성 값의 초기화를 보장 할 수 있습니다.
public class Foo
{
// Required Members
public required int Id { get; set; }
public string Name { get; set; }
}
// 필수 속성 Id 누락시 빌드 오류 [CS9035]
Foo foo = new();
List Patterns
목록 패턴은 배열 타입에서 사용 가능한 패턴 일치 방법 입니다.
목폭 패턴에는 세 가지 종류가 있습니다.
다음과 같은 배열이 있습니다.
int[] nums = { 1, 2, 3, 4, 5 };
string[] strs = { "a", "b", "c", "d" };
첫번째, 폐기 패턴
배열의 길이를 알고 있거나 특정 요소의 위치가 보장 되고 위치를 알고 있는 경우 해당 값이 일치 하는지 간단히 체크 할 수 있습니다.
// 결과 : true
Console.WriteLine(nums is [_, _, 3, _, _]);
// 결과 : false
Console.WriteLine(nums is [_, _, 3, _]);
// 결과 : true
// 조각패턴 목록으로 해당 index와 일치하면 뒷 부분은 무시
Console.WriteLine(strs is [_, _, "c",..]);
두번째, 범위 패턴
배열의 길이는 정확히 모르지만 특정 요소의 첫번째 또는 마지막 값이 보장 되는 경우 해당 값이 일치 하는지 체크 할 수 있습니다.
// 결과 : true
Console.WriteLine(strs is [.., "d"]);
// 결과 : true
Console.WriteLine(strs is ["a", .., "d"]);
세번째, var 패턴
var Pattern 은 배열중 특정 위치 또는 첫번째, 마지막 위치에서 해당 값을 캡쳐하고 변수로 사용할 수 있도록 제공합니다.
if( nums is [.., var lastNum] ) {
// 결과 : 5
Console.WriteLine(lastNum);
}
if (nums is [_, _, var num, ..])
{
// 결과 : 3
Console.WriteLine(num);
}
Generic Attributes
제네릭 어트리뷰트는 이전의 어트리뷰트에서 형식화된 어트리뷰트를 사용 할 수 있도록 새롭게 추가된 기능입니다.
바로 예제 코드로 살펴 보겠습니다.
// Generic Attributes
public class MyAttribute<T> : Attribute
{
public MyAttribute(T value)
{
Value = value;
}
public T Value { get; private set; }
}
위와 같이 제네릭 어트리뷰트 클래스를 구현할 수 있고, 다음의 간단한 예제 처럼 사용 가능 합니다.
public enum MyEnum {
[My<int>(10)]
A,
[My<int>(11)]
B
}
public T GetAttValue<T>(MyEnum myEnum)
{
var customAttributes = myEnum.GetType().GetField(myEnum.ToString()).GetCustomAttributes(false);
foreach(var customAttribute in customAttributes)
{
if(customAttribute is MyAttribute<T> myAttribute)
{
return myAttribute.Value;
}
}
return default(T);
}
// 결과 : 11
var result = GetAttValue<int>(MyEnum.B);
이 밖에도 C# 11에서는 원시 문자열 리터럴(Raw String Literals), ref 필드(ref 구조체내에서 ref 필드 사용 가능) 등 많은 기능 지원이 추가 되었고,
.NET 7 ASP.NET Core 중 속도 제한(Rate Limiting), 내부 HTTP/3 프로토콜 지원, Output Caching 등 여러가지 기능 또한 추가 되었습니다.