che sto cercando di scrivere un generico di accesso di proprietà nella cache come il seguente, ma sto ottenendo un errore di compilazione quando si cerca di verificare se la variabile di archiviazione contiene già un valore:Come si verifica una variabile di tipo generico per l'uguaglianza con 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;
L'errore che sto ottenendo è " E2015 Operatore non applicabile a questo tipo di operando ".
Dovrei mettere un vincolo su T
per farlo funzionare? Il file della guida dice che Default()
accetta qualsiasi cosa tranne i tipi generici. Nel mio caso mi occupo principalmente di tipi semplici come String
, Integer
e TDateTime
.
Oppure c'è qualche altra funzione di libreria per eseguire questo controllo particolare?
Sto utilizzando Delphi 2009 nel caso che importi.
PS: Nel caso in cui non è chiaro dal codice quello che sto cercando di fare: Nel mio caso la determinazione dei valori delle proprietà attuali potrebbe richiedere del tempo per vari motivi e qualche volta non potrebbe nemmeno bisogno loro affatto. D'altro canto, i valori sono costanti, quindi desidero solo chiamare il codice che determina il valore effettivo la prima volta che accede a questa proprietà e quindi archiviare il valore in un campo classe e al successivo accesso a questa proprietà restituisce il valore memorizzato nella cache direttamente. Ecco un esempio di come speravo di essere in grado di utilizzare quel codice:
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;
(ovviamente, c'è più di una sola proprietà)
+1 bella idea a proposito. – jpfollenius
Probabilmente dovresti usare un tipo nullable, altrimenti il codice rivaluterebbe costantemente le proprietà già memorizzate nella cache ma con il valore predefinito. Vedi per esempio http://blogs.embarcadero.com/abauer/2008/09/18/38869 – mghie
@mghie: buon punto e in genere sarei d'accordo ma in questo caso particolare il valore predefinito può essere sempre interpretato come "non inizializzato" . –