Frage

Dieser Code in einer GUI-Anwendung kompiliert und ausgeführt:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self := TForm1.Create(Owner);
end;

(getestet mit Delphi 6 und 2009)

  • Warum ist Selbst beschreibbar und nicht schreibgeschützt ist?
  • in welchen Situationen könnte dies nützlich sein?

Edit:

  • ist dies auch möglich in Delphi Prism? (Ich glaube, ja es ist, finden Sie unter hier )

Update: Delphi-Anwendungen / Bibliotheken, die Verwendung von Selbstzuweisung machen:

War es hilfreich?

Lösung

Das ist nicht so schlimm, wie es sein könnte. Getestet habe ich es nur in Delphi 2009, und es würde das scheint, während der Selbst Parameter nicht verwenden const Semantik, die Sie scheinen zu implizieren soll, ist es auch nicht verwenden var Semantik, so dass Sie es alles, was Sie wollen in Ihrem Verfahren ändern können, ohne die Referenz tatsächlich zu verlieren die Anrufer in Ihr Objekt enthält. Das wäre eine sehr schlechte Sache sein.

Wie aus dem Grund, warum eine von zwei Antworten. Entweder eine einfache Kontrolle, oder was Marco vorgeschlagen:., Damit Sie Selbst zu einem var Parameter zu übergeben

Andere Tipps

Vielleicht vorbei zu konst oder var-Parameter zu erlauben?

Es könnte ein Artefakt sein, da System selbst auf der linken Seite haben nicht überall aus:. = Zeichen

Selbst Zuordnung ist so unlogisch und sinnlos, dass dieses ‚Feature‘ ist wahrscheinlich ein Versehen. Und wie bei belegbaren Konstanten, es ist nicht immer einfach, solche Probleme zu beheben.

Die einfache Beratung hier ist: tut es nicht.

In Wirklichkeit „Selbst“ ist nur ein Name Verweis auf einen Platz auf dem Stack, die Adresse speichern zeigt auf der Halde zu widersprechen. Nur-Lese-Forcing auf dieser Variable ist möglich, offenbar die Designer entschieden, nicht zu. Ich glaube, die Entscheidung ist willkürlich.

Kann keinen Fall sehen wo dies sinnvoll ist, dass würde nur einen Wert im Stapel ändern. Auch können Sie diesen Wert ändern gefährlich sein, da es keine Garantie dafür gibt, dass das Verhalten des Codes, die Instanz des Mitglieds Referenz wird Konsistenz über Compiler-Versionen.

Aktualisiert: Als Reaktion Kommentar PatrickvL

  

Die ‚Variable‘ „Selbst“ ist nicht auf die   Stapel (meines Wissens ist es nie);   Stattdessen wird der Wert in einem setzen   registrieren (EAX um genau zu sein), kurz bevor   ein Anruf zu irgendein Objektmethode hergestellt wird. -

Nein, hat Selbst tatsächliche Adresse auf dem Speicher. Versuchen Sie diesen Code für sich selbst zu sehen.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Integer(@Self)));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  newform: TForm;
  p: ^Integer;
begin
  Self.Caption := 'TheOriginal';
  newform := TForm.Create(nil);
  try
    newform.Caption := 'TheNewOne';
    // The following two lines is, technically, the same as
    //   Self := newform;
    p := Pointer(@Self);
    p^ := Integer(newform);
    ShowMessage(Self.Caption);  // This will show 'TheNewOne' instead of 'TheOriginal'
  finally
    Self.Free; // Relax, this will free TheNewOne rather than TheOriginal
  end;
end;

Manchmal, wenn Sie so weit, ein Verfahren optimieren möchten, wie Sie es (ohne Montage zugreifen) annehmen kann, ‚Self‘ kann (ab) sein als ‚frei‘ Variable verwendet - es könnte nur bedeuten, den Unterschied zwischen mit Stapel und mit Registern.

Sicher, der Inhalt des Stapels ist höchstwahrscheinlich bereits in der CPU-Cache, so dass es für den Zugriff schnell sein sollte, aber Register sind sogar noch schneller.

Als Nebenbemerkung: Ich bin immer noch die Tage fehlen, wenn ich auf dem Motorola Amiga programmiert wurde 68000 und hatte den Luxus von 16 Daten und 16 Adressregistern .... Ich kann nicht glauben, dass die Welt mit dem Thema gewählt begrenzt 4 Register des 80x86-Prozessoren!

Und als abschließende Bemerkung, wähle ich Selbst manchmal zu verwenden, da die Delphi-Optimierer ist, na ja, nicht Optimierung , dass gut, eigentlich. (Zumindest, verblasst es im Vergleich zu dem, was Tricks man in dem verschiedenen LLVM Optimizern zum Beispiel finden.) IMHO, und YMMV natürlich.

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