Comprendre le problème d'initialisation des champs
Dans votre code, vous avez une classe Repository (DinnerRepository) et une classe Service (Service) qui utilise le référentiel pour accéder aux données. Cependant, vous rencontrez l'erreur "Un initialiseur de champ ne peut pas faire référence au champ, à la méthode ou à la propriété non statique."
Le problème
Cette erreur se produit car les initialiseurs de champ (le code qui suit immédiatement la définition de la classe) ne peut pas faire référence à des membres non statiques (c'est-à-dire des variables d'instance) de la même classe. La raison de cette restriction est d'éviter les références circulaires, où l'initialiseur de champ dépend de l'instance qu'il tente d'initialiser.
Solutions alternatives
Plutôt que d'utiliser un initialiseur de champ , il existe deux solutions recommandées :
1. Initialisation du constructeur :
Initialisez les variables d'instance dans le constructeur de la classe Service.
public class Service { private readonly DinnerRepository repo; private readonly Dinner dinner; public Service() { repo = new DinnerRepository(); dinner = repo.GetDinner(5); } }
2. Initialisation paresseuse :
Utilisez la classe Lazy pour différer l'initialisation des variables d'instance jusqu'à ce qu'elles soient réellement nécessaires.
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; }
Importance des variables d'instance
Bien que les variables locales soient utiles pour le stockage temporaire, les variables d'instance sont cruciales pour maintenir l'état d'un objet et fournir un accès aux données sur plusieurs appels de méthode. L'utilisation d'un constructeur ou d'une initialisation paresseuse garantit que les variables d'instance sont correctement initialisées et disponibles tout au long de la durée de vie de l'instance de classe.
Conclusion
Les initialiseurs de champ sont limités dans leur capacité à référencer membres non statiques. En utilisant des méthodes d'initialisation alternatives comme le constructeur ou l'initialisation paresseuse, vous pouvez éviter cette erreur et gérer efficacement l'état de vos objets.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!