Ich bin neu in Delphi und habe einige Tests durchgeführt, um festzustellen, auf welche Objektvariablen und Stapelvariablen standardmäßig initialisiert wird:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Dies ist das Verhalten, das ich von anderen Sprachen gewohnt bin, aber ich frage mich, ob es sicher ist, sich in Delphi darauf zu verlassen. Ich frage mich zum Beispiel, ob dies möglicherweise von einer Compilereinstellung abhängt oder auf verschiedenen Computern möglicherweise unterschiedlich funktioniert. Ist es normal, sich auf initialisierte Standardwerte für Objekte zu verlassen, oder legen Sie alle Instanzvariablen explizit im Konstruktor fest?
In Bezug auf Stapelvariablen (auf Prozedurebene) zeigen meine Tests, dass unitialisierte Boolesche Werte wahr sind, unitialisierte Ganzzahlen 2129993264 und nichtinialisierte Objekte nur ungültige Zeiger (d. H. Nicht null). Ich vermute, die Norm ist es, immer Variablen auf Prozedurebene zu setzen, bevor Sie darauf zugreifen?
Ja, dies ist das dokumentierte Verhalten:
Objektfelder werden immer mit 0, 0.0, '', False, nil oder wie auch immer initialisiert.
Globale Variablen werden immer auch mit 0 usw. initialisiert.
Lokale referenzzählende * Variablen werden immer mit Null oder '' initialisiert.
Lokale nicht referenzierte * Variablen sind nicht initialisiert, daher müssen Sie einen Wert zuweisen, bevor Sie sie verwenden können.
Ich erinnere mich, dass Barry Kelly irgendwo eine Definition für "referenziert" geschrieben hat, diese aber nicht mehr finden kann, also sollte dies in der Zwischenzeit so sein:
referenziert == die selbst referenziert sind oder direkt oder indirekt Felder (für Datensätze) oder Elemente (für Arrays) enthalten, die referenziert sind wie:
string, variant, interface
oder dynamisches Array oder statisches Array , das solche Typen enthält.
Anmerkungen:
record
selbst reicht nicht aus, um als Referenz gezählt zu werdenGlobale Variablen ohne expliziten Initialisierer werden im BSS-Abschnitt der ausführbaren Datei zugewiesen. Sie belegen keinen Platz in der EXE-Datei. Der BSS-Abschnitt ist ein spezieller Abschnitt, den das Betriebssystem zuordnet und auf Null setzt. Auf anderen Betriebssystemen gibt es ähnliche Mechanismen.
Sie können sich darauf verlassen, dass globale Variablen mit Null initialisiert werden.
Klassenfelder sind standardmäßig Null. Dies ist dokumentiert, damit Sie sich darauf verlassen können. Lokale Stapelvariablen sind nicht definiert, es sei denn, Zeichenfolge oder Schnittstelle sind auf Null gesetzt.
Nur als Randnotiz (wie Sie neu in Delphi sind): Globale Variablen können direkt beim Deklarieren initialisiert werden:
var myGlobal:integer=99;
Hier ist ein Zitat von Ray Lischners Delphi in Kürze Kapitel 2
"Wenn Delphi zum ersten Mal ein Objekt erstellt, beginnen alle Felder leer, dh Zeiger werden auf Null initialisiert, Zeichenfolgen und dynamische Arrays sind leer, Zahlen haben den Wert Null, Boolesche Felder sind Falsch und Varianten werden auf Nicht zugewiesen gesetzt. (Weitere Informationen finden Sie unter NewInstance und InitInstance in Kapitel 5.)
Es ist wahr, dass lokale Variablen initialisiert werden müssen ... Ich würde den obigen Kommentar, dass "Globale Variablen initialisiert werden", als zweifelhaft betrachten, bis sie mit einer Referenz versehen werden - das glaube ich nicht.
edit ... Barry Kelly sagt, dass man sich darauf verlassen kann, dass sie auf Null gesetzt werden, und da er im Delphi-Compiler-Team ist, glaube ich, dass das stimmt :) Danke Barry.
Globale Variablen und Objektinstanzdaten (Felder) werden immer auf Null initialisiert. Lokale Variablen in Prozeduren und Methoden werden in Win32 Delphi nicht initialisiert. Ihr Inhalt ist undefiniert, bis Sie ihnen einen Wert im Code zuweisen.
In der Delphi 2007-Hilfedatei:
ms-help: //borland.bds5/devcommon/variables_xml.html
"Wenn Sie eine globale Variable nicht explizit initialisieren, initialisiert der Compiler sie auf 0."
Selbst wenn eine Sprache Standardinitialisierungen bietet, sollten Sie sich meiner Meinung nach nicht darauf verlassen. Das Initialisieren auf einen Wert macht es anderen Entwicklern, die möglicherweise nichts über Standardinitialisierungen in der Sprache wissen, klarer und verhindert Probleme zwischen Compilern.
Ich habe eine kleine Beschwerde mit den gegebenen Antworten. Delphi löscht den Speicherplatz der Globals und der neu erstellten Objekte. Während dies NORMALERWEISE bedeutet, dass sie initialisiert werden, gibt es einen Fall, in dem dies nicht der Fall ist: Aufzählungstypen mit bestimmten Werten. Was ist, wenn Null kein legaler Wert ist?