> 백엔드 개발 > C++ > 필드 이니셜라이저에서 비정적 필드를 초기화할 수 없는 이유는 무엇입니까?

필드 이니셜라이저에서 비정적 필드를 초기화할 수 없는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-03 13:16:41
원래의
930명이 탐색했습니다.

Why Can't I Initialize a Non-Static Field in a Field Initializer?

필드 초기화 문제 이해

코드에는 다음을 사용하는 저장소 클래스(DinnerRepository)와 서비스 클래스(Service)가 있습니다. 데이터에 접근하기 위한 저장소. 그러나 "필드 이니셜라이저는 비정적 필드, 메서드 또는 속성을 참조할 수 없습니다."라는 오류가 발생합니다.

문제

이 오류는 필드 이니셜라이저 때문에 발생합니다. (클래스 정의 바로 뒤에 오는 코드)는 동일한 클래스의 비정적 멤버(즉, 인스턴스 변수)를 참조할 수 없습니다. 이러한 제한의 이유는 필드 이니셜라이저가 초기화하려는 인스턴스에 따라 달라지는 순환 참조를 방지하기 위한 것입니다.

대체 솔루션

필드 이니셜라이저를 사용하는 대신 , 두 가지 권장 솔루션이 있습니다:

1. 생성자 초기화:

Service 클래스의 생성자에서 인스턴스 변수를 초기화합니다.

public class Service
{
    private readonly DinnerRepository repo;
    private readonly Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
로그인 후 복사

2. 지연 초기화:

실제로 필요할 때까지 인스턴스 변수의 초기화를 연기하려면 Lazy 클래스를 사용하세요.

public class Service
{
    private readonly Lazy<DinnerRepository> repo = new Lazy(() => new DinnerRepository());
    private readonly Lazy<Dinner> dinner = new Lazy(() => repo.Value.GetDinner(5));

    public DinnerRepository Repo => repo.Value;
    public Dinner Dinner => dinner.Value;
}
로그인 후 복사

인스턴스 변수의 중요성

로컬 변수는 임시 저장에 유용하지만 인스턴스 변수는 객체의 상태를 유지하는 데 중요하며 여러 메서드 호출을 통해 데이터에 대한 액세스를 제공합니다. 생성자 또는 지연 초기화를 사용하면 인스턴스 변수가 클래스 인스턴스의 전체 수명 동안 적절하게 초기화되고 사용 가능해집니다.

결론

필드 이니셜라이저는 참조 기능이 제한되어 있습니다. 비정적 멤버. 생성자 또는 지연 초기화와 같은 대체 초기화 방법을 사용하면 이 오류를 방지하고 개체 상태를 효과적으로 관리할 수 있습니다.

위 내용은 필드 이니셜라이저에서 비정적 필드를 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿