了解字段初始化问题
在您的代码中,您有一个 Repository 类 (DinnerRepository) 和一个 Service 类 (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中文网其他相关文章!