那么,什么将是初始化记录的首选方法是什么?
以“出厂功能”:
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;
我更喜欢“工厂法”之类
function TMyRecord.CreateRec(const AValueX, AValueY: integer): TMyRecord;
独立的工厂函数泄漏incapsulation和记录构造搞乱恕我直言。
在我创建一个Delphi项目中,我使用的记录,而不是类,以减少名单上开销的金额。 我将有几百记录在一个动态数组,所以我创造了两个纪录。 第一个纪录是项目本身。 该领域作了私有(是的,你可以使用私有/与记录保护),并添加只读属性的公共部分。 还添加了额外的构造函数初始化该记录以正确的方式。 这种设置让我来保护内容从其他开发商的这一纪录。 所述第二记录是就在先前的记录类型的动态数组的包装。 该阵列是私人和我说的方法来获得,在此列表中添加和删除记录。 其结果是,整个列表将与误用其他开发人员的保护,还具有比常规从TList / TObjectList解决方案的开销少了很多。
请记住,记录不类。 你不能继承构造函数等方法。 他们不是在WIN32环境一样类较少的功能。 在.NET中,他们刚刚升入班一次。 而且它不是非常有用的使用添加一个构造函数,当开发商在你的记录可以很容易地修改每一个的各个领域的内容和。 您应该使用构造来保护这些字段来代替。
我通常不创造记录的构造函数。 这并不适用于所有版本(和FPC)兼容。 而且通常他们只用在一个地方,往往一个fillchar就足够了。