AgentSkillsCN

enforcing-record-constructor-initialization

通过带命名参数的位置构造函数来实例化记录,而非采用属性初始化语法,以更有力地表达不可变性。

SKILL.md
--- frontmatter
name: enforcing-record-constructor-initialization
description: Force record instantiation via positional constructor with named arguments instead of property initializer syntax for stronger immutability expression.

Record 생성자 초기화 강제

설명

record를 인스턴스화할 때 프로퍼티 초기화 구문(new Record { Prop = value }) 대신 생성자에 직접 값을 전달하는 방식(new Record(Prop: value))을 사용합니다. 생성자 초기화는 컴파일 타임에 모든 필수 값의 전달을 강제하므로 더 강한 불변성을 표현하며, Named Arguments를 사용하면 가독성도 유지됩니다.

규칙

  • record 인스턴스 생성 시 프로퍼티 초기화 구문({ get; init; } + 객체 초기화자)을 사용하지 않습니다
  • 생성자에 직접 값을 전달하는 방식을 사용합니다
  • Named Arguments(Name:, Email: 등)를 사용하여 가독성을 확보합니다
  • 이를 위해 record 정의 시 positional parameter를 사용하거나, required 프로퍼티 대신 생성자 매개변수를 활용합니다

Worst Case (나쁜 예)

csharp
// record 정의 - required + init 프로퍼티
public sealed record Employee
{
    public required string Name { get; init; }
    public required string Email { get; init; }
    public required string Phone { get; init; }
    public DateTime JoinedDate { get; init; }
}

// 프로퍼티 초기화 구문 - 컴파일러가 누락을 잡지만 장황함
var employee = new Employee
{
    Name = "김철수",
    Email = "charles@clovf.com",
    Phone = "01075312468",
    JoinedDate = new DateTime(2018, 3, 7)
};

// 파싱 시에도 프로퍼티 초기화
result.Add(new Employee
{
    Name = name,
    Email = email,
    Phone = phone,
    JoinedDate = joinedDate
});

Best Case (좋은 예)

csharp
// record 정의 - positional parameter (생성자 자동 생성)
public sealed record Employee(
    string Name,
    string Email,
    string Phone,
    DateTime JoinedDate);

// 생성자 + Named Arguments - 간결하고 불변성이 명확
var employee = new Employee(
    Name: "김철수",
    Email: "charles@clovf.com",
    Phone: "01075312468",
    JoinedDate: new DateTime(2018, 3, 7));

// 파싱 시에도 생성자 초기화
result.Add(new Employee(name, email, phone, joinedDate));

// 짧은 경우 한 줄로 표현 가능
var emp = new Employee(Name: "박영희", Email: "matilda@clovf.com", Phone: "01087654321", JoinedDate: default);

비교

항목프로퍼티 초기화생성자 초기화
필수값 누락 방지required로 가능컴파일러가 강제
불변성 표현약함 (init 허용)강함 (생성자 전달)
코드량장황함간결함
가독성프로퍼티명 명시Named Args로 동일
with 식 지원지원지원

적용 대상

  • 모든 record 타입의 인스턴스 생성
  • API 응답/요청 DTO
  • 파싱 결과 객체 생성
  • 테스트 데이터 생성
  • Moq Setup의 반환값 생성