Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Typumwandlung Unterschied (https://www.delphipraxis.net/202987-typumwandlung-unterschied.html)

Berni68 1. Jan 2020 12:40

Typumwandlung Unterschied
 
Hallo zusammen,

nach mehrjähriger Programmierabstinenz bin ich wieder nun wieder am Basteln...
Meine Delphikenntnisse sind allerdings etwas eingerostet:

Ist die Anweisung

Delphi-Quellcode:
DocStatus(iam as Document)


identisch zu

Delphi-Quellcode:
DocStatus(Document(iam))


oder gibt es da doch einen Unterschied?
Compilieren tut beides, scheint auch zu funktionieren, allerdings meine ich, daß da was war...


Ich wünsche weiterhin einen sonnigen Feiertag!

mensch72 1. Jan 2020 12:52

AW: Typumwandlung Unterschied
 
...gibt es da doch einen Unterschied? JA

Mit "DocStatus(iam as Document)" hast du den kleinen Vorteil, das der Compiler zusätzlich zur Laufzeit prüft, ob "iam" denn rein OO basiert zu "Document" werden kann.

Bei DocStatus(Document(iam)) könnte "iam" auch ein simpler "Integer" oder typloser "Pointer" sein, da bist du zur Laufzeit allein verantwortlich, das der doppelte HARTE cast auch gut geht.

Wenn man weiß was man tut, ist letzteres auch schneller. Nur wenn Mr/Mrs X an vorheriger Struktur/Position Y im Quelltext ändern, fliegt dir irgendwann irgendwo später dein harter "DocStatus" cast eh um dir Ohren, sicherheitstechnisch spielt der innere cast eh schon mit etwas Risiko(vor allem wenn du das ohne try... drumherum machst)

Berni68 1. Jan 2020 13:01

AW: Typumwandlung Unterschied
 
Super, danke für die Info!
:-D
Ich wusste doch daß da was war...
(kam allerdings nicht mehr drauf)

himitsu 1. Jan 2020 18:49

AW: Typumwandlung Unterschied
 
Delphi-Quellcode:
type(variable)
= static cast / feste bzw. harte Typkonvertierung

Delphi-Quellcode:
variable as type
= dynamic cast / dynamische bzw. weiche Typkonvertierung

Delphi-Quellcode:
variable is type
= Typprüfung ... arbeitet fast gleich wie AS,
außer dass AS ein NIL als leer erfoglreich konvertiert, während IS dieses als unterschiedlich abweißt.



Beim harten Cast wird direkt beim Kompilieren der Typ geändert. Hier tritt ein Fehler/Warnung nur im Compiler auf, aber zur Laufzeit passiert hier nichts mehr.
Es wird alles nahezu ungeprüft umgeschrieben, egal ob die Typen nicht zusammenpassen.
DU bist für alles Verantwortlich. Manchmal gibt der Compiler nur abschaltbare Warnungen, wenn er "Problemchen" erkennt.
Es gibt nur dann einen Fehler/Compilererabbruch, wenn die Größe des neuen Types größer ist, als der des Ursprungstyps (die Ausnahme stellen hier ordinale Typen wo der Compiler weiß wie er die neuen Bits auffüllen kann).


Die weichen Casts gibt es nur für Objekte (Klassentypen). Hier wird zur Laufzeit der tatsächliche Inhalt der Variable geprüft, ob es zusammenpasst und endet eventuell in einer Exception.
Info: Inzwischen funktioniert dieses auch für Interfaces. Dafür gibt es für Delphi-Objekte ein virtuelles Interface, über welches aus einem Interface vorher ein TObjekt rausgeholt und dann gecastet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 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