![]() |
Casts - is, as, Assert
Nachdem das Thema grad mal wieder
![]() Ein Cast mit "as" enthält ja eine Laufzeittypprüfung und löst bei Fehlschlag eine Exception aus. Ich hätte jetzt gern, dass die Typprüfung nur dann zuschlägt, wenn {$ASSERTIONS ON} sind. Momentan schreibe ich immer
Delphi-Quellcode:
, aber das ist auf Dauer ganz schön umständlich für eine Funktionalität, die ich oft benutze. Kennt jemand eine schönere Lösung? Quasi
Assert(Sender is TButton);
TButton(Sender).Caption := 'Blubb';
Delphi-Quellcode:
? :lol:
(Sender assert_as TButton).Caption := 'Blubb';
|
Re: Casts - is, as, Assert
Toll, schalltet man die Assertions ab, gibt es keine Prüfung mehr und es kommt womöglich zu undurchsichtigen Folgefehlern.
Fazit: - wenn du nicht sicherstellen kannst, daß dort ein passendes Objekt vorliegt, dann nutze (Sender as TButton).Caption - wenn du die Prüfung nur wärend der Programmierphase möchtest, dann stell halt dein Assert(Sender is TButton) davor |
Re: Casts - is, as, Assert
Ich mach es immer wie Astat vorgeschlagen:
Delphi-Quellcode:
if (Sender is TButton) then
showmessage((Sender as TButton).Name); |
Re: Casts - is, as, Assert
Dann könnte man auch einen harten Cast machen. Ich bevorzuge aber auch diese "doppelte" Methode
|
Re: Casts - is, as, Assert
Delphi-Quellcode:
ist vollkommen unnötig, denn wenn IS meinte es wäre OK, dann ist AS an dieser Stelle unnüzt, da es eh nie anschlagen kann.
if (Sender is TButton) then
showmessage((Sender as TButton).Name);
Delphi-Quellcode:
Dieses reicht also aus und ist sogar kürzer und, für mich zumindestens, "übersichtlicher".
if (Sender is TButton) then
showmessage(TButton(Sender).Name); PS: statt des Castes vor Ort nutze ich hier manchmal sogar "externe" Casts, in Form einer ABSOLUTE-Deklaration. |
Re: Casts - is, as, Assert
Zitat:
Zitat:
|
Re: Casts - is, as, Assert
Zitat:
hmmmm, sowas geht leider nicht, da man hierfür ja den Typ vom Check-Parameter als Result bräuchte.
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
Begin Assert(O is Check); Result := O; End;
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
Begin {$IFOPT C+} If Assigned(O) Then Raise EAssertionFailed.CreateFmt('Object $%.8x "%s" is not %s', [Integer(O), O.ClassName, Check.ClassName]) Else Raise EAssertionFailed.CreateFmt('Object (nil) is not %s', [Check.ClassName]); {$ENDIF} Result := O; End; Aber wieso Aufwand? Wenn du einmal ein Assert(Sender is TButton) an den Anfang der Prozedur stellt, dann brauchst du danach doch nichts mehr machen?
Delphi-Quellcode:
Dieses prüft nur wärend der Programmierpfase und mit aktiven Assertions.
Procedure X(Obj: TObject);
Var O: TButton absolute Obj: Begin Assert(Obj is TButton); ... O.Caption := 'ich bin ein Button'; ... End; Wobei ich es meißt eher so mach:
Delphi-Quellcode:
Procedure X(Obj: TObject);
Var O: TButton absolute Obj: Begin If Obj is TButton Then Begin ... O.Caption := 'ich bin ein Button'; ... End Else {mach was, wenn es kein Button ist}; End; |
Re: Casts - is, as, Assert
Mir ist das immer OK erschienen: Während der Entwicklungs- und Testphase prüft mein Ereignishandler, dass ihm auch wirklich nur Buttons reingereicht werden. Danach bin ich hinreichend davon überzeugt, dass meine Programmierung passt, und kan auf die Typprüfung verzichten.
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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 by Thomas Breitkreuz