了解欄位初始化問題
在您的程式碼中,您有一個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中文網其他相關文章!