Was mache ich falsch mit C # Objektinitialisierern?

7

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.

    
dmce 17.02.2009, 22:03
quelle

6 Antworten

21

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%     
Scott Langham 17.02.2009, 22:05
quelle
9

Beachten Sie als wichtiges technisches Detail:

%Vor%

entspricht:

%Vor%

ist aber nicht äquivalent zu:

%Vor%     
yfeldblum 17.02.2009 22:14
quelle
6

Ihre Codezeile ist identisch mit:

%Vor%

was identisch ist mit:

%Vor%

Wie Sie sehen können; Wenn der Konstruktor ausgeführt wird, ist Age noch nicht gesetzt.

    
Marc Gravell 17.02.2009 22:06
quelle
4

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.

    
John Rasch 17.02.2009 22:16
quelle
3

Es sieht so aus, als ob Sie versuchen, auf Age 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 Age 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%     
LukeH 17.02.2009 22:05
quelle
0

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 _age anstelle von x verwenden, wenn das ausreicht, oder wenn Sie wirklich x verwenden müssen:

%Vor%

Was auch immer passender ist.

    
Jon Limjap 17.02.2009 22:39
quelle

Tags und Links