AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Typcasting Delphi

Ein Thema von Alex_ITA01 · begonnen am 4. Jan 2013 · letzter Beitrag vom 4. Jan 2013
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Typcasting Delphi

  Alt 4. Jan 2013, 14:28
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Typcasting Delphi

  Alt 4. Jan 2013, 14:34
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Typcasting Delphi

  Alt 4. Jan 2013, 14:45
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Typcasting Delphi

  Alt 4. Jan 2013, 14:57
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 is geprüft werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Typcasting Delphi

  Alt 4. Jan 2013, 14:57
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Typcasting Delphi

  Alt 4. Jan 2013, 17:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Typcasting Delphi

  Alt 4. Jan 2013, 17:24
@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.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#8

AW: Typcasting Delphi

  Alt 4. Jan 2013, 19:45
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.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 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