Heim > Backend-Entwicklung > C++ > Warum kann ich ein nichtstatisches Feld in einem Feldinitialisierer nicht initialisieren?

Warum kann ich ein nichtstatisches Feld in einem Feldinitialisierer nicht initialisieren?

Linda Hamilton
Freigeben: 2025-01-03 13:16:41
Original
930 Leute haben es durchsucht

Why Can't I Initialize a Non-Static Field in a Field Initializer?

Verstehen des Feldinitialisierungsproblems

In Ihrem Code haben Sie eine Repository-Klasse (DinnerRepository) und eine Service-Klasse (Service), die verwendet das Repository, um auf Daten zuzugreifen. Es tritt jedoch die Fehlermeldung „Ein Feldinitialisierer kann nicht auf das nicht statische Feld, die nicht statische Methode oder die nicht statische Eigenschaft verweisen“ auf.

Das Problem

Dieser Fehler tritt aufgrund von Feldinitialisierern auf (der Code, der unmittelbar auf die Klassendefinition folgt) kann nicht auf nicht statische Mitglieder (d. h. Instanzvariablen) derselben Klasse verweisen. Der Grund für diese Einschränkung besteht darin, Zirkelverweise zu verhindern, bei denen der Feldinitialisierer von der Instanz abhängt, die er zu initialisieren versucht.

Alternative Lösungen

Anstatt einen Feldinitialisierer zu verwenden , es gibt zwei empfohlene Lösungen:

1. Konstruktor-Initialisierung:

Initialisieren Sie die Instanzvariablen im Konstruktor der Service-Klasse.

public class Service
{
    private readonly DinnerRepository repo;
    private readonly Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
Nach dem Login kopieren

2. Lazy Initialization:

Verwenden Sie die Lazy-Klasse, um die Initialisierung der Instanzvariablen zu verschieben, bis sie tatsächlich benötigt werden.

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;
}
Nach dem Login kopieren

Bedeutung von Instanzvariablen

Während lokale Variablen für die temporäre Speicherung nützlich sind, sind Instanzvariablen von entscheidender Bedeutung für die Aufrechterhaltung des Zustands eines Objekts und den Zugriff auf Daten überall mehrere Methodenaufrufe. Durch die Verwendung von Konstruktoren oder verzögerter Initialisierung wird sichergestellt, dass Instanzvariablen ordnungsgemäß initialisiert werden und während der gesamten Lebensdauer der Klasseninstanz verfügbar sind.

Fazit

Feldinitialisierer sind in ihrer Referenzierbarkeit eingeschränkt nicht statische Mitglieder. Durch die Verwendung alternativer Initialisierungsmethoden wie Konstruktor oder verzögerte Initialisierung können Sie diesen Fehler vermeiden und den Status Ihrer Objekte effektiv verwalten.

Das obige ist der detaillierte Inhalt vonWarum kann ich ein nichtstatisches Feld in einem Feldinitialisierer nicht initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage