Ich versuche, eine generische gecached Eigenschaftenaccessor wie folgt zu schreiben, aber einen Compiler-Fehler bin immer wenn, ob die Speichergröße einen Wert enthält bereits zu überprüfen versuchen:Wie teste ich eine generische Typvariable für Gleichheit mit Default (T) in Delphi?
function TMyClass.GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
begin
if ADataValue = Default(T) then // <-- compiler error on this line
ADataValue := ARetriever();
Result := ADataValue;
end;
Der Fehler Ich erhalte ist " E2015 Operator nicht anwendbar auf diesen Operandentyp ".
Muss ich eine Einschränkung auf T
setzen, damit dies funktioniert? Die Hilfedatei sagt, dass Default()
alles außer generische Typen akzeptieren würde. In meinem Fall habe ich es hauptsächlich mit einfachen Typen wie String
, Integer
und TDateTime
zu tun.
Oder gibt es eine andere Bibliotheksfunktion, um diese spezielle Prüfung durchzuführen?
Ich benutze Delphi 2009, falls das wichtig ist.
PS: Nur für den Fall ist es aus dem Code nicht klar, was ich zu tun werde versuchen: In meinem Fall der tatsächlichen Eigenschaftswerte bestimmen, könnte eine Weile aus verschiedenen Gründen nehmen und manchmal könnte ich nicht einmal brauchen sie überhaupt. Auf der positiven Seite jedoch sind die Werte konstant, so dass ich nur den Code aufrufen möchte, der den tatsächlichen Wert beim ersten Zugriff auf die Eigenschaft bestimmt, und dann den Wert in einem Klassenfeld speichern und beim nächsten Zugriff auf die Eigenschaft den zwischengespeicherten Wert zurückgeben direkt. Hier ist ein Beispiel dafür, wie ich hoffte, ich wäre in der Lage diesen Code zu verwenden:
type
TMyClass = class
private
FSomeProp: String;
function GetSomeProp: String;
function GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
public
property SomeProp read GetSomeProp;
end;
function GetSomeProp: String;
begin
Result := GetProp<String>(FSomeProp,
function: String
begin
Result := SomeSlowOrExpensiveCalculation;
end);
end;
(natürlich gibt es mehr als nur eine Eigenschaft)
+1 nette Idee übrigens. – jpfollenius
Sie sollten wahrscheinlich einen NULL-fähigen Typ verwenden, da andernfalls der Code ständig Eigenschaften neu bewertet, die bereits zwischengespeichert sind, aber den Standardwert haben. Siehe zum Beispiel http://blogs.embarcadero.com/abauer/2008/09/18/38869 – mghie
@mghie: Guter Punkt und normalerweise würde ich zustimmen, aber in diesem speziellen Fall kann der Standardwert sicher immer als "nicht initialisiert" interpretiert werden . –