다음을 통해 공유


필수 한정자(C# 참조)

required 한정자는 필드 또는 속성에 적용되어 개체 이니셜라이저에 의해 반드시 초기화되어야 함을 나타냅니다. 형식의 새 인스턴스를 초기화하는 모든 식은 모든 필수 멤버를 초기화해야 합니다. required 한정자는 C# 11부터 사용할 수 있습니다. required 한정자를 사용하면 개발자가 속성 또는 필드를 제대로 초기화해야 하지만 개체 이니셜라이저를 사용하여 초기화를 허용하는 형식을 만들 수 있습니다. 몇 가지 규칙은 이 동작을 보장합니다.

  • required 한정자는 struct에 선언된 필드속성에, 또한 recordrecord struct 형식을 포함한 class 형식에 적용할 수 있습니다. required 한정자는 interface멤버에 적용할 수 없습니다.
  • 명시적 인터페이스 구현은 required로 지정할 수 없습니다. 개체 이니셜라이저에서는 설정할 수 없습니다.
  • 필수 멤버는 반드시 초기화되어야 하지만 null로 초기화될 수 있습니다. 형식이 null 가능한 참조 형식이 아닌 경우, null멤버를 초기화하면 컴파일러에서 경고를 표시합니다. 멤버가 전혀 초기화되지 않은 경우 컴파일러에서 오류를 발생합니다.
  • 필수 멤버는 자신의 타입만큼 최소한의 가시성을 가져야 합니다. 예를 들어 public 클래스는 required 필드를 protected포함할 수 없습니다. 또한 필수 속성에는 포함하는 형식만큼 표시되는 setter(set 또는 init 접근자)가 있어야 합니다. 액세스할 수 없는 멤버는 인스턴스를 만드는 코드로 설정할 수 없습니다.
  • 파생 클래스는 기본 클래스에 선언된 required 멤버를 숨길 수 없습니다. 필수 멤버를 숨기면 호출자가 개체 이니셜라이저를 사용할 수 없습니다. 또한 필수 속성을 재정의하는 파생 형식에는 required 한정자가 포함되어야 합니다. 파생 형식은 required 상태를 제거할 수 없습니다. 파생 형식은 속성을 재정의할 때 required 한정자를 추가할 수 있습니다.
  • 형식 매개 변수에 new() 제약 조건이 포함된 경우 required 멤버가 있는 형식을 형식 인수로 사용할 수 없습니다. 컴파일러는 모든 필수 멤버가 제네릭 코드에서 초기화되도록 강제할 수 없습니다.
  • 레코드의 위치 매개 변수 선언에서는 required 한정자가 허용되지 않습니다. required 한정자를 포함하는 위치 속성에 대한 명시적 선언을 추가할 수 있습니다.

위치 레코드같은 일부 형식은 기본 생성자를 사용하여 위치 속성을 초기화합니다. 이러한 속성 중 required 한정자가 포함된 경우 기본 생성자는 SetsRequiredMembers 특성을 추가합니다. 이는 기본 생성자가 필요한 모든 멤버를 초기화한다는 것을 나타냅니다. System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 특성을 사용하여 고유한 생성자를 작성할 수 있습니다. 그러나 컴파일러는 이러한 생성자가 필요한 모든 멤버를 초기화하는지 확인하지 않습니다. 대신, 특성은 생성자가 필요한 모든 멤버를 초기화한다는 것을 컴파일러에 어설션합니다. SetsRequiredMembers 특성은 생성자에 다음 규칙을 추가합니다.

  • SetsRequiredMembers 특성(this()또는 base())으로 주석이 추가된 다른 생성자에 연결된 생성자도 SetsRequiredMembers 특성을 포함해야 합니다. 이렇게 하면 호출자가 모든 적절한 생성자를 올바르게 사용할 수 있습니다.
  • record 형식에 대해 생성된 복사 생성자에는 멤버가 required경우 SetsRequiredMembers 특성이 적용됩니다.

경고

SetsRequiredMembers 개체를 만들 때 모든 required 멤버가 초기화되는지 컴파일러의 검사를 사용하지 않도록 설정합니다. 주의해서 사용합니다.

다음 코드는 FirstNameLastName 속성에 required 한정자를 사용하는 클래스 계층 구조를 보여 있습니다.

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName) =>
        (FirstName, LastName) = (firstName, lastName);

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

필요한 멤버에 대한 자세한 내용은 C#11 - 필수 멤버 기능 사양을 참조하세요.