Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Typcasting Delphi (https://www.delphipraxis.net/172448-typcasting-delphi.html)

Alex_ITA01 4. Jan 2013 13:28

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:
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;
Viele Grüße
Alex

Bernhard Geyer 4. Jan 2013 13:34

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.

Alex_ITA01 4. Jan 2013 13:45

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

Sir Rufo 4. Jan 2013 13:57

AW: Typcasting Delphi
 
Nein so ist das nicht.

Bei einem reinen HardCast wird keine Exception geworfen, erst wenn ein Zugriff erfolgt.
Delphi-Quellcode:
var
  LEdit : TEdit;
begin
  Instance := TObject.Create;
  ...
  LEdit := TEdit( Instance );
  ...
  LEdit.Text := 'foo'; // hier Exception
  ...
end;
Bei einem SoftCast erfolgt die Exception direkt beim Casten.
Delphi-Quellcode:
var
  LEdit : TEdit;
begin
  Instance := TObject.Create;
  ...
  LEdit := Instance as TEdit; // hier Exception
  ...
  LEdit.Text := 'foo';
  ...
end;
Will man eine Exception vermeiden, dann muss immer vor dem Casten mit
Delphi-Quellcode:
is
geprüft werden.

Bernhard Geyer 4. Jan 2013 13:57

AW: Typcasting Delphi
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1197624)
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?

Nein, nicht ganz.

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.

sirius 4. Jan 2013 16:05

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.

Furtbichler 4. Jan 2013 16:24

AW: Typcasting Delphi
 
Zitat:

Zitat von sirius (Beitrag 1197641)
@rufo: Deine Exception bei der Zuweisung von .Text muss aber nicht kommen.

Wollte ich auch gerade schreiben. So kann man sich die lustigsten Fehler generieren, speziell bei kleinen DTO. Methodenaufrufe laufen dagegen häufig gegen die Wand.

Memnarch 4. Jan 2013 18:45

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 18:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz