


Pourquoi ne puis-je pas initialiser un champ non statique dans un initialiseur de champ ?
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

STD :: Chrono est utilisé en C pour traiter le temps, y compris l'obtention de l'heure actuelle, la mesure du temps d'exécution, le point de fonctionnement et la durée de l'opération et le temps d'analyse de formatage. 1. Utilisez STD :: Chrono :: System_clock :: Now () pour obtenir l'heure actuelle, qui peut être convertie en une chaîne lisible, mais l'horloge système peut ne pas être monotone; 2. Utilisez STD :: Chrono :: standard_clock pour mesurer le temps d'exécution pour assurer la monotonie, et la convertir en millisecondes, secondes et autres unités via durée_cast; 3. Point de temps (temps_point) et durée (durée) peut être interopérable, mais l'attention doit être accordée à la compatibilité des unités et à l'époque de l'horloge (époque)

Il existe de nombreuses méthodes d'initialisation en C, qui conviennent à différents scénarios. 1. L'initialisation de la variable de base inclut l'initialisation de l'attribution (inta = 5;), l'initialisation de construction (inta (5);) et l'initialisation de la liste (inta {5};), où l'initialisation de la liste est plus stricte et recommandée; 2. C 11 prend également en charge l'initialisation directe au sein de la classe; 3. L'initialisation du tableau et du conteneur peut être utilisée en mode traditionnel ou C 11 de C 11 :: Array et STD :: Vector, prise en charge la liste d'initialisation et améliorer la sécurité; 4. Initialisation par défaut

L'objet Slice fait référence au phénomène selon lequel une partie des données de classe de base est copiée lors de l'attribution ou du passage d'un objet de classe dérivé à un objet de classe de base, entraînant la perte de nouveaux membres de la classe dérivée. 1. Les tranches d'objet se produisent dans des conteneurs qui attribuent directement des valeurs, passent les paramètres par valeur ou stockent des objets polymorphes dans les classes de base de stockage; 2. Les conséquences incluent la perte de données, le comportement anormal et difficile à déboguer; 3. Éviter les méthodes incluent le passage d'objets polymorphes à l'aide de pointeurs ou de références, ou à utiliser des pointeurs intelligents pour gérer le cycle de vie de l'objet.

Pour déterminer si STD :: Facultatif a une valeur, vous pouvez utiliser la méthode has_value () ou juger directement dans l'instruction if; Lors du retour d'un résultat qui peut être vide, il est recommandé d'utiliser STD :: Facultatif pour éviter les pointeurs et exceptions nuls; Il ne doit pas être abusé, et les valeurs de retour booléen ou les variables de bool indépendantes conviennent plus à certains scénarios; Les méthodes d'initialisation sont diverses, mais vous devez faire attention à l'utilisation de réinitialisation () pour effacer la valeur et faire attention au cycle de vie et au comportement de construction.

RAII est une technologie importante utilisée dans la gestion des ressources dans C. son cœur réside dans la gestion automatique des ressources tout au long du cycle de vie de l'objet. Son idée principale est: les ressources sont acquises au moment de la construction et libérées à la destruction, évitant ainsi les problèmes de fuite causés par la libération manuelle. Par exemple, lorsqu'il n'y a pas de RAII, l'opération de fichier nécessite un appel manuellement à l'appel. S'il y a une erreur au milieu ou un retour à l'avance, vous pouvez oublier de fermer le fichier; Et après avoir utilisé RAII, comme la classe FileHandle résume l'opération de fichier, le destructeur sera automatiquement appelé après avoir quitté la portée pour libérer la ressource. 1.RAII est utilisé dans la gestion des verrouillage (comme STD :: Lock_Guard), 2. Management de la mémoire (comme STD :: UNIQUE_PTR), 3. Base de données et gestion de la connexion réseau, etc.

Il existe quatre méthodes courantes pour obtenir le premier élément de STD :: Vector: 1. Utilisez la méthode avant () pour vous assurer que le vecteur n'est pas vide, a une sémantique claire et est recommandé pour une utilisation quotidienne; 2. Utilisez l'indice [0], et il doit également être jugé vide, avec les performances comparables à la sémantique avant () mais légèrement plus faible; 3. Utiliser * begin (), qui convient à la programmation générique et aux algorithmes STL; 4. Utiliser à (0), sans jugement nul manuellement, mais à faible performance, et lancer des exceptions lors du passage de la frontière, ce qui convient au débogage ou à la manipulation des exceptions; La meilleure pratique consiste à appeler d'abord vide () pour vérifier s'il est vide, puis utiliser la méthode avant () pour obtenir le premier élément pour éviter un comportement non défini.

Les fonctions virtuelles pures sont les mécanismes clés utilisés en C pour définir des classes et des interfaces abstraites, et leur rôle principal est de forcer les classes dérivées pour mettre en œuvre des méthodes spécifiques. 1. La fonction virtuelle pure est déclarée via VirtualVoidFunc () = 0; et l'implémentation n'est pas fournie, faisant de la classe une classe abstraite et ne peut pas être instanciée; 2. Il est utilisé pour simuler l'interface pour s'assurer que la sous-classe doit réécrire la méthode, comme le dessin () de la classe de base de forme dans la bibliothèque graphique; 3. Prend en charge le polymorphisme d'exécution, permettant au pointeur de classe de base d'appeler l'implémentation de différentes sous-classes; 4. Bien que la classe abstraite ne puisse pas créer des objets, il peut contenir des constructeurs, des variables membres et des fonctions ordinaires implémentées; 5. Si la classe dérivée n'implémente pas pleinement toutes les fonctions virtuelles pures, elle deviendra également une classe abstraite; 6. Dans des cas particuliers, la fonction virtuelle pure peut fournir une implémentation par défaut pour la dérivation.

L'état de la disposition de l'oppaitation est de l'insaspéciale
