필드 초기화 문제 이해
코드에는 다음을 사용하는 저장소 클래스(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!