Frage

Ich bin neu in Delphi, und ich habe einige Tests wurde ausgeführt, um zu sehen, welche Objektvariablen und Stack-Variablen standardmäßig initialisiert werden:

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 aus anderen Sprachen gewohnt bin, aber ich frage mich, wenn es darauf verlassen in Delphi sicher ist? Zum Beispiel frage ich mich, wenn es auf einer Compiler-Einstellung abhängen könnte, oder vielleicht anders funktioniert auf verschiedene Maschinen. Ist es normal, Objekte auf Standard-initialisierten Werte zu verlassen, oder haben Sie explizit alle Instanzvariablen im Konstruktor gesetzt?

Wie für Stapel (Prozedur-Ebene) Variablen, meine Tests zeigen, daß unitialized booleans wahr sind, sind unitialized ganze Zahlen 2129993264 und uninialized Objekte sind nur ungültige Zeiger (das heißt nicht null). Ich bin die Norm zu raten ist, immer auf Prozedurebene Variablen setzen, bevor sie zugreifen?

War es hilfreich?

Lösung

Ja, das ist das dokumentierte Verhalten:

  • Objektfelder werden immer initialisiert auf 0, 0,0, '', Falsch, null oder was auch immer gilt.

  • Globale Variablen auf 0 immer initialisiert werden usw. als auch,

  • Lokale mit Referenzzählung * Variablen werden immer auf Null initialisiert oder '';

  • Lokale nicht mit Referenzzählung * Variablen nicht initialisiert werden, so dass Sie einen Wert zuweisen, bevor Sie sie verwenden können.

Ich erinnere mich, dass Barry Kelly irgendwo eine Definition für „Referenzzählung“ geschrieben, aber kann es nicht finden jede mehr, so sollte dies in der Zwischenzeit tun:

  

Referenzzählung ==, die mit Referenzzählung selbst sind, oder   direkt oder indirekt enthalten Felder (für Datensätze) oder Elemente (für   arrays), die mit Referenzzählung sind wie: string, variant, interface   oder dynamisches Array oder statisches Array , die solche Typen.

Weitere Informationen:

  • record selbst ist nicht genug, um mit Referenzzählung
  • zu werden
  • Ich habe nicht versucht, dies mit Generika noch

Andere Tipps

Globale Variablen, die in dem BSS Abschnitt in der ausführbaren Datei zugeordnet keine expliziten initializer haben werden. Sie nehmen keinen Platz in der EXE-Datei nicht wirklich nach oben; der BSS Abschnitt ist ein spezieller Abschnitt, dass die OS zuordnet und löscht auf Null. Auf anderen Betriebssystemen gibt es ähnliche Mechanismen.

Sie können auf globale Variablen abhängig sein Null initialisiert.

Klasse Felder sind standardmäßig Null. Dies wird dokumentiert, so dass Sie sich darauf verlassen können. Lokale Stapel varaiables ist nicht definiert, es sei denn String oder Schnittstelle, diese auf Null gesetzt werden.

Nur als Randnotiz (wie Sie neu in Delphi): Globale Variablen direkt initialisiert werden können, wenn sie zu deklarieren:

var myGlobal:integer=99;

Hier ist ein Zitat von Ray Lischners Delphi in Kürze Kapitel 2

  

"Wenn Delphi zunächst ein Objekt erstellt, alle Felder leer ausgehen, das heißt, Zeiger initialisiert werden auf Null, Strings und dynamische Arrays leer sind, haben Zahlen den Wert Null, Boolean Felder sind falsch, und Varianten sind so eingestellt zu nicht zugeordnet. (Siehe NewInstance und InitInstance in Kapitel 5 für weitere Einzelheiten.) "

Es ist wahr, dass die lokalen-in-scope Variablen initialisiert werden muß ... ich oben, dass der Kommentar behandeln würde als fragwürdig „Globale Variablen werden initialisiert“, bis mit einer Referenz zur Verfügung gestellt - ich glaube das nicht.

bearbeiten ... Barry Kelly sagt können Sie hängen von ihnen zu seinem Null initialisiert, und da er auf dem Delphi-Compiler-Team, das ich glaube, dass steht :) Vielen Dank Barry.

Globale Variablen und Objektinstanz Daten (Felder) werden immer auf Null initialisiert. Lokale Variablen in Verfahren und Methoden sind nicht in Win32 Delphi initialisiert; deren Inhalt ist nicht definiert, bis Sie sie einen Wert im Code zugewiesen werden.

Auch wenn ein Sprachangebot Standard Initialisierungen der Fall ist, glaube ich nicht, sollten Sie sich auf sie verlassen. macht es viel klarer an andere Entwickler auf einen Wert initialisiert wird, die Probleme über Compiler möglicherweise nicht über Standard-Initialisierungen in der Sprache kennen und verhindert.

Von Delphi 2007-Hilfedatei:

ms-help: //borland.bds5/devcommon/variables_xml.html

  

„Wenn Sie nicht explizit eine globale Variable initialisieren können, die Compiler initialisiert es auf 0.“

Ich habe ein wenig meckern mit den gegebenen Antworten. Delphi nullt den Speicherplatz der Globals und die neu erstellte Objekte. Während diese REGEL bedeutet, werden sie initialisiert es einen Fall, in dem sie nicht: Aufzählungstypen mit bestimmten Werten. Was passiert, wenn Null ist kein Recht Wert ??

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top