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ß.
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.). –
Welchen anderen Wert sollte es haben? – dvhh
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. –