Naja, primär hatte ich IsObject() entwickelt weil es sicherer als der Operator
is ist. Wird
is auf ein falsches Objekt angewendet dann ist garantiert das es AVs hagelt. IsObject() macht nun eigentlich das was ich vom
is Operator erwartet hätte, es erzeugt keine AVs sondern kehrt in diesem Falle mit FALSE zurück.
Man muß sich mal die Verwendung vom
is Operator vergegenwärtigen:
Delphi-Quellcode:
if Variable is TMyClass then
aus meiner Sicht darf in einem solchen Konstrukt KEINE
Exception ausgelösst werden. IsObject() ist also als "safer Replacement" vom
is Operator gedacht.
Ein Programmierer der also sowas wie oben abfragen möchte interessiert sich primär nur für EINE Sache, nämlich "ist in Variable ein Objekt der Klasse TMyClass ?" und nicht "ist in Variable ein Objekt von TMyClass ? oder wenn es garkein gültiges Objekt ist dann erzeuge mit Pi*Daumen Wahrscheinlichkeit eine
Exception".
Das eine ist eine EINDEUTIGE Frage im Source, das andere ist eine mehrdeutige ANTWORT mit dem Seiteneffekt einer dritten ungewollten Programmverzweigung per
Exception.
IsObject() korregiert nun dieses unsaubere Verhalten. Klar, man kann sich darüber streiten was nun die Ursachen sind, diese sind mir aber im wahrsten Sinne Wurst, mich interessiert nur die Zielsetzung. Ergo: muss ich immer davon ausgehen das ich aufbauend auf schlechteren Source meine Ziele erreichen muß, ist einfach mal aus praktischen Erwägungen heraus so notwendig.
Denn wie sähe die korrekte Alternative denn aus ?
Delphi-Quellcode:
var
Korrekt: Boolean;
begin
try
Korrekt := Variable is TMyClass;
except
Korrekt := False;
end;
if Korrekt then ;
end;
also ziemlich unübersichtlich und aufwändig, denn daswäre bei jeder
is Abfrage notwendig. Im Grunde macht IsObject() nur sowas wie oben, halt mit einigen kleineren zusätzlichen Verbeserungen.
Gruß Hagen