init
키워드(C# 참조)
init
키워드는 속성 또는 인덱스 작성기의 접근자 메서드를 정의합니다. init 전용 setter는 개체 생성 중에만 속성 또는 인덱서 요소에 값을 할당합니다. init
는 불변성을 적용하므로 개체가 초기화되면 변경할 수 없습니다. init
접근자를 사용하면 호출 코드에서 개체 이니셜라이저를 사용하여 초기 값을 설정할 수 있습니다. 반대로 setter만 get
있는 자동으로 구현된 속성은 생성자를 호출하여 초기화해야 합니다. private set
접근자가 있는 속성은 생성 후에 수정할 수 있지만 클래스에서만 가능합니다.
다음 코드는 자동으로 구현된 속성의 접근자를 보여 init
줍니다.
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
매개 변수 유효성 검사를 제공하기 위해 접근자 중 하나를 구현해야 할 수 있습니다. C# 13에서 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");
}
}
}
Important
field
키워드는 C# 13의 미리 보기 기능입니다. 상황별 키워드를 사용하려면 .NET 9를 preview
사용하고 field
프로젝트 파일에서 요소를 설정 <LangVersion>
해야 합니다.
이름이 지정된 field
필드가 field
있는 클래스에서 키워드 기능을 사용하는 데 주의해야 합니다. 새 field
키워드는 속성 접근자의 범위에 명명된 field
필드를 숨깁니다. 변수의 field
이름을 변경하거나 토큰을 사용하여 @
식별자를 .로 @field
참조 field
할 수 있습니다. 키워드에 대한 field
기능 사양을 읽어 자세히 알아볼 수 있습니다.
init
접근자는 식 본문 멤버로 사용될 수 있습니다. 예시:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
다음 예제에서는 YearOfBirth
라는 속성의 get
및 init
접근자를 모두 정의합니다. _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