Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [return: unsafe] mit generischen Interfaces (https://www.delphipraxis.net/210993-%5Breturn-unsafe%5D-mit-generischen-interfaces.html)

archimedix 11. Jul 2022 16:27

Delphi-Version: 10.4 Sydney

[return: unsafe] mit generischen Interfaces
 
Hallo zusammen,

unsafe-return scheint mit generischen Interfaces nicht zu funktionieren... Ein Compiler-Bug, oder?
Code:
type
  IFoo<T> = interface
  ['{4D9F70B1-D511-463D-ADCE-13FA342422AF}']
  end;

  IBar = interface
  ['{C38B6CCE-55A9-4424-B450-FF555098CE58}']
    [Result: unsafe] function GetFoo: IFoo<Integer>;  // --> [dcc32 Fehler] Unit3.pas(32): E2585 Das Attribut 'unsafe' ist nur für Funktionen zulässig, die eine Klasse oder ein Interface zurückgeben: GetFoo
  end;

  IBar<T> = interface
  ['{C38B6CCE-55A9-4424-B450-FF555098CE58}']
    [Result: unsafe] function GetFoo: IFoo<T>;             // --> [dcc32 Fehler] Unit3.pas(42): E2585 Das Attribut 'unsafe' ist nur für Funktionen zulässig, die eine Klasse oder ein Interface zurückgeben: GetFoo
  end;

himitsu 11. Jul 2022 17:07

AW: [return: unsafe] mit generischen Interfaces
 
Ich würde eher empfehlen die Referenzzählung des Interfaces zu verändern (in _AddRef/_Release abzuschalten), anstatt nachträglich an der Verwaltung der Variablen/Funktionsergebnisse rumzupfuschen.
(es heißt nicht umsonst "It is considered dangerous and its use is not recommended")


Außerdem ist bei Verwendung von Generics an Interfaces es zu bevorzugen die GUIDs nicht hart im Generic zu hinterlegen, sondern erst in den nichtgenerischen Nachfahren anzugeben,
denn IFoo<Integer> und IFoo<string> haben die selbe GUID und diese UID soll ja eigentlich "eindeutig" sein, was sie hier aber nicht ist.

archimedix 11. Jul 2022 17:33

AW: [return: unsafe] mit generischen Interfaces
 
Naja, das beantwortet die Frage noch nicht so ganz...

Außerdem:
Die Aufrufe zur Referenzzählung werden immer einkompiliert. Egal, wie das innen drin implementiert ist.
Und die Aufrufe (_AddRef, _Release, außerdem CopyIntf beim Zuweisen und alles mit impliziten try-finally-Blöcken geschützt) sind es, die es langsam machen.


Und:
Nicht-generische Nachfahren machen hier ja wenig Sinn. Dann würde man TFoo<T> und TBar<T> nicht in der o.g. Weise zusammen verwenden können.

freimatz 12. Jul 2022 07:49

AW: [return: unsafe] mit generischen Interfaces
 
Zur Frage "Ein Compiler-Bug, oder?":

"An Unsafe reference is an interface reference that does not increase the reference count of the object they refer to. It is marked with the [unsafe] modifier."
Man könnte das so lesen, dass "an" und "the" Einzahl ist, eine generische Klasse aber nicht unbedingt Einzahl ist. Also kein Compiler Bug sondern es geht halt nicht.

Der schöne Günther 12. Jul 2022 08:23

AW: [return: unsafe] mit generischen Interfaces
 
Also wenn es um Performance-Optimierungen geht indem man sich die virtuellen Aufrufe für _AddRef() und _Release() sparen will, weshalb dann nicht einfach eine TObject-Basisklasse? Dann sieht jeder direkt was Sache ist.

archimedix 12. Jul 2022 19:37

AW: [return: unsafe] mit generischen Interfaces
 
Hab's mal bei Embarcadero als Bug eingestellt und behelfe mit solange mit einem Interface-Pointer statt der Unsafe-Referenz.


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