Since records offer methods and properties they are often used to replace objects. This is possible if there is no need to use inheritance.
But there is a significant difference between both. References to objects are like pointers to a piece of memory whereas records are a piece of memory.
This makes a significant difference if you are using functions that return objects and records. Let’s have a look at one example.
program TestObject; {$APPTYPE CONSOLE} {$R *.res} type TMyClass = class(TObject) strict private FNo: Integer; public property No: Integer read FNo write FNo; end; function Clone(const AClass: TMyClass): TMyClass; begin Result := AClass; Result.No := AClass.No + 1; end; var pClass: TMyClass; pClone: TMyClass; begin pClass := TMyClass.Create; try pClone := Clone(pClass); if pClone.No = pClass.No then Writeln('Clone hasn't cloned, it uses the same instance'); finally pClass.Free; end; end.
This is really simply. The clone function returns the reference itself. This means that it doesn’t clone, it uses the same instance!
Now, we will do the same with an record.
program TestRecord; {$APPTYPE CONSOLE} {$R *.res} type TMyRecord = record strict private FNo: Integer; public property No: Integer read FNo write FNo; end; function Clone(const ARecord: TMyRecord): TMyRecord; begin Result := ARecord; Result.No := ARecord.No + 1; end; var pRecord: TMyRecord; pClone: TMyRecord; begin pClone := Clone(pRecord); if pClone.No <> pRecord.No then Writeln('Clone has really cloned'); end.
Now you can see the differences.
- There is no need to create a record, the record is simply there.
- With point 1 there is no need to destroy the record.
- A function that returns a record automatically creates a new one.