2011-01-06 14 views
1

Nur neugierig, aus dem folgenden Code kann ich sehen, dass statische Feld von Typ A standardmäßig Null sein wird, während Variable dieses Typs initialisiert werden muss, um mindestens Null-Wert zu haben. Kann jemand den Unterschied ein bisschen mehr erklären? DankeWarum sind statische Felder standardmäßig null?

class Program 
{ 
    static A _a; //it is null by default 
    static void Main(string[] args) 
     { 
      A nonStaticA; //empty reference, exception when used 
      A correctA=null; 
     } 
} 
class A 
{ 
} 
+2

Es sind nicht nur statische Felder, sondern alle Felder (Variablen auf Klassenebene), die auf ihren Standardwert initialisiert werden (null für Referenz, 0 für Zahlen, false für bool usw.). –

+1

Welchen anderen Wert sollte es haben? – dvhh

+0

Ich glaube, Loj bedeutet, dass es keine Kompilierung Warnung/Fehler für das statische Mitglied wie für die Funktionsvariable gibt. Dies liegt daran, dass der Compiler nicht davon ausgehen kann, dass das statische Element nicht initialisiert wurde (eigentlich kann es das, aber nicht). Bei einer lokalen Variablen wird der Compiler beschweren, dass er nicht initialisiert ist. –

Antwort

1

Der Unterschied ist zwischen lokalen Variablen und Felder, nicht zwischen statischen und Instanz.

Lokale Variablen eines beliebigen Typs müssen auf einen Wert initialisiert werden, bevor sie zuerst verwendet werden. Dies verhindert Fehler, bei denen Sie vergessen haben, eine Variable zu initialisieren.

Felder sind eine andere Sache, da es möglicherweise nicht möglich ist, alle Felder zur Deklarationszeit zu initialisieren. Zum Beispiel könnte der Anfangswert von Konstruktorargumenten abhängen. Daher müssen Felder nicht explizit initialisiert werden, und wenn nicht, erhalten Sie den Standardwert für den Typ, der null für alle Referenztypen ist.

2

Es hat nichts mit static zu tun. Klassenfelder (Instanz und statisch) werden auf ihre Standardwerte initialisiert, lokale Variablen nicht.

Und warum? Wie viele Dinge war es irgendwann eine Designentscheidung.

4

Der Anfangswert eines Felds, , ob es ein statisches Feld oder ein Instanzfeld ist, ist der Standardwert des Feldtyps. Es ist nicht möglich, den Wert eines Felds zu beobachten, bevor diese Standardinitialisierung stattgefunden hat, und ein Feld wird somit niemals "nicht initialisiert".

Wenn ein statischer Konstruktor in der Klasse vorhanden ist, erfolgt die Ausführung der statischen Feldinitialisierer unmittelbar vor dem Ausführen dieses statischen Konstruktors. Andernfalls werden die statischen Feldinitialisierer zu einer implementierungsabhängigen Zeit vor der ersten Verwendung eines statischen Felds dieser Klasse ausgeführt.

Eine lokale Variable wird nicht automatisch initialisiert und hat daher keinen Standardwert. Zum Zweck der eindeutigen Zuweisungsprüfung wird eine lokale Variable zunächst als nicht zugewiesen betrachtet.

0

C#, so weit ich kann beobachten, viele Dinge wie in anderen früheren Sprachen, vor allem C++. Der Grund in C++ (der für C# relevant sein kann oder nicht) ist, dass statische (oder globale) Objekte statisch in die ausführbare Datei oder Bibliothek geschrieben werden, während für andere Objekte der Code das Objekt erzeugt (und nicht das Objekt) selbst) wird in die ausführbare Datei oder Bibliothek geschrieben. Bei Objekten auf dem Stapel wird normalerweise Code geschrieben, der einen Wert vom Stapelzeiger subtrahiert.

Wenn die ausführbare Datei oder die Bibliothek vom Betriebssystem in den Arbeitsspeicher geladen wird, sind die statischen Felder nur eine Ansammlung von Bytes, die unverändert in den Arbeitsspeicher (das Datensegment des Prozesses) kopiert werden. Da sie unverändert kopiert werden, haben sie bereits einen Wert (den Wert in der ausführbaren Datei oder der Bibliotheksdatei). Aus diesem Grund gibt es keine Auswirkungen auf die Leistung, um es auf einen bestimmten Wert zu setzen. Aus diesem Grund (so weit ich das sehen kann) hat der C++ - Standard seinen Wert deterministisch gemacht (wenn sie nicht explizit initialisiert werden) und was ist natürlicher als Null als Initialisierungswert ?!

Um ein dynamisches Objekt zu initialisieren (ob auf dem Stack oder dem Heap), muss Code in die ausführbare Datei oder Bibliothek eingefügt werden. Dies hat Auswirkungen auf die Leistung (und möglicherweise andere Implikationen), so dass der C++ - Standard es vorzog, es dem Programmierer zu überlassen.

Ich bin nicht ganz sicher, dass jedes Bit dieser Daten wahr ist, aber es ist, was mir logisch erscheint, von dem, was ich weiß.

Verwandte Themen