那么初始化记录的首选方式是什么?
使用“工厂功能”:
TMyRecord = record valueX: integer; valueY: integer; end; function MyRecord(const AValueX,AValueY: integer): TMyRecord; begin result.valueX := AValueX; result.valueY := AValueY; end; var myrec: TMyRecord; begin myrec := MyRecord(1,2); end;
或构造函数:
TMyRecord = record valueX: integer; valueY: integer; constructor Create(const AValueX,AValueY: integer); end; constructor TMyRecord.Create(const AValueX,AValueY: integer); begin self.valueX := AValueX; self.valueY := AValueY; end; var myrec: TMyRecord; begin myrec := TMyRecord.Create(1,2); end;
我觉得构造函数更加封装,但是在读代码时很容易让人困惑。它使它看起来像一个缺少免费电话的课程。还要更多输入…
你为什么要偏爱一个呢?
解决方法
我喜欢上课,但是如果我要使用记录,我喜欢把它们尽可能地类似于类。所以我使用记录构造函数。
但是有一个令人讨厌的记录和单位的错误。如果函数返回一个记录(使用方法),如果要访问这些方法,则会产生一个内部错误。您可以通过将其分配给另一个变量来规避这一点:
type TMyRec = record .. procedure X; end; function GetRec: TMyRec; procedure Test; var r1,r2 : TMyRec; begin r1 := GetRec; r1.X; // internal error r2 := r1; r2.X; // No internal error;