![]() |
Typcasting Delphi
Hallo Delphianer,
ich wollte nur mal von euch wissen, ob folgende zwei Codebeispiele irgendein Unterschied für den Compiler oder das Programm darstellen:
Delphi-Quellcode:
procedure TMyForm.ComponentClick(Sender: TObject);
begin if Sender is TButton then begin ShowMessage((Sender as TButton).Caption); end; if Sender is TEdit then begin ShowMessage((Sender as TEdit).Text); end; end;
Delphi-Quellcode:
Viele Grüße
procedure TMyForm.ComponentClick(Sender: TObject);
begin if Sender is TButton then begin ShowMessage(TButton(Sender).Caption); end; if Sender is TEdit then begin ShowMessage(TEdit(Sender).Text); end; end; Alex |
AW: Typcasting Delphi
Die zweite Version ist etwas schneller das hier ein harter Cast (ohne Typprüfung) erfolgt.
Im ersten Fall erfolgt eine Typprüfung und es wird eine Exception geschmissen wenn nicht erfolgreich. Da du aber mit is abprüfst passiert hier nix. |
AW: Typcasting Delphi
Hallo Bernhard,
heißt also, wenn ich die zweite Variante nehme, sollte ich das "is" vorher abfragen. Nehme ich die erste Variante, kann ich mir das "is" sparen, weil dies im "as" mit geschieht, richtig? Viele Grüße Alex |
AW: Typcasting Delphi
Nein so ist das nicht.
Bei einem reinen HardCast wird keine Exception geworfen, erst wenn ein Zugriff erfolgt.
Delphi-Quellcode:
Bei einem SoftCast erfolgt die Exception direkt beim Casten.
var
LEdit : TEdit; begin Instance := TObject.Create; ... LEdit := TEdit( Instance ); ... LEdit.Text := 'foo'; // hier Exception ... end;
Delphi-Quellcode:
Will man eine Exception vermeiden, dann muss immer vor dem Casten mit
var
LEdit : TEdit; begin Instance := TObject.Create; ... LEdit := Instance as TEdit; // hier Exception ... LEdit.Text := 'foo'; ... end;
Delphi-Quellcode:
geprüft werden.
is
|
AW: Typcasting Delphi
Zitat:
Die prüfung mit is ist immer nötig. Du kannst dir aber das as sparen wenn es sich um einen Zeitkritischen Zweig handelt (der Mio-Fach pro Sekunde aufgerufen wird). Ansonsten ist die schönere. |
AW: Typcasting Delphi
Das "is" kann man aber auch in eine assertion packen, wenn man "eigentlich" genau weiß, dass sender immer ein Button ist. So kann man den Test dann im Release rausnehmen.
@rufo: Deine Exception bei der Zuweisung von .Text muss aber nicht kommen. |
AW: Typcasting Delphi
Zitat:
![]() |
AW: Typcasting Delphi
Wichtig ist bei AS aber auch(wenn ich meine letzten erfahrungen nicht gerade durch den Wind werfe):
Wenn du mit packages arbeitest, Dein programm PackageA läd, und dort drin aus irgendeinem grund ein objekt erzeugt wird, dass an das hauptprogramm weitergeleitet wird, kann es beim überprüfen mit AS zu inkompatibilität kommen, wenn die klasse von der die instanz erstellt wurde(i.e. TMyCustomClass) sowohl ins Hauptprogramm als auch in das Package jeweils direkt reinkompiliert wird. Die muss dann mitunter auch noch in ein Package auf das gelinkt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz