init(C# 참조)

init 키워드는 속성 또는 인덱스 작성기의 접근자 메서드를 정의합니다. init 전용 setter는 개체 생성 중에 속성 또는 인덱서 요소에 값을 할당합니다. init는 불변성을 적용하므로 개체가 초기화되면 변경할 수 없습니다. init 접근자를 사용하면 호출 코드에서 개체 이니셜라이저를 사용하여 초기 값을 설정할 수 있습니다. 이와 대조적으로, get 설정자만 있는 자동 구현 속성은 생성자를 호출하여 초기화해야 합니다. private set 접근자가 있는 속성은 생성 후에 수정할 수 있지만 클래스에서만 가능합니다.

다음 예제에서는 YearOfBirth라는 속성의 getinit 접근자를 모두 정의합니다. _yearOfBirth라는 private 필드를 사용하여 속성 값을 지원합니다.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

대체로 init 접근자는 앞의 예제와 마찬가지로 값을 할당하는 단일 명령문으로 구성됩니다. init 때문에 다음은 작동하지 않습니다:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor

init 접근자는 호출자가 속성을 설정하도록 강제하지 않습니다. 대신 호출자가 나중에 수정하는 것을 금지하면서 개체 이니셜라이저를 사용할 수 있습니다. 호출자가 속성을 설정하도록 강제하기 위해 required 한정자를 추가할 수 있습니다. 다음 예에서는 지원 필드로 null 허용 값 형식이 있는 init 전용 속성을 보여 줍니다. 호출자가 YearOfBirth 속성을 초기화하지 않으면 해당 속성은 기본 null 값을 갖게 됩니다.

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

    public int? YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

호출자가 null이 아닌 초기 값을 설정하도록 하려면 다음 예에 표시된 대로 required 한정자를 추가합니다.

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

    public required int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

init 접근자는 식 본문 멤버로 사용될 수 있습니다. 예시:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

다음 코드 예에서 볼 수 있듯이 init 접근자는 자동 구현 속성에서도 사용할 수 있습니다.

class Person_InitExampleAutoProperty
{
    public int YearOfBirth { get; init; }
}

다음 예제에서는 , 읽기 전용 및 속성을 구분 private set합니다 init . 프라이빗 집합 버전과 읽기 전용 버전 모두 호출자가 추가된 생성자를 사용하여 이름 속성을 설정해야 합니다. private set 버전을 사용하면 인스턴스가 생성된 후 이름을 변경할 수 있습니다. init 버전에는 생성자가 필요하지 않습니다. 호출자는 개체 이니셜라이저를 사용하여 속성을 초기화할 수 있습니다.

class PersonPrivateSet
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);

    public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonReadOnly
{
    public string FirstName { get; }
    public string LastName { get; }
    public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonInit
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목