init 키워드는 속성 또는 인덱스 작성기의 접근자 메서드를 정의합니다. init 전용 setter는 개체 생성 중에만 속성 또는 인덱서 요소에 값을 할당합니다.
init는 불변성을 적용하므로 개체가 초기화되면 변경할 수 없습니다.
init 접근자를 사용하면 호출 코드에서 개체 이니셜라이저를 사용하여 초기 값을 설정할 수 있습니다. 반대로 setter만 있는 get은 생성자를 호출하여 초기화해야 합니다.
private set 접근자가 있는 속성은 생성 후에 수정할 수 있지만 클래스에서만 가능합니다.
다음 코드는 자동으로 구현된 속성의 접근자를 보여 init 줍니다.
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
매개 변수 유효성 검사를 제공하기 위해 접근자 중 하나를 구현해야 할 수 있습니다. C# 14에 field 도입된 키워드를 사용하여 이 작업을 수행할 수 있습니다. 키워드는 field 해당 속성에 대한 컴파일러 합성 지원 필드에 액세스합니다. 다음 예제에서는 접근자가 매개 변수 범위의 유효성을 검사하는 속성을 init 보여 줍니다 value ."
class Person_InitExampleFieldProperty
{
public int YearOfBirth
{
get;
init
{
field = (value <= DateTime.Now.Year)
? value
: throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
}
}
}
init 접근자는 식 본문 멤버로 사용될 수 있습니다. 예시:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
다음 예제에서는 get라는 속성의 init 및 YearOfBirth 접근자를 모두 정의합니다.
_yearOfBirth라는 private 필드를 사용하여 속성 값을 지원합니다.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
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;
}
}
다음 예제에서는 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# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.
참고 항목
.NET