我在delphi中创建了一个类。看起来像这样
TGoJsNode = class(TPersistent)
private
_id: Integer;
Key: Integer;
Text: String;
constructor Create;
end;
我需要检查何时有效地创建了此类(使用了构造函数)。例如,当我这样做时:
var
x: TGoJsNode;
begin
if Assigned(x) then
// Will return True
showmessage('created');
if x = nil then
// Will also return True
showmessage('created');
end;
这两个测试都将得出true,而实际上我没有创建x。我认为x仅应在创建测试时在指定的测试中得出true,就像这样:
procedure TForm1.Button18Click(Sender: TObject);
var
x: TGoJsNode;
begin
x := TGoJsNode.Create;
end;
我观察到的另一件事很奇怪,那就是私有数字变量具有随机值,而字符串one为空。所有类都在同一个Unit文件中。有任何想法吗?
答案 0 :(得分:4)
一切都按设计和预期进行。问题在于您的期望基于错误的理解。
非托管局部变量是未初始化的,因此它们的值是不确定的,直到它们被显式初始化为止。因此,变量x
在初始化之前可以具有任何值。
Assigned()
函数测试指针变量是否为nil
。在初始化变量之前,Assigned()
返回的值是不确定的。有关Assigned()
的更广泛讨论,请参见answer。
不初始化局部变量的规则的一个例外是托管类型。它们总是被初始化。字符串是托管类型,这说明了为什么您看到它们始终为空。数字类型不受管理,因此不会自动初始化。
其他托管类型包括移动平台上的动态数组,接口,变量,匿名方法和ARC类。此外,包含托管类型(例如记录和数组)的结构化类型本身也将变为托管类型。
另一个细微差别是全局变量和类成员是默认初始化的。只有局部变量可能未初始化。