5.3.2 初始化记录
将记录类型(或记录实例)的变量定义为全局变量时,其字段将被初始化;但在堆栈上定义变量(作为函数或过程的局部变量)时,其字段不会被初始化。因此,如果你编写了这样的代码(是 RecordMethods 示例的一部分):
var
MyRec: TMyRecord;
begin
Show(MyRec.ToString);
它的输出或多或少会是随机的。当字符串被初始化为空字符串时,记录的字符字段和整数字段将包含给定内存位置上的数据(就像堆栈上的字符或整数变量一样)。一般来说,根据实际的编译或执行情况,你会得到不同的输出结果,例如:
[]: 1637580
这就是为什么在使用记录(和大多数其他变量一样)之前必须对其进行初始化,以避免读取不合逻辑数据的风险,这甚至有可能导致应用程序崩溃。处理这种情况有两种截然不同的方法。第一种是为记录使用构造函数,这将在下一节中介绍。第二种是使用托管记录,这是 Delphi 10.4 中的一项新功能,我将在本章后面介绍。
5.3.3 记录与构造函数
让我们从常规构造函数开始。记录支持一种称为构造函数的特殊方法,可以用来初始化记录数据。与其他方法不同的是,构造函数也可以应用于记录类型以定义新实例(但仍可应用于现有实例)。下面是为记录添加构造函数的方法:
type
TMyNewRecord = record
public
constructor Create(NewString: string);
function ToString: string;
构造函数是一个有代码的方法:
constructor TMyNewRecord.Create(NewString: string);
begin
Name := NewString;
Init(0);
end;
现在,您可以使用以下两种编码方式之一来初始化记录:
var
MyRec, MyRec2: TMyNewRecord;
begin
MyRec := TMyNewRecord.Create('Myself');
MyRec2.Create('Myself');
请注意,记录构造函数必须要有参数:如果尝试声明只有Create,则会收到错误消息“在记录类型上不允许无参数的构造函数”。
注解: 您可以使用多个重载的 Create 构造函数或多个名称不同的构造函数。我将在讨论类的构造函数时详细介绍这一点。正如我们将很快看到的,托管记录使用不同的语法,不引入无参数构造函数,而是引入Initialize类方法。