Skip to main content

Command Palette

Search for a command to run...

C# Next (C# 11 후보) 언어 기능

Published
3 min read
C# Next (C# 11 후보) 언어 기능

C# 11의 언어 기능이 될 C# Next가 공개되었습니다. 오늘은 C# Next 언어 기능에 대해 대략적으로 살펴볼 것입니다.

C# Next 언어 기능 목록

보간 내 개행 (Newlines in interpolations)

보간된 문자열의 중괄호 안의 식이 개행이 되면 컴파일 오류가 발생합니다. 다음의 코드는 C# 10에서는 오류입니다.

var v = $"Count is\t: { this.Is.A.Really()
                            .That.I.Should(
                                be + able)[
                                    to.Wrap()] }.";

하지만 C# Next에서는 정상적인 코드로 간주합니다. Visual Studio 2022 17.1 Preview 1 이후 프로젝트 설정 EnablePreviewFeaturestrue로 주어 사용해볼 수 있습니다.

리스트 패턴 (List patterns)

C#의 강력한 패턴 매칭 기능에 리스트 패턴이 포함될 예정입니다.

_ = list switch
{
    { .., >= 0 } => 1,
    { < 0 } => 2,
    { Count: <= 0 or > 1 } => 3,
};

인자 null 확인 (Parameter null-checking)

함수 인자가 null 일 경우 우리는 일일이 이를 확인해야 했었습니다.

void Insert(string s) {
  if (s is null)
    throw new ArgumentNullException(nameof(s));

  ...
}

C# Next에서는 다음처럼 인자에 !!을 줘서 처리할 예정입니다.

void Insert(string s!!) {
  ...
}

순수 문자열 리터럴 (Raw string literals)

C#에서는 여러 개행으로 구성된 문자열을 효과적으로 표현할 방법이 없었습니다.

C# Next에서는 """을 이용해 이를 표현할 수 있을 예정입니다.

var xml = """
          <element attr="content"/>
          """;

nameof(parameter)

nameof()에 인자를 넣을 수 있도록 확장합니다.

var consoleName = nameof(System, Console);

refpartial의 순서 완화 (Relax ordering of ref and partial modifiers)

제네릭 특성 (Generic attributes)

전에는 특성(attribute)에 제네릭을 사용할 수 없었습니다.

Visual Studio 2022 17.0 Preview 4이후 프로젝트 설정 EnablePreviewFeaturestrue로 주어 사용해볼 수 있습니다.

public class Person
{
  [ValidateIf<RangeAttribute>(() => new RangeAttribute(params), Condition set up...)]
  public string Name { get; set; }
}
[Command("foo")]
public Task Foo([OverrideTypeReader<AlternativeBoolReader>] bool switch)
{
    //.....
}

default 분해 (Default in deconstruction)

default를 값 튜플로 분해할 수 있도록 합니다.

(int i, string j) = default;

반자동 속성 (Semi-auto-properties)

속성으로 저장할 필드를 field 키워드로 바로 사용 가능할 예정입니다.

public string PropertyConstraint {
    get;
    set => field = value ?? throw new ArgumentNullException();
} = ""

required 맴버 (Required members)

속성 또는 필드가 개체 초기화 단계에서 반드시 설정되어야 함을 나타내는 required 키워드가 추가될 예정입니다.

public class Person
{
    // The default constructor requires that FirstName and LastName be set at construction time
    public required string FirstName { get; init; }
    public string MiddleName { get; init; } = "";
    public required string LastName { get; init; }
}

최상위 프로그램에서 Main 속성 부여 (Top Level statement attribute specifiers)

현재로선 TLS에서 Main 메소드에 속성을 부여할 수 없습니다.

C# Next에서는 이것이 가능해 질 예정입니다.

[main: STAThread]

기본 생성자 (Primary Constructors)

record는 선언을 단순화 하는 기본 생성자를 지원합니다.

public record Person(string FirstName, string LastName);

이를 class, struct에 확장할 예정입니다.

Span + Stackalloc Params의 모든 배열 유형 (Params Span + Stackalloc any array type)

params Span<T>를 지원해서 힙 할당 없이 params를 사용할 수 있을 예정입니다.

상세 정보

42 views

More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read15

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read19

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.