Tôi đang cố gắng để viết một accessor tài sản lưu trữ chung chung như sau nhưng đang nhận được một lỗi biên dịch khi cố gắng kiểm tra xem biến lưu trữ đã có chứa một giá trị:Làm cách nào để kiểm tra biến kiểu chung cho sự bình đẳng với Mặc định (T) trong 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;
Các lỗi tôi nhận được là " Toán tử E2015 không áp dụng cho loại toán hạng này ".
Tôi có phải đặt một ràng buộc trên T
để thực hiện công việc này không? Tệp trợ giúp cho biết rằng Default()
sẽ chấp nhận bất kỳ điều gì ngoại trừ các loại chung chung. Trong trường hợp của tôi, tôi chủ yếu giao dịch với các loại đơn giản như String
, Integer
và TDateTime
.
Hoặc có chức năng thư viện nào khác để thực hiện kiểm tra cụ thể này không?
Tôi đang sử dụng Delphi 2009 trong trường hợp có vấn đề.
PS: Chỉ trong trường hợp nó không phải là rõ ràng từ mã những gì tôi đang cố gắng để làm: Trong trường hợp của tôi xác định giá trị tài sản thực tế có thể mất một thời gian vì nhiều lý do và đôi khi tôi có thể thậm chí không cần tất cả. Tuy nhiên, tôi chỉ muốn gọi mã xác định giá trị thực khi lần đầu tiên thuộc tính được truy cập và sau đó lưu trữ giá trị trong trường lớp và lần tiếp theo thuộc tính được truy xuất trả về giá trị được lưu trong bộ nhớ cache trực tiếp. Dưới đây là một ví dụ về cách tôi hy vọng tôi sẽ có thể sử dụng mã rằng:
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;
(rõ ràng, có nhiều hơn chỉ là một tài sản)
+1 ý tưởng hay bằng cách này. – jpfollenius
Bạn có lẽ nên sử dụng một loại nullable, nếu không mã sẽ liên tục đánh giá lại các thuộc tính đã được lưu trữ nhưng có giá trị mặc định. Xem ví dụ http://blogs.embarcadero.com/abauer/2008/09/18/38869 – mghie
@mghie: Điểm tốt và thông thường tôi sẽ đồng ý nhưng trong trường hợp cụ thể này giá trị mặc định có thể được giải thích một cách an toàn là "chưa được khởi tạo" . –