Wer initialisiert die Datenmitglieder? Ist es ein Konstrukteur oder irgendein Ding?

7

Wenn es Standardkonstruktor ist, wer wird die Mitgliedsvariablen auf Null initialisieren, wie ist das möglich?

%Vor%     
sathishhanumandla 20.02.2015, 09:04
quelle

6 Antworten

19

Weil Feldinitialisierungen vor Konstruktoren ausgeführt werden. Sie haben j value in Ihrem Konstruktor nicht zugewiesen, es wird standardmäßig 0 sein, da es sich um int handelt.

Von 10.4.4 Feldinitialisierung

>
  

Der Anfangswert eines Feldes, sei es ein statisches Feld oder ein   Instanzfeld ist der Standardwert ( Abschnitt 5.2 ) von die Felder   Geben Sie ein.

Wer macht das? Nun, sieht aus wie newobj tut das, wenn Sie new aufrufen. Werfen Sie einen Blick dyatchenkos Antwort für weitere Details.

    
Soner Gönül 20.02.2015 09:07
quelle
11

Eine Feldinitialisierung erfolgt vor einem Konstruktoraufruf über den Befehl newobj . Es ist einfach, nach der Dekompilierung der ausführbaren Datei mit dem folgenden C # -Code zu überprüfen:

%Vor%

Teil des dekompilierten MSIL-Codes (Methode main):

%Vor%

Wie wir sehen können, verwendet die MSIL die Anweisung newobj , um eine Instanz der Klasse A zu erstellen. Nach den folgenden Microsoft Acticle :

  

Der Befehl newobj weist eine neue Instanz der zugeordneten Klasse zu   mit ctor und initialisiert alle Felder in der neuen Instanz auf 0 (der   richtiger Typ) oder Null-Referenzen als geeignet. Es ruft dann die   Konstruktor ctor mit den gegebenen Argumenten zusammen mit dem neu erstellten   Beispiel. Nachdem der Konstruktor aufgerufen wurde, wird das nun initialisiert   Objektreferenz (Typ O) wird auf den Stapel geschoben.

Wenn es falsch ist, bitte kommentieren Sie es, andernfalls weisen Sie es bitte als richtige Antwort zu.

    
dyatchenko 20.02.2015 10:47
quelle
2

In C # werden int Variablen immer auf 0 gesetzt, sofern nicht anders angegeben. In Ihrem Konstruktor:

%Vor%

Wenn Ihr Objekt instanziiert wird, wird Ihre i -Eigenschaft auf 12 initialisiert, während Ihre j -Eigenschaft auf 0 initialisiert wird.

In Ihrem Code:

%Vor%

Ich hoffe, das hilft!

    
Jason Cidras 20.02.2015 15:22
quelle
1

Die Antwort liegt in der Tatsache, dass c # numerische Felder standardmäßig 0 sind. In C ++ ist das int-Feld standardmäßig ein zufälliger Wert

    
Blaatz0r 20.02.2015 09:07
quelle
1

Während der Instanzerstellung werden seine Variablen ebenfalls zur Verfügung gestellt. Und da int nicht nullbar ist, wird es mit default (int) initialisiert. Welches ist 0

    
haggy 20.02.2015 09:08
quelle
1

C # Standard int auf 0 setzen. Weitere Informationen zu den Standardwerten finden Sie hier

Und noch mehr, da diese Felder gelten

  

Der Anfangswert eines Feldes, ob es ein statisches Feld oder ein Instanzfeld ist, ist der Standardwert.

Der Standardkonstruktor wird i zu 12 zuweisen, aber j wird 0 als default -Wert haben, da er nirgendwo im Konstruktor zugewiesen wurde.

    
Kavindu Dodanduwa 20.02.2015 09:08
quelle

Tags und Links