(C#) C# 11 문법 지원 일부 소개

 

.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 등 여러가지 기능 또한 추가 되었습니다.