Wenn ich ein Objekt unter Verwendung der neuen Objektinitialisierer in C # initialisiere, kann ich keine der Eigenschaften innerhalb der Klasse verwenden, um eine weitere Aktion auszuführen, und ich weiß nicht warum.
Mein Beispielcode:
%Vor%Innerhalb der Personenklasse ist x gleich 0 (Standard):
%Vor%Aber person.Age ist gleich 29. Ich bin sicher, das ist normal, aber ich würde gerne verstehen warum.
Beachten Sie als wichtiges technisches Detail:
%Vor%entspricht:
%Vor%ist aber nicht äquivalent zu:
%Vor%Die Eigenschaften werden für Name und Alter festgelegt, nachdem der Konstruktor 'public Person ()' beendet wurde.
%Vor%entspricht
%Vor%Also, im Konstruktor wurde Age 29 noch nicht.
(tempPerson ist ein eindeutiger Variablenname, den Sie nicht in Ihrem Code sehen, der nicht mit anderen auf diese Weise konstruierten Personeninstanzen kollidiert. tempPerson ist notwendig, um Multi-Threading-Probleme zu vermeiden; seine Verwendung stellt sicher, dass das neue Objekt nicht funktioniert wird erst nach der Ausführung des Konstruktors und nach der Initialisierung aller Eigenschaften für einen anderen Thread verfügbar.)
Wenn Sie die Age-Eigenschaft im Konstruktor bearbeiten möchten, schlage ich vor, dass Sie einen Konstruktor erstellen, der das Alter als Argument verwendet:
%Vor%Technisch gesehen ist dieser Code:
%Vor%ist identisch mit diesem Code:
%Vor%was etwas anders ist als das was andere gepostet haben:
%Vor%Dieser Unterschied ist entscheidend, wenn Ihre Anwendung Multithreading verwendet.
Es sieht so aus, als ob Sie versuchen, auf %code% im Konstruktor des Objekts zuzugreifen. Die Werte des Objektinitialisierers werden erst festgelegt, nachdem der Konstruktor ausgeführt wurde.
Versuchen Sie Folgendes:
%Vor%BEARBEITEN als Antwort auf einen Kommentar
Wenn Sie im Konstruktor selbst auf %code% zugreifen müssen, müssen Sie einen expliziten Konstruktor mit den erforderlichen Parametern erstellen und diesen anstelle der Syntax des Objektinitialisierers verwenden. Zum Beispiel:
%Vor%Nun, wie andere schon sagten, der parameterlose Konstruktor wurde zuerst ausgeführt, daher Ihr Dilemma.
Ich muss jedoch fragen, ob Sie ein Feld anstelle einer automatischen Eigenschaft für Ihre Age-Variable festgelegt haben?
%Vor%Sie könnten %code% anstelle von %code% verwenden, wenn das ausreicht, oder wenn Sie wirklich %code% verwenden müssen:
%Vor%Was auch immer passender ist.
Ihre Codezeile ist identisch mit:
%Vor%was identisch ist mit:
%Vor%Wie Sie sehen können; Wenn der Konstruktor ausgeführt wird, ist %code% noch nicht gesetzt.