Delphi:记录构造函数vs工厂函数

Veg*_*gar 17 delphi constructor record

那么初始化记录的首选方式是什么?

具有'工厂功能':

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;
Run Code Online (Sandbox Code Playgroud)

或构造函数:

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;
Run Code Online (Sandbox Code Playgroud)

我觉得构造函数更加封装,但是在阅读代码时很容易让人感到困惑.它使它看起来像一个没有免费电话的类.打字也更多......

为什么你喜欢一个而不是另一个?

Too*_*the 11

我更喜欢课程,但如果我必须使用记录,我喜欢将它们视为尽可能类.所以我使用记录构造函数.

但是记录和单位存在令人讨厌的错误.如果函数返回记录(使用方法),如果要访问这些方法,则会产生内部错误.您可以通过将其分配给另一个变量来避免这种情况:

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;
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考您提到的内部错误问题似乎已在D2010中修复. (6认同)
  • 我也使用记录构造函数.如果您愿意,可以将其命名为"创建",因此您知道它是一个记录. (4认同)